这是 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 元素。
但是,上一篇文章中指出的问题是,当使用 unicode 代码点作为排序规则 URI 时,我的源 XML 中的其他元素没有正确排序。
例如,
<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 代码点排序规则正确排序。我正在尝试找到适用于所有情况的解决方案。