0

这是 XSLT 排序边缘情况的后续,用于按元素名称进行升序排序

我已经设法使用该问题中描述的答案解决了大多数问题。但是,仍然存在排序无法按预期工作的情况。

这是我的源 XML -

<Sources>
   <name rank="">ABcoop / Jiji Commodities News (Japanese) !RSC!</name>
   <name rank="">ABcoop Treasury &amp; 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 &amp; 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 &amp; 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 代码点排序规则正确排序。我正在尝试找到适用于所有情况的解决方案。

4

2 回答 2

1

您正在按 rank 属性排序,但这在每个元素中具有相同的值。

于 2012-12-19T17:26:21.737 回答
0

尝试将 lang="en" 添加到 xsl:sort 以获得“英语”排序而不是 unicode 代码点排序。它可能不是你想要的,但它可能会更接近。

于 2012-12-20T00:20:42.383 回答