2016-10-23 2 views
0

У меня проблема с сортировкой чисел, разделенных точками (например, 1, 2.1, 1.1, 1.3). Я нашел решение здесь XSL recursive sort. Это то, что мне нужно, немного другое. В моей XML, теги, какНомера сортировки XSL, разделенные периодами

<root> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>test</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
</root> 

и я хочу, чтобы отсортировать все строки, в которых столбец/@ имя = «ранг» на основе тегов «VAL». Можно ли получить вывод только с изменением принятого ответа в связанном вопросе? Если нет, есть ли решение с xsl версией 1 (или 2, если его нет). Выход мне нужно, как:

<ul> 
    <li>1 - B 
    <ul> 
     <li>1.1 - A</li> 
     <li>1.2 - F 
      <ul> 
      <li>1.2.1 - E</li> 
      <li>1.2.2 - D</li> 
      </ul> 
     </li> 
    </ul>  
    </li> 
</ul> 

Update Я: Так на основе ответа michael.hor257k, это является решение я искал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/root"> 
    <html> 
    <body> 
     <ul> 
     <xsl:apply-templates select="row[not(contains(val, '.'))][contains(col/@name, 'rank')]"> 
      <xsl:sort select="val" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
     </ul> 
    </body>  
    </html>  
    </xsl:template> 

    <xsl:template match="row"> 
    <li> 
     <xsl:variable name="parent" select="concat(val, '.')" /> 
     <xsl:value-of select="./name"/> - <xsl:value-of select="./val"/> 
     <xsl:if test="../row[starts-with(val, $parent)][not(contains(substring-after(val, $parent), '.'))][contains(col/@name, 'rank')]"> 
     <ul> 
      <xsl:apply-templates select="../row[starts-with(val, $parent)][not(contains(substring-after(val, $parent), '.'))][contains(col/@name, 'rank')]"> 
      <xsl:sort select="substring-after(val, $parent)" data-type="number" order="ascending"/> 
      </xsl:apply-templates> 
     </ul> 
     </xsl:if> 
    </li> 
    </xsl:template> 
</xsl:stylesheet> 

Update II : Спасибо Dimitre Novatchev, у меня есть лучшее решение , которое, я думаю, это лучший ответ. Итак, я пытаюсь это понять, после этого я проверю его как принятый ответ.

Обновление III: Я принял ответ michael.hor257k, потому что это то, что мне было нужно. Я знаю, что нет никаких скачков в рядах рангов в моем xml, но, как отметил Димитр Новачев, если есть, например, с 1.3.2 без 1.3, проблема будет с этим решением, и вы можете использовать полный ответ, который разместил Димитр Новачев ,

+0

Кажется, вы хотите гораздо больше, чем просто ** соберите ** их : вы все поэтому хотите ** вложить ** их в соответствии с их иерархией. –

+0

Если вы их отсортируете, я постараюсь сделать все остальное. : -D На самом деле, это не так важно. также значения тегов «name». (Я просто хочу показать, как цифры должны быть отсортированы) @ michael.hor257k – Warjeh

+0

Существует лучшее решение, чем принятое - оно не накладывает никаких ограничений на документ XML. Наслаждайтесь! –

ответ

1

Рассмотрим следующий таблицу стилей:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/root"> 
    <list> 
     <xsl:apply-templates select="row[not(contains(val, '.'))]"> 
      <xsl:sort select="val" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
    </list> 
</xsl:template> 

<xsl:template match="row"> 
    <xsl:variable name="parent" select="concat(val, '.')" /> 
    <item val="{val}"> 
     <xsl:apply-templates select="../row[starts-with(val, $parent)][not(contains(substring-after(val, $parent), '.'))]"> 
      <xsl:sort select="substring-after(val, $parent)" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
    </item> 
</xsl:template> 

</xsl:stylesheet> 

Применительно к следующему примеру ввода:

XML

<root> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.10</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
</root> 

результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
    <item val="1"> 
     <item val="1.1"/> 
     <item val="1.2"> 
     <item val="1.2.1"/> 
     <item val="1.2.2"/> 
     </item> 
     <item val="1.10"/> 
    </item> 
    <item val="2"/> 
</list> 

Это работает рекурсивно, и нет никаких ограничений по количеству уровней. Обратите внимание, однако, что каждый элемент (кроме элементов «предка», который не содержит точки) должен иметь родителя.

+0

Спасибо. Это то, что мне было нужно, но есть некоторые части, на которые вы не обращали внимания, так как вы не исключили строки с . Я собираюсь написать то, что мне нужно, на основе вашего решения, и я надеюсь, что я не растрачу ваш код. – Warjeh

+0

Я целенаправленно игнорировал все, что не было важно для демонстрации метода. Это должно быть тривиально сделать необходимые адаптации. Я также проигнорировал ваше хвастовство, что вы «сделаете все остальное» после сортировки записей. Сортировка - легкая часть здесь (как я считаю, вы начинаете узнавать). Если все, что вы хотели сделать, это отсортировать строки, вы можете просто переформатировать нумерацию с «1.2.3», чтобы сказать «001002003», и отсортировать результат по алфавиту. –

+0

Я знаю, что ты мог бы сделать то, что я сделал и опубликовал в моем вопросе, и, конечно, я не хотел хвастаться ни о чем. Как вы можете видеть, я новичок в xslt, даже я не мог изменить связанное решение для своей цели.Но мне интересно попробовать, что я могу сделать. Ваш ответ - это тот ответ, который я искал, и я это принял, но позже я изменил его, чтобы его не приняли, потому что опубликован другой ответ. И действительно? Я не знаю, что выбрать, что мне нужно, или того, что более полно, возможно, для других людей. :) Еще раз спасибо и <3 – Warjeh

1

Известно ли количество уровней? Если да, то в XSLT 2.0 вы можете использовать

<xsl:apply-templates select="row[col/@name = 'rank']"> 
<xsl:sort select="xs:integer(tokenize(val, '\'.')[1])"/> 
<xsl:sort select="xs:integer(tokenize(val, '\'.')[2])"/> 
<xsl:sort select="xs:integer(tokenize(val, '\'.')[3])"/> 
</xsl:apply-templates/> 

для трех уровней. В XSLT 3.0 вы можете даже сделать это с sort функции для любого уровня: <xsl:apply-templates select="sort(row[col/@name = 'rank'], function($row) { tokenize($row/val, '\.')!xs:integer(.) })"> хотя, как вы хотите, чтобы гнездо я думаю, с помощью рекурсивной функции делает

<xsl:for-each-group select="$rows" group-by="xs:integer(tokenize(val, '\.')[1])"><xsl:sort select="current-grouping-key()"/>...</xsl:for-each-group> 

является более подходящим в XSLT 2.0 или 3.0, то чисто сортировки.

Полная таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs mf" version="2.0"> 

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

    <xsl:function name="mf:nest" as="element()*"> 
     <xsl:param name="rows" as="element(row)*"/> 
     <xsl:sequence select="mf:nest($rows, 1)"/> 
    </xsl:function> 

    <xsl:function name="mf:nest" as="element()*"> 
     <xsl:param name="rows" as="element(row)*"/> 
     <xsl:param name="level" as="xs:integer"/> 
     <xsl:for-each-group select="$rows" group-by="xs:integer(tokenize(val, '\.')[$level])"> 
      <xsl:sort select="current-grouping-key()"/> 
      <li> 
       <xsl:variable name="item" select="current-group()[not(tokenize(val, '\.')[$level + 1])]"/> 
       <xsl:value-of select="$item/concat(name, ' - ', val)"/> 
       <xsl:if test="current-group()[2]"> 
        <ul> 
         <xsl:sequence select="mf:nest(current-group() except $item, $level + 1)"/> 
        </ul> 
       </xsl:if> 
      </li> 
     </xsl:for-each-group> 
    </xsl:function> 

    <xsl:template match="root"> 
     <ul> 
      <xsl:sequence select="mf:nest(row[col/@name = 'rank'])"/> 
     </ul> 
    </xsl:template> 

