我有以下输入:
<articles>
<item name="B">
<item name="Bb">
<item name="Bbb"/>
<item name="Abb"/>
</item>
<item name="Ab">
<item name="Bab"/>
<item name="Aab"/>
</item>
</item>
<item name="A">
<item name="Ba">
<item name="Bba"/>
<item name="Aba"/>
</item>
<item name="Aa">
<item name="Baa"/>
<item name="Aaa"/>
</item>
</item>
<item name="D"/>
<item name="C">
<item name="Ac"/>
</item>
</articles>
并且需要以下输出:
A-Aa-Aaa
A-Aa-Baa
A-Ba-Aba
A-Ba-BBa
B-Ab-Aab
B-Ab-Bab
B-Bb-Abb
B-Bb-Bbb
C-Ac
D
也就是说,每条路径都应明确并在每个级别上进行排序。我有以下 XSLT,它产生路径,但除了第一级之外,我无法弄清楚排序。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="articles">
<xsl:apply-templates select="//item[not(item)]">
<xsl:sort select="ancestor-or-self::item[parent::articles]/@name"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="item">
<xsl:for-each select="ancestor-or-self::item">
<xsl:value-of select="@name"/>
<xsl:choose>
<xsl:when test="not(item)">
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>-</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
恐怕我目前的做法是死路一条。想法?