【发布时间】:2013-06-24 18:42:44
【问题描述】:
我有一个这样的输入文件
<items>
<item>
<id>5</id>
<name>Harry</name>
<age>18</age>
<color>blue</color>
</item>
<item>
<id>5</id>
<name>Harry</name>
<age>18</age>
<fav_food>pizza</fav_food>
</item>
<item>
<id>5</id>
<name>Harry</name>
<age>18</age>
<is_single>true</is_single>
</item>
</items>
我想对元素进行分组,使文件看起来像这样
<items>
<item>
<id>5</id>
<name>Harry</name>
<age>18</age>
<color>blue</color>
<fav_food>pizza</fav_food>
<is_single>true</is_single>
</item>
</items>
编辑 - 在此链接 (XSLT Consolidating data when ID is the same) 之后进行了 XSLT 转换,但这不会打印任何内容。
这是我的转换(使用 XSLT 2.0) -
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="items">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="item">
<xsl:apply-templates select="@*" />
<xsl:for-each-group select="item" group-by="id">
<item>
<id><xsl:value-of select="current-grouping-key()"/></id>
<xsl:apply-templates select="current-group()" />
</item>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="@*|node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
如果您使用的是 XSLT 2.0,则可以使用
for-each-group- 查看this question 的答案,这是一个类似的问题。 -
分组在 XSLT 1.0 和 2.0 中是如此不同,你真的需要说明你使用的是哪一个。
-
抱歉,我之前忘了说明这一点,我使用的是 XSLT 2.0,并且我用我现在拥有的 XSLT 转换更新了我的问题。
-
for-each-group应该在items的上下文中,而不是item- 它找不到任何东西。
标签: xml xslt xml-parsing xslt-2.0