XSLT как сортировать только числовые значения в строковом узле XML-документа

#javascript #css #xml #xslt

#javascript #css #xml #xslt

Вопрос:

У меня есть приложение, которое генерирует XML-документ с форматированием css в узлах для оформления значений. Я программно создаю и применяю документ XSLT к xml и хочу сортировать его только по числам. Я обрабатываю документы xml и xslt в JavaScript, а затем отображаю результат в виде отчета. Значения узла выглядят следующим образом:

 <span class="g">96%</span>
<span class="r">56.5%</span>
 

Как я могу отсортировать значения и игнорировать любой окружающий текст?

Редактировать: Перевод звучит как нечто, что сработало бы, но я не уверен, как его применить. У меня есть n количество заголовков, которые доступны для просмотра. При щелчке документ изменяется и добавляется новое поле <xsl:sort с заголовком заголовка, на который был сделан щелчок.

 <th id="hdr6" <a href="#" onClick="sortXML(6,amp;quot;Collections_502amp;quot;,false)">Collections 502</a></th>
... later in the doc...
<xsl:for-each select="records/record">
<xsl:sort select="Collections_502/@value" order="ascending"/>
 

Итак, я не уверен, куда поместить translate. Будет ли это выглядеть примерно так:

 <xsl:sort select="translate('Collections_502/@value','0123456789','')" order="ascending"/>
 

РЕДАКТИРОВАТЬ 2:
Существует несколько столбцов, по которым можно щелкнуть для сортировки. Итак, xml выглядит примерно так:

 <records>
<record id="12">
<person_first value="Bob"/>
<person_int value="15844"/>
<Collections_502 value="<span class='a'>100%</span>"/>
<Data_Security_494 value="<span class='a'>100%</span>"/>
<EBO_505 value="0"/>
<FDCPA_499 value="<span class='c'>50%</span>"/>
<General_Compliance_498 value="<span class='a'>100%</span>"/>
<HIPAA_500 value="<span class='a'>100%</span>"/>
<History_and_Ethics_497 value="<span class='a'>100%</span>"/>
<Human_Resources_495 value="<span class='b'>67%</span>"/>
<TCPA_404 value="<span class='b'>67%</span>"/>
</record>
<record id="13">
<person_first value="Erik"/>
<person_int value="14238"/>
<Collections_502 value="0"/>
<Data_Security_494 value="<span class='a'>100%</span>"/>
<EBO_505 value="0"/>
<FDCPA_499 value="<span class='a'>91%</span>"/>
<General_Compliance_498 value="<span class='a'>100%</span>"/>
<HIPAA_500 value="<span class='a'>100%</span>"/>
<History_and_Ethics_497 value="<span class='a'>100%</span>"/>
<Human_Resources_495 value="<span class='a'>100%</span>"/>
<TCPA_404 value="<span class='a'>100%</span>"/>
</record>
</records>
 

Я получил следующее из примера в Интернете: «Внутренний translate( ) удаляет все интересующие символы (например, числа), чтобы получить строку from для внешнего translate( ), который удаляет эти нечисловые символы из исходной строки».

 <xsl:for-each select="records/record">
<xsl:sort select="translate('HIPAA_500/@value', translate('HIPAA_500/@value', '0123456789', ''), '')" data-type="number" order="ascending"/>
 

Это не работает. Ошибок нет, просто не сортируется.

Комментарии:

1. Вы можете использовать translate() функцию для удаления % (или любого другого) символа.

2. Перевод звучит так, как будто это может сработать. Я отредактировал сообщение с более подробной информацией. Это правильно?

Ответ №1:

В вашем примере инструкция сортировки может выглядеть следующим образом:

 <xsl:for-each select="span">
    <xsl:sort select="translate(., '%', '')" data-type="number" order="ascending"/>
    <!-- do something -->
</xsl:for-each>
 

Демонстрация: https://xsltfiddle .liberty-development.net/pNEj9cR

Комментарии:

1. Извините, я не знал достаточно, чтобы написать хороший вопрос. Ваш ответ выглядит правильно, но я не дал вам достаточно информации. Я добавил больше к примеру, чтобы вы могли видеть xml. Я действительно не понял, что это. в вашем примере или почему удалялся только%. Пример, который я нашел, показался мне не совсем правильным, но, очевидно, я не уверен, что куда идет.

2. Добавленный вами «XML» не является правильно сформированным XML-документом и вообще не может быть обработан XSLT. У вас не может быть неэкранированного < значения внутри значения атрибута. Без этого инструкция <xsl:sort select="translate(HIPAA_500/@value, translate(HIPAA_500/@value, '0123456789', ''), '')" data-type="number" order="ascending"/> должна работать — при условии, что атрибут содержит одно положительное целое число. Обратите внимание на отсутствие кавычек вокруг пути.

3. Хорошо… возможно, translate не будет работать с тегами <span , но он распознает класс span, форматирует значения в соответствии с классом и сортирует с помощью xsl:sort в исходном сообщении. Тем не менее, проблема с их удалением заключается в том, как раскрасить фон значения, панель и т. Д.

4. Вау! Я просто убрал кавычки с пути, и это работает отлично.