XSLT按属性递归排序

时间:2011-03-27 13:27:25

标签: xslt sorting recursion attributes element

我发现有关使用XSLT进行嵌套/递归排序的多个问题和答案,但无法根据我的情况进行映射。

我的情况:

  • “set”元素可以包含0个或更多“属性”元素
  • “set”元素可以包含0个或更多个子集
  • set和property元素都包含属性“key”
  • 我想按“key”属性排序“set”,按“set”排序:按“properties”元素的“key”排序

XML看起来像:

<set key="...">
  <property key="..."/>
  <property key="..."/>
  <property key="..."/>
  <set key="...">
    <set key="...>
      <property key="..."/>
      <property key="..."/>
      <property key="..."/>
    </set>
  </set>
</set>

建议?

2 个答案:

答案 0 :(得分:2)

在简单的情况下,可以这样实现:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()">
                <xsl:sort select="@key" data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于此XML:

<set key="1">
  <property key="6"/>
  <property key="8"/>
  <property key="1"/>
  <set key="3">
    <set key="0">
      <property key="4"/>
      <property key="2"/>
      <property key="9"/>
    </set>
  </set>
</set>

结果将是:

<set key="1">
    <property key="1"></property>
    <set key="3">
        <set key="0">
            <property key="2"></property>
            <property key="4"></property>
            <property key="9"></property>
        </set>
    </set>
    <property key="6"></property>
    <property key="8"></property>
</set>

我认为现实应用程序更复杂,但您的示例并未显示

答案 1 :(得分:-2)

就个人而言,我不认为XSL-T适合这类事情。它是一种XML转换语言,而不是用于排序的编程语言。

我认为最好使用正确的工具:使用Java或C#等语言以排序的形式生成XML,然后使用XSL-T对其进行转换。

如果你正在努力,你可能应该重新考虑这种方法。