这是XSLT sort edge case for ascending sort by element name
的后续行动我已设法使用该问题中描述的答案解决了大部分问题。但是,仍然存在排序无法按预期工作的情况。
这是我的源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>
编辑:附加信息,因为一些答案建议我使用默认排序规则(删除default-collation属性)或collation = "http://www.w3.org/2005/xpath-functions/collation/codepoint"
用于xsl:sort元素。
但是,前一篇文章中指出的问题是,当使用unicode codepoint作为排序规则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代码点排序规则未正确排序。我试图找到一个适用于所有情况的解决方案。
答案 0 :(得分:1)
您按rank属性排序,但每个元素的值都相同。
答案 1 :(得分:0)
尝试将lang =“en”添加到xsl:sort以获取“英语”排序而不是unicode代码点排序。它可能不是你想要的,但它可能会更接近。