在Java中使用Saxon进行XSLT 2.0排序

时间:2012-12-19 15:21:02

标签: xslt saxon

这是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 &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>

编辑:附加信息,因为一些答案建议我使用默认排序规则(删除default-collat​​ion属性)或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代码点排序规则未正确排序

。我试图找到一个适用于所有情况的解决方案。

2 个答案:

答案 0 :(得分:1)

您按rank属性排序,但每个元素的值都相同。

答案 1 :(得分:0)

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