XSLT край сортировки для возрастания сортировки по имени элемента

Это продолжение [вопрос]: иерархия множественной сортировки xsl

Используемый XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <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>

Тем не менее, у меня есть случай, когда ранги одинаковы, но сортировка по имени элемента (ASC) неверна.

<name rank="100000">Motor Sports
   <name rank="100000">Motorcycle Racing [MOCY]
      <name rank="100000">Motocross [MOCR]</name>
      <name rank="100000">Speedway [SPEE]</name></name>
   <name rank="100000">Motor Racing [MORA]
      <name rank="100000">Formula 1 [FO1]</name>
   </name>
</name>

В этом случае "Моторные гонки" должны были быть выше "Мотоциклетные гонки". Можете ли вы, ребята, помочь мне понять это? Я попытался добавить оба

<xsl:sort select="text()" order="ascending"/>

а также

<xsl:sort select="name" order="ascending"/>

после

<xsl:sort select="text()" order="ascending"/>

Однако это не сработало.

ОТВЕТ: Спасибо @MichaelKay за ответ, и я решил, что нужно изменить процессор XSLT на Saxon и использовать default-collation="http://saxon.sf.net/collation?decomposition=full"

1 ответ

Решение

Ты говоришь

"Моторные гонки" должны были быть выше "Мотоциклетные гонки"

XSLT не определяет подробные правила сопоставления. Вероятно, это сопоставление, в котором пробелы игнорируются. Некоторые люди сравнивают таким образом, другие нет. Проверьте документацию для вашего процессора XSLT, возможно, есть способ повлиять на используемую им сортировку.

Кроме того, вы можете получить желаемый эффект, используя что-то вроде

<xsl:sort select="translate(xxx, ' ', '-')"/>
Другие вопросы по тегам