2011-05-03 10 views
0

следующий ему ввод, я хочу объединить и отсортировать элементы без использования xsl: sort !!как отсортировать атрибут в xsl

<?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: сортировки ... ∩_∩

+0

@ZAWD: Откуда мы должны взять '9'? Кроме того, непонятно, почему вы не хотите стандартного ответа XSLT, используя инструкцию, которая была сделана для этого ... –

+0

@Alejandro: Да, это моя ошибка, я изменил ее сейчас. Я хочу найти новую способ ее решения. – ZAWD

+0

@ZAWD: Если вы не хотите использовать 'xsl: sort', вы должны реализовать алгоритм сортировки. Какой алгоритм сортировки вы хотите? Если вы не знаете, вы должны начать сначала об этом узнавать. –

ответ

1

без использования XSL: то, вы могли бы сделайте что-то вроде следующего, но если ваши цифры намного выше, отрицательные, не целочисленные или не фактические числа, тогда вам придется либо приспособить вещи, либо просто не работать (я попытался поднять последнее значение с 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> 
Смежные вопросы