这是[问题]的后续: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>
在这种情况下,“Motor Racing”应该在“Motorcycle Racing”之上。你们能帮我解决这个问题吗?我试过同时添加
<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"