我正在尝试按组排序xml文档。我的样本xml如下:
<a>
<b sortKey="e"></b>
<b sortKey="b"></b>
<d sortKey="b"></d>
<d sortKey="a"></d>
<c></c>
</a>
我想分别对所有b
和所有d
进行排序。 b
和d
可能有不同的排序键。
我根据我在这里和其他地方看到的内容尝试了很多不同的选项,但是他们要么只给我排序的元素,要么给我排序的元素+剩下的元素。
这是我的一次尝试:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:choose>
<xsl:when test="*[local-name()='b']">
<xsl:apply-templates select="@* | node()">
<xsl:sort select="@sortKey" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="*[local-name()='d']">
<xsl:apply-templates select="@* | node()">
<xsl:sort select="@sortKey" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这个所有元素的属性为sortKey
,而不是b
和d
。
我是XSLT的菜鸟。所以任何帮助都非常感谢
ETA:我想要的xml就像这样
<a>
<b sortKey="b"></b>
<b sortKey="e"></b>
<d sortKey="a"></d>
<d sortKey="b"></d>
<c></c>
</a>
答案 0 :(得分:1)
这样的事情对你有用吗?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="b">
<xsl:sort select="@sortKey"/>
</xsl:apply-templates>
<xsl:apply-templates select="d">
<xsl:sort select="@sortKey"/>
</xsl:apply-templates>
<xsl:apply-templates select="*[not(self::b or self::d)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>