如何在xsl中对属性进行排序

时间:2011-05-03 08:01:29

标签: xslt sorting merge

以下是输入,我想合并和排序元素而不使用xsl:sort !!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lists SYSTEM "number.dtd">
<numbers>
  <number>
    <num val="7"/>
    <num val="2"/>
    <num val="9"/>
    <num val="16"/>
    <num val="12"/>
    <num val="15"/>
  <number/>
  <number>
    <num val="29"/>
    <num val="18"/>
    <num val="30"/>
    <num val="32"/>
  </number>
</numbers>

输出应该是::

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lists SYSTEM "number.dtd">
<numbers>
  <number>
    <num val="2"/>
    <num val="7"/>
    <num val="9"/>
    <num val="12"/>
    <num val="15"/>
    <num val="16"/>
    <num val="18"/>
    <num val="29"/>
    <num val="30"/>
    <num val="32"/>
  </number>
</numbers>

在xsl中,请不要使用xsl:sort ...∩_∩

1 个答案:

答案 0 :(得分:1)

不使用xsl:sort,您可以执行以下操作,但如果您的数字高得多,为负数,非整数或实际数字,那么您将需要调整内容,或者可能不会work(我尝试将最后一个值从32增加到3200并且xsltproc不仅要求我提供更高的--maxdepth值,而且还需要52倍的长度!):

<?xml version="1.0" encoding="UTF-8"?>

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <numbers>
      <number>
        <xsl:call-template name="iterate.over.nums">
          <xsl:with-param name="i">0</xsl:with-param>
        </xsl:call-template>
      </number>
    </numbers>
  </xsl:template>

  <xsl:template name="iterate.over.nums">
    <xsl:param name="i">0</xsl:param>
    <xsl:choose>
      <xsl:when test="not(numbers/number/num/@val &gt;= $i)" />
      <xsl:otherwise>
        <xsl:for-each select="numbers/number/num[@val = $i]">
          <num val="{@val}"/>
        </xsl:for-each>
        <xsl:call-template name="iterate.over.nums">
          <xsl:with-param name="i" select="$i + 1" />
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>