как отсортировать атрибут в xsl - PullRequest
0 голосов
/ 03 мая 2011

после ввода, я хочу объединить и отсортировать элементы без использования 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 Ответ

1 голос
/ 13 мая 2011

Без использования xsl: sort вы могли бы сделать что-то вроде следующего, но если ваши числа намного выше, отрицательные, неполные или не совсем числа, то вам придется либо что-то скорректировать, либо это может просто не произойтиработать (я попытался увеличить последнее значение с 32 до 3200, и xsltproc не только потребовал, чтобы я дал более высокое значение --maxdepth, но и занял 52x как долго!):

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...