XSLT сортировка по буквам и цифрам - PullRequest
0 голосов
/ 04 февраля 2020

Я ищу помощь в решении проблемы, с которой я сталкиваюсь, с помощью таблицы стилей XSLT, которую я применяю к файлу basi c XML, который выведет basi c HTML для таблицы I ' м здание. В частности, я пытаюсь применить <xslt:sort select="" /> к выводимому содержимому на основе элемента идентификатора, который включает в себя текст (всегда начинается с буквы «A») и одинарные и двойные числа di git. Однако, когда я запускаю скрипт, он плохо обрабатывает двойные числа di git. Он помещает A10 после A1, когда я хочу, чтобы A10 появлялся после A9.

Пример XML исходный файл:

<categories name="Category name goes here" version="2020">
        <category name="A1">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A2">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A9">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A10">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>

Вот как в настоящее время выглядит моя сортировка XSLT:

<xsl:sort select="substring-after(substring-before(@name, ' '), 'A')" data-type="number"/>

Что мне нужно добавить сюда, чтобы правильно считать двойные числа git? Любая помощь очень ценится!

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Вам необходимо изменить сортировку следующим образом.

XSLT

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

    <xsl:template match="/categories">
        <root>
            <xsl:for-each select="category">
                <xsl:sort select="substring-after(@name, 'A')" data-type="number"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 05 февраля 2020

Вы не сказали, какую версию XSLT вы используете. (Пожалуйста, ВСЕГДА указывайте это, когда спрашиваете о XSLT в StackOverflow. Мы должны знать, потому что многие люди все еще используют древние версии языка).

XSLT 2.0 ввел возможность называть параметры сортировки в xsl: sort, и В XSLT 3.0 введены некоторые стандартные URI для определенных параметров сортировки. С XSLT 2.0 поставщик вашего процессора может предоставить сопоставление с требуемыми свойствами; в XSLT 3.0 вы можете запросить использование алгоритма сопоставления Unicode со свойством numeric=yes, которое задает порядок, который вы ищете:

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

Numeric = yes определено так, что любая последовательность цифр в строках для сортировка рассматривается как число, а не как последовательность символов.

0 голосов
/ 04 февраля 2020

Кажется, вы на правильном пути, но substring-before не имеет смысла и все портит. Попробуйте просто удалить это:

<xsl:sort select="substring-after(@name, 'A')" data-type="number"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...