#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. Вау! Я просто убрал кавычки с пути, и это работает отлично.