My XML:
<List>
<Item name="B" name2="cyprus">
<ItemID value="ID_B"/>
<InnerList>
<InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
<Item name="B" name2="alele">
<ItemID value="ID_B"/>
<InnerList>
<InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
<Item name="A" name2="alele">
<ItemID value="ID_A"/>
<InnerList>
<InnerItem description="basic"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="algarve"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
</List>
Я хочу отсортировать по Item.name
, Item.name2
. Я также хочу отсортировать InnerItem
в InnerList
по атрибуту description
.
Желаемый результат:
<List>
<Item name="A" name2="alele">
<ItemID value="ID_A"/>
<InnerList>
<InnerItem description="algarve"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="basic"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
<Item name="B" name2="alele">
<ItemID value="ID_B"/>
<InnerList>
<InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
<Item name="B" name2="cyprus">
<ItemID value="ID_B"/>
<InnerList>
<InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
<InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
</InnerList>
</Item>
</List>
Мой XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="List">
<xsl:copy>
<xsl:apply-templates select="Item">
<xsl:sort select="@name"/>
<xsl:sort select="@name2"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Это делает закажите Item
правильно. Как мне go о сортировке InnerItem
?
Я мог бы добавить это for-each
:
<xsl:template match="List">
<xsl:for-each select="Item">
<xsl:for-each select="InnerList">
<xsl:for-each select="InnerItem">
<xsl:sort select="@description"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
, но потом я потерял свою структуру XML и получил:
<InnerItem description="c#">
<more_nested_data/>
</InnerItem><InnerItem description="porto">
<more_nested_data/>
</InnerItem><InnerItem description="c#">
<more_nested_data/>
</InnerItem><InnerItem description="porto">
<more_nested_data/>
</InnerItem><InnerItem description="algarve">
<more_nested_data/>
</InnerItem><InnerItem description="basic">
<more_nested_data/>
</InnerItem>
Любой намек, какой правильный подход приветствуется.