XSLT-根据子标记对xml父段进行排序

时间:2018-08-15 12:47:35

标签: sorting xslt

我需要根据子标记值对xml段进行排序,尽管父标记可以具有不同的名称。

我的输入xml就是这样

<root>
  <A>
    <id>1000</id>
  </A>
  <A>
     <id>1001</id>
  </A>
  <A>
    <id>1002</id>
  </A>

  <B>
    <id>1000</id>
  </B>
  <B>
    <id>1001</id>
  </B>
  <B>
    <id>1002</id>
  </B>
</root> 

无论父标签是什么,我都希望对标签“ id”进行排序。因此结果应如下所示:

 <root>
    <A>
       <id>1000</id>
    </A>
    <B>
       <id>1000</id>
    </B>

    <A>
       <id>1001</id>
    </A>
    <B>
       <id>1001</id>
    </B>

    <A>
       <id>1002</id>
    </A>
    <B>
       <id>1002</id>
    </B>
  </root>

如何在xslt中实现?

谢谢! 汤姆

1 个答案:

答案 0 :(得分:1)

匹配root的模板应包含apply-templates select="*"(对于所有子节点)和<xsl:sort select="id"/> 内部。

因此整个XSLT脚本如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="*">
        <xsl:sort select="id"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

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

请注意,我使用<xsl:strip-space elements="*"/>来实现 “更好”的输出格式。尝试没有它的转化看看 差异。