给定节点的顺序,我需要根据给定的顺序对XML的节点进行排序。输入是XML文件,输出是XML文件,其节点按照给定列表排序。
XML:
<root>
<M node="C" home="zzz"/>
<X name="A"/>
<Z/>
<Y test="B"/>
</root>
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pSortingValues" select="'Y,X,Z,M,N'"/>
<xsl:variable name="vSortingValues" select=
"concat(',', $pSortingValues, ',')"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort data-type="number" select=
"string-length(substring-before($vSortingValues,concat(',',name,',')))"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
收到的输出:
<root>
<M node="C" home="zzz"/>
<X name="A"/>
<Z/>
<Y test="B"/>
</root>
期望的输出:
<root>
<Y test="B"/>
<X name="A"/>
<Z/>
<M node="C" home="zzz"/>
</root>
上述XSLT目前只解析XML而不按所需的节点顺序排序:'Y,X,Z,M,N'
。
答案 0 :(得分:2)
您正在尝试按节点名称排序,但表达式name
正在查找名为&#34; name&#34;的元素。您需要使用name()
来获取节点的名称
<xsl:sort data-type="number" select="string-length(substring-before($vSortingValues,concat(',', name(),',')))"/>
注意,为了将来参考,您还可以在此处使用local-name()
。如果涉及名称空间,name()
将包含任何名称空间前缀,而local-name()
将返回不带任何前缀的名称。