Сортировка XSLT 2.0 с использованием Saxon в Java
Это продолжение крайнего случая сортировки XSLT для сортировки по возрастанию по имени элемента
Мне удалось решить большинство вопросов, используя ответ, описанный в этом вопросе. Однако все еще есть случай, когда сортировка не работает должным образом.
Это мой исходный XML -
<Sources>
<name rank="">ABcoop / Jiji Commodities News (Japanese) !RSC!</name>
<name rank="">ABcoop Treasury & Company News (Japanese) !RSS!</name>
<name rank="">ABcoop Treasury News (Japanese) !RS!</name>
<name rank="">AB Corporate Finance News !RINVB!</name>
<name rank="">AB Insider !RITV!</name>
</Sources>
Мой XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
default-collation="http://saxon.sf.net/collation?decomposition=full">
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="name">
<xsl:sort select="@rank" data-type="number"/>
<xsl:sort />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<name rank="{@rank}">
<xsl:copy-of select="text()"/>
<xsl:apply-templates select="name">
<xsl:sort select="@rank" data-type="number"/>
<xsl:sort />
</xsl:apply-templates>
</name>
</xsl:template>
</xsl:stylesheet>
Сортированный вывод (Неверно):
<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name rank="">ABcoop / Jiji Commodities News (Japanese) !RSC!</name>
<name rank="">ABcoop Treasury & Company News (Japanese) !RSS!</name>
<name rank="">ABcoop Treasury News (Japanese) !RS!</name>
<name rank="">AB Corporate Finance News !RINVB!</name>
<name rank="">AB Insider !RITV!</name>
</Sources>
Ожидаемое:
<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name rank="">AB Corporate Finance News !RINVB!</name>
<name rank="">AB Insider !RITV!</name>
<name rank="">ABcoop / Jiji Commodities News (Japanese) !RSC!</name>
<name rank="">ABcoop Treasury & Company News (Japanese) !RSS!</name>
<name rank="">ABcoop Treasury News (Japanese) !RS!</name>
</Sources>
Изменить: Дополнительная информация, так как несколько ответов предложили, чтобы я использовал сопоставление по умолчанию (удаление атрибута сопоставления по умолчанию) или collation = "http://www.w3.org/2005/xpath-functions/collation/codepoint"
для элемента xsl: sort.
Однако проблема, как было указано в предыдущем посте, заключается в том, что другие элементы в моем исходном XML-коде сортируются неправильно при использовании кодовой точки Юникода в качестве URI сопоставления.
Например,
<Sources>
<name>FX Buzz News Service !fxbuz!</name>
<name>French General News Service !fb!</name>
<name>French Money / Debt News Service !fg!</name>
</Sources>
неправильно сортируется при сопоставлении кодов Unicode. Я пытаюсь найти решение, которое работает для всех случаев.
2 ответа
Вы сортируете по атрибуту ранга, но он имеет одинаковое значение в каждом элементе.
Попробуйте добавить lang="en" в xsl:sort, чтобы получить "английскую" сортировку вместо сортировки по юникоду. Это может быть не совсем то, что вы хотите, но, вероятно, будет ближе.