我正在尝试使用XSLT按子元素值对XML文件进行排序。排序元素具有以下同级元素,应该始终位于其后。
到目前为止我已经完成的XSLT:
primitive interface methods
XML文件如下:
<xsl:template match="parent">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:copy-of select="*[not(self::city | self::cityNumber)]" />
<xsl:for-each select="city">
<xsl:sort select="text()" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
我希望输出:
<parent>
<name>Bob</name>
<name>Alice</name>
<another-attribute>something</another-attribute>
<city>B.111Kansas City</city>
<cityNumber>1</cityNumber>
<city>A.123Atlanta</city>
<cityNumber>2</cityNumber>
</parent>
谢谢!
答案 0 :(得分:1)
怎么样:
<xsl:template match="parent">
<xsl:copy>
<xsl:copy-of select="*[not(self::city or self::cityNumber)]" />
<xsl:for-each select="city">
<xsl:sort/>
<xsl:copy-of select=". | following-sibling::cityNumber[1]" />
</xsl:for-each>
</xsl:copy>
</xsl:template>
答案 1 :(得分:1)
如果您有多个cityNumber
,并且希望与city
元素一起排序,则可以使用<xsl:for-each-group select="city | cityNumber" group-starting-with="city">
并对组进行排序:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="parent">
<xsl:copy>
<xsl:apply-templates select="* except (city, cityNumber)"/>
<xsl:for-each-group select="city | cityNumber" group-starting-with="city">
<xsl:sort/>
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>