【发布时间】:2021-07-22 10:20:06
【问题描述】:
我正在评估 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>
我已经尝试使用 Key 和 generate-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>
任何建议表示赞赏。
【问题讨论】:
-
请将您的 XSLT 添加到问题中。
-
添加了 XSLT,您能否查看一下并告诉我这里缺少什么?
-
请注意,XSLT 分组问题使用 XSLT 2.0+ 更容易。如果您受限于使用较旧的 XSLT 1.0 版本,请通过标记问题 xslt-10 来说明。