</xsl:stylesheet> 

он преобразует входной сигнал

<root> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>test</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>foo</name> 
     <val>2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>bar</name> 
     <val>1.10</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.10.1</val> 
    </row> 
</root> 

в результате

<ul> 
    <li>B - 1 
     <ul> 
     <li>A - 1.1</li> 
     <li>F - 1.2 
      <ul> 
       <li>E - 1.2.1</li> 
       <li>D - 1.2.2</li> 
      </ul> 
     </li> 
     <li>bar - 1.10 
      <ul> 
       <li>F - 1.10.1</li> 
      </ul> 
     </li> 
     </ul> 
    </li> 
    <li>foo - 2</li> 
</ul> 
+0

Количество уровней? Не обязательно. Я думаю, что этот ответ - хорошее начало для изучения XSLT 2.0 или 3.0. Большое спасибо. :-) Я попытался изменить связанное решение, но не смог, поэтому приоритетом был этот код, и я собираюсь принять еще один ответ в качестве решения, но еще раз спасибо. – Warjeh

0

У меня проблема с сортировкой чисел, разделенных точками (например, 1, 2.1, 1.1, 1.3). Я нашел решение здесь XSL recursive sort.

Часть I. Сортировочный

Это очень легко адаптировать оригинальное решение к новому делу. В отличии от принятого ответа, это решение сортирует правильно XML документы, где есть

<val>1.3.2</val> 

но нет

<val>1.3</val> 

См Части II для преобразования отсортированного результата в требуемых вложенной структуру списка.


Когда это преобразование применяется на следующий документ XML - обратите внимание, что <val>1.3.2</val> но нет <val>1.3</val> и принятый ответ не дает правильный результат - фактически удаляет весь <row> имея <val>1.3.2</val> ребенка:

<root> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.10</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.3.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
</root> 

разыскиваемый, правильно отсортирован результат получается:

<root> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.3.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.10</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>2</val> 
    </row> 
</root> 

Наконец, еще один рефакторинг: устранение всех XSLT условных операторов:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:apply-templates select="row"> 
       <xsl:sort select="substring-before(concat(val, '.'), '.')" 
          data-type="number"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="row"> 
     <xsl:param name="prefix" select="''"/> 
     <xsl:variable name="vHasChildren" select= 
          "not(val = substring($prefix, 1, string-length($prefix)-1))"/> 
     <xsl:copy-of select="self::node()[not($vHasChildren)]"/> 

     <xsl:variable name="chunk" 
      select="substring-before(concat(substring-after(val, $prefix), '.'), '.')"/> 
     <xsl:variable name="new-prefix" select="concat($prefix, $chunk, '.')"/> 
     <xsl:apply-templates select= "self::node() 
      [$vHasChildren 
      and not(preceding-sibling::row[starts-with(val, concat($prefix, $chunk))]) 
      ] 
      /../row[starts-with(val, $new-prefix) or val = concat($prefix, $chunk)]"> 
      <xsl:with-param name="prefix" select="$new-prefix"/> 
      <xsl:sort data-type="number" select= 
       "substring-before(concat(substring-after(val, $new-prefix), '.'), '.')"/> 
     </xsl:apply-templates> 
    </xsl:template> 
</xsl:stylesheet> 

Часть II: Преобразование отсортированного, плоский результата в вложенную структуру списка

Здесь мы начнем с результата преобразования, полученного в части I, и из него мы создаем нужную структуру списка вложенных списков.Отсортирован плоский результат мы имеем до сих пор:

