0

我仍然在努力理解很多 XSLT,但有一个具体的问题。

我有一个简单的嵌套结构,我想按属性(名称)进行排序。

该文件有一个根节点,然后是一系列嵌套节点。我需要将根目录下的所有节点按它们所在的级别排序。层次结构嵌套到未指定的级别。

输入:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node name="A">
    <node name="C"/>
    <node name="B"/>
  </node>
  <node name="F"/>
  <node name="E"/>
</root>

需要转化为:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node name="A">
    <node name="B"/>
    <node name="C"/>
  </node>
  <node name="E"/>
  <node name="F"/>
</root>

我不会用我解决这个问题的可行尝试让你厌烦。

4

2 回答 2

0

假设您确实希望元素保持在它们当前所在的级别内,首先,您需要一个模板来匹配任何元素

<xsl:template match="*">

然后您将使用xsl:copy复制元素,并使用xsl:copy-of复制任何属性

  <xsl:copy>
     <xsl:copy-of select="@*"/>
     ... more code here...
  </xsl:copy>

然后在xsl:copy中,您将使用xsl:apply-templates来处理子元素,并使用xsl:sort来选择顺序

     <xsl:apply-templates select="*">
        <xsl:sort select="@name" />
     </xsl:apply-templates>

把这个完全给你这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output omit-xml-declaration="yes" indent="yes" />
   <xsl:template match="*">
      <xsl:copy>
         <xsl:copy-of select="@*"/>
         <xsl:apply-templates select="*">
            <xsl:sort select="@name" />
         </xsl:apply-templates>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

当应用于您的输入 XML 时,将输出以下内容

<root>
  <node name="A">
    <node name="B"/>
    <node name="C"/>
  </node>
  <node name="E"/>
  <node name="F"/>
</root>
于 2013-10-23T23:12:18.417 回答
0

这个答案类似于 Tim C 的答案,但只是使用带有xsl:sort. 这样,您就不会丢失评论或处理说明(如果存在)。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()">
                <xsl:sort select="@name"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
于 2013-10-24T01:43:42.597 回答