У меня есть входной файл, как этотЗастрял группировки в XSLT 2.0
<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>
EDIT - Сделал Преобразование XSLT по этой ссылке (XSLT Consolidating data when ID is the same), но это ничего не печатает.
Вот мой преобразование (с помощью 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, вы можете использовать 'для-каждого-group' - проверить ответ на [этот вопрос] (http://stackoverflow.com/q/11247326/1395993), что является аналогичной проблемой. –
Группировка настолько отличается в XSLT 1.0 и 2.0, что вам действительно нужно сказать, что вы используете. –
Извините, что я забыл указать это раньше, я использую XSLT 2.0, и я обновил свой вопрос с помощью преобразования XSLT, которое у меня есть сейчас. – Narabhut