XSLT排序边缘情况,按元素名称升序排序

时间:2012-10-24 15:53:47

标签: xslt

这是[问题]的后续行动:xsl multiple sort hierarchy

正在使用的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-collat​​ion =“http://saxon.sf.net/collat​​ion?decomposition=full”

1 个答案:

答案 0 :(得分:2)

你说

  

“赛车”应该高于“摩托车赛车”

XSLT未定义详细的排序规则。这可能是一个忽略空格的排序规则。有些人整理那种方式,有些则没有。查看XSLT处理器的文档,可能有一种方法影响它使用的排序规则。

或者,您可以使用

之类的东西获得所需的效果
<xsl:sort select="translate(xxx, ' ', '-')"/>