XSLT:如何反转树?

时间:2014-09-08 15:33:46

标签: xslt reverse

我需要转换这样的文档:

<root>
  <products>
    <ProductInfo>
      <ProductID>0</ProductID>
      <ProductName>Hello world!</ProductName>
    </ProductInfo>
    <M>
      <ModelInfo>
        <ModelID>0</ModelID>
        <ModelName>Hello world!</ModelName>
      </ModelInfo>
    </M>
  </products>
</root>

进入这个:

<root>
  <products>
    <M>
      <ModelInfo>
        <ModelName>Hello world!</ModelName>
        <ModelID>0</ModelID>
      </ModelInfo>
    </M>
    <ProductInfo>
      <ProductName>Hello world!</ProductName>
      <ProductID>0</ProductID>
    </ProductInfo>
  </products>
</root>

因此输出中的所有标记都应按相反的顺序排列。

我需要这个来测试:我需要确保一些外部应用程序以任何顺序接受标记;我还需要它来测试我的XML Schema是否允许任何顺序的标记。

1 个答案:

答案 0 :(得分:2)

不反转树,但颠倒兄弟分支的顺序(在所有级别):

XSLT 1.0

<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="*"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="node()">
            <xsl:sort select="position()" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>