如何使用XSLT对XML节点进行排序

时间:2017-08-29 14:51:57

标签: xml sorting xslt

给定节点的顺序,我需要根据给定的顺序对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'

1 个答案:

答案 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()将返回不带任何前缀的名称。