使用XSL的动态排序顺序

时间:2011-06-06 10:53:31

标签: xml xslt sorting

我希望能够根据XML中的属性对元素进行排序。不幸的是,我似乎无法让它工作,到目前为止这是我的代码。

目前没有产生任何错误,但排序似乎从未应用降序。

        <xsl:variable name="sortOrder">
            <xsl:choose>
                <xsl:when test="Lanes/@flip = 1">descending</xsl:when>
                <xsl:otherwise>ascending</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:for-each select="Entry">
            <xsl:sort data-type="number" select="@id" order="{$sortOrder}"/>
        </xsl:for-each>

XML:

        <Lanes flip="1">
            <Entry id="1" value="0"/>
            <Entry id="2" value="0"/>
        </Lanes>

1 个答案:

答案 0 :(得分:1)

    <xsl:for-each select="Entry">
        <xsl:sort data-type="number" select="@id" order="{$sortOrder}"/>
    </xsl:for-each>

您的样本的测试用例:

<xml>
  <Lanes flip="1">
    <Entry id="1" value="0"/>
    <Entry id="2" value="0"/>
  </Lanes>
  <Lanes flip="0">
    <Entry id="1" value="0"/>
    <Entry id="2" value="0"/>
  </Lanes>
</xml>

XSL

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

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

  <xsl:template match="Lanes">
    <xsl:copy>
      <xsl:variable name="sortOrder">
        <xsl:choose>
          <xsl:when test="@flip = 1">descending</xsl:when>
          <xsl:otherwise>ascending</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:apply-templates select="Entry">
        <xsl:sort data-type="number" select="@id" order="{$sortOrder}" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

为我输出:

<xml>
  <Lanes>
    <Entry id="2" value="0"></Entry>
    <Entry id="1" value="0"></Entry>
  </Lanes>
  <Lanes>
    <Entry id="1" value="0"></Entry>
    <Entry id="2" value="0"></Entry>
  </Lanes>
</xml>