Сортировка XSLT 2.0 с использованием Saxon в Java

Это продолжение крайнего случая сортировки XSLT для сортировки по возрастанию по имени элемента

Мне удалось решить большинство вопросов, используя ответ, описанный в этом вопросе. Однако все еще есть случай, когда сортировка не работает должным образом.

Это мой исходный XML -

<Sources>
   <name rank="">ABcoop / Jiji Commodities News (Japanese) !RSC!</name>
   <name rank="">ABcoop Treasury &amp; 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 &amp; 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 &amp; 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, чтобы получить "английскую" сортировку вместо сортировки по юникоду. Это может быть не совсем то, что вы хотите, но, вероятно, будет ближе.

Другие вопросы по тегам