我正在评估XSLT能否实现以下转换:
输入XML:
<ROOT>
<A>
<B>
<B1>Tech1</B1>
<B2>Tech2</B2>
<B3>Tech3</B3>
</B>
<C>Microsoft</C>
</A>
<A>
<B>
<B1>Tech11</B1>
<B2>Tech12</B2>
<B3>Tech13</B3>
</B>
<C>Microsoft</C>
</A>
<A>
<B>
<B1>Tech101</B1>
<B2>Tech102</B2>
<B3>Tech103</B3>
</B>
<C>Google</C>
</A>
<A>
<B>
<B1>Tech104</B1>
<B2>Tech105</B2>
<B3>Tech106</B3>
</B>
<C>Google</C>
</A>
<A>
<B>
<B1>Tech-1</B1>
<B2>Tech-2</B2>
<B3>Tech-3</B3>
</B>
<C>IBM</C>
</A>
</ROOT>预期产出:
<ROOT>
<Company>
<C>Microsoft</C>
<B>
<B1>Tech1</B1>
<B2>Tech2</B2>
<B3>Tech3</B3>
</B>
<B>
<B1>Tech11</B1>
<B2>Tech12</B2>
<B3>Tech13</B3>
</B>
</Company>
<Company>
<C>Google</C>
<B>
<B1>Tech101</B1>
<B2>Tech102</B2>
<B3>Tech103</B3>
</B>
<B>
<B1>Tech104</B1>
<B2>Tech105</B2>
<B3>Tech106</B3>
</B>
</Company>
<Company>
<C>IBM</C>
<B>
<B1>Tech-1</B1>
<B2>Tech-2</B2>
<B3>Tech-3</B3>
</B>
</Company>
</ROOT>我已经尝试使用这个键并生成-id(),尽管我不得不使用所有的子节点来获取输出。根据我的分析,我得到了下面的输出,但这并不是我所期望的,似乎我在这里遗漏了什么,
<ROOT>
<Company>
<C>Microsoft</C>
<B>
<B1>Tech1</B1>
<B2>Tech2</B2>
<B3>Tech3</B3>
</B>
</Company>
<Company>
<C>Google</C>
<B>
<B1>Tech101</B1>
<B2>Tech102</B2>
<B3>Tech103</B3>
</B>
</Company>
<Company>
<C>IBM</C>
<B>
<B1>Tech-1</B1>
<B2>Tech-2</B2>
<B3>Tech-3</B3>
</B>
</Company>
</ROOT>XSLT:
<xsl:key name="Company" match="A" use="C/text()" />
<xsl:for-each select="A[generate-id()=generate-id(key('Company',C/text()))] ">
<ROOT>
<Company>
<C><xsl:value-of select="C/text()"/></C>
<B>
<B1></B1>
<B2></B2>
<B3></B3>
</B>
</Company>
</ROOT>
</xsl:for-each>如有任何建议请见谅。
发布于 2021-07-22 10:58:41
门窗分组法 (您正在尝试在这里实现)有两个部分。
首先,为每个不同的值创建一个组--这个部分可以如下所示:
<xsl:for-each select="some-elem[generate-id() = generate-id(key('your-key', some-value)[1])]">然后为当前组的每个成员做一些事情--通常是:
<xsl:for-each select="key('your-key', some-value)">应用于您的示例,这将转换为:
XSLT1.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="Company" match="A" use="C" />
<xsl:template match="/ROOT">
<ROOT>
<xsl:for-each select="A[generate-id()=generate-id(key('Company',C))] ">
<Company>
<xsl:copy-of select="C"/>
<xsl:copy-of select="key('Company',C)/B"/>
</Company>
</xsl:for-each>
</ROOT>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/68483137
复制相似问题