<root> 
    <row> 
     <col name="rank"/> 
     <name>B</name> 
     <val>1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>A</name> 
     <val>1.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>E</name> 
     <val>1.2.1</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.2.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>D</name> 
     <val>1.3.2</val> 
    </row> 
    <row> 
     <col name="rank"/> 
     <name>F</name> 
     <val>1.10</val> 
    </row> 
    <row> 
     <col name="level"/> 
     <name>C</name> 
     <val>2</val> 
    </row> 
</root> 

Мы используем это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
    <list> 
     <xsl:apply-templates select= 
     "row[not(substring-before(concat(val, '.'), '.') 
       = substring-before(concat(preceding-sibling::row[1]/val,'.'),'.'))]"> 
     <xsl:with-param name="pPrefix" select="''"/> 
     </xsl:apply-templates> 
    </list> 
    </xsl:template> 


    <xsl:template match="row"> 
    <xsl:param name="pPrefix"/> 
    <item val="{val}"> 
     <xsl:variable name="vnewPrefix" select="concat($pPrefix, val, '.')"/> 
     <xsl:variable name="vcurrentVal" select="val"/> 
     <xsl:apply-templates select="following-sibling::row 
        [starts-with(val, concat($vcurrentVal,'.')) 
       and 
        (string-length(val) - string-length(translate(val,'.','')) 
        = 1 + string-length($vcurrentVal) - string-length(translate($vcurrentVal,'.','') 
        ) 
        or 
        not(starts-with(val, 
            concat($vnewPrefix, 
              substring-before(concat(substring-after(preceding-sibling::row[1]/val, $vnewPrefix),'.'),'.'), 
                  '.') 
            ) 
         ) 
        ) 
        ]"> 
     <xsl:with-param name="pPrefix" select="$vnewPrefix"/> 
     </xsl:apply-templates> 
    </item> 
    </xsl:template> 
</xsl:stylesheet> 

Результат применения этого преобразования на документе выше XML является хотел структура вложенного списка :

<list> 
    <item val="1"> 
     <item val="1.1"/> 
     <item val="1.2"> 
     <item val="1.2.1"/> 
     <item val="1.2.2"/> 
     </item> 
     <item val="1.3.2"/> 
     <item val="1.10"/> 
    </item> 
    <item val="2"/> 
</list> 

Мы также можем создать желаемый HTML-код, используя этот трансформер мация:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
    <ul> 
     <xsl:apply-templates select= 
     "row[not(substring-before(concat(val, '.'), '.') 
       = substring-before(concat(preceding-sibling::row[1]/val,'.'),'.'))]"> 
     <xsl:with-param name="pPrefix" select="''"/> 
     </xsl:apply-templates> 
    </ul> 
    </xsl:template> 

    <xsl:template match="row"> 
    <xsl:param name="pPrefix"/> 
    <li> <xsl:value-of select="concat(val, ' - ', name, '&#xA;')"/> 
     <xsl:variable name="vnewPrefix" select="concat($pPrefix, val, '.')"/> 
     <xsl:variable name="vcurrentVal" select="val"/> 

     <xsl:variable name="vnextInChain" select= 
     "following-sibling::row 
        [starts-with(val, concat($vcurrentVal,'.')) 
       and 
        (string-length(val) - string-length(translate(val,'.','')) 
        = 1 + string-length($vcurrentVal) - string-length(translate($vcurrentVal,'.','') 
        ) 
        or 
        not(starts-with(val, 
            concat($vnewPrefix, 
              substring-before(concat(substring-after(preceding-sibling::row[1]/val, $vnewPrefix),'.'),'.'), 
                  '.') 
            ) 
         ) 
        ) 
        ]"/> 

     <xsl:if test="$vnextInChain"> 
     <ul> 
     <xsl:apply-templates select="following-sibling::row 
        [starts-with(val, concat($vcurrentVal,'.')) 
       and 
        (string-length(val) - string-length(translate(val,'.','')) 
        = 1 + string-length($vcurrentVal) - string-length(translate($vcurrentVal,'.','') 
        ) 
        or 
        not(starts-with(val, 
            concat($vnewPrefix, 
              substring-before(concat(substring-after(preceding-sibling::row[1]/val, $vnewPrefix),'.'),'.'), 
                  '.') 
            ) 
         ) 
        ) 
        ]"> 
     <xsl:with-param name="pPrefix" select="$vnewPrefix"/> 
     </xsl:apply-templates> 
     </ul> 
     </xsl:if> 
    </li> 
    </xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на плоской отсортированный результат, полезный результат HTML производится: поддерживает

<ul> 
    <li>1 - B 
     <ul> 
      <li>1.1 - A 
      </li> 
      <li>1.2 - F 
       <ul> 
        <li>1.2.1 - E 
        </li> 
        <li>1.2.2 - D 
        </li> 
       </ul></li> 
      <li>1.3.2 - D 
      </li> 
      <li>1.10 - F 
      </li> 
     </ul></li> 
    <li>2 - C 
    </li> 
</ul> 
+0

Я очень ценю время, которое вы тратите на этот вопрос. :-) Я видел первую часть прошлой ночи, и это был ответ. Конечно, есть что-то, может быть, я недостаточно прояснился, так как я хочу, чтобы «ранг» не был «уровнем». Я сделал это с добавлением [contains (col/@ name, 'rank')] после «row» s. – Warjeh

+0

И вторая часть, извините, я не знаю, как их использовать. Эти две работы по выпуску первой части, не так ли? Он работает нормально при использовании отсортированного вывода, как вы упомянули выше, но как я могу получить первый вывод и использовать его только в одном xsl? – Warjeh

+0

Когда у меня есть свободное время, я опубликую отдельное решение XSLT 2.0, которое должно быть немного короче - с помощью функции xsl: и не иметь дело с RTF (фрагменты дерева результатов). У меня создалось впечатление, что вам нужно решение XSLT 1.0, и ваш комментарий, который вы используете только FF, подтверждает это. Вы не сможете использовать решение XSLT 2.0 в этой среде - ни один из существующих браузеров не реализует XSLT 2.0. –

0

Проверьте выбранный процессор XSLT числовой сортировки (способ сортировки строк в которой последовательные последовательности цифр рассматриваются как числа, поэтому «Глава 2» сортируется до «Глава 10»). Например с сортировкой URIs UCA, определенным в XSLT 3.0 и XPath 3.1 это будет

<xsl:sort select="val" 
     collation="http://www.w3.org/2013/collation/UCA?numeric=yes"/> 

Числовых сортировки также были доступны в Saxon в течение нескольких лет в виде

collation="http://saxon.sf.net/collation?alphanumeric=yes" 
+0

Спасибо. Я собираюсь изучить процессоры XSLT и другие связанные вещи как можно скорее. Теперь я ничего не знаю о процессорах XSLT. : D Я использую firefox и просто перетаскиваю свой xml (после определения xml-stylesheet). Используя этот , это Transformiix, если я прав. – Warjeh

+0

При публикации вопроса XSLT всегда стоит указать, что такое технологические ограничения: XSLT-процессорам, поставляемым с браузерами, сейчас около 15 лет и сильно сдерживает. Если вы хотите что-то более современное для запуска на стороне клиента, вы можете попробовать Saxon-JS; однако в настоящее время он не предлагает ни одно из предлагаемых мной решений (числовые сопоставления или функция сортировки более высокого порядка). –

+0

Мой плохой! Я думал, что имеет значение только версия XSLT. В следующий раз я рассмотрю это и упомянул, что использую браузер (или любые другие процессоры). Благодарю. – Warjeh

0

А вот другой кандидат, если вы можете воспользоваться этим: новая функция fn: sort в XPath 3.1 позволяет использовать составной ключ сортировки, чтобы вы могли писать

sort(val, function($x){tokenize($x, '\.')!number()}) 

 Смежные вопросы

  • Нет связанных вопросов^_^