xsl排序奇怪的行为

时间:2013-01-02 16:42:32

标签: xml sorting xslt

我在尝试对输入XML进行排序时遇到了一种奇怪的行为:

我的XSL:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


<xsl:output method="xml" 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 collation = "http://www.w3.org/2005/xpath-functions/collation/codepoint"/>    
    </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 collation = "http://www.w3.org/2005/xpath-functions/collation/codepoint" />    
    </xsl:apply-templates>
  </name>
 </xsl:template>
</xsl:stylesheet>

当我的输入XML格式为:

<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name rank="">Continents / Regions (energy)</name>
<name rank="">Continents / Regions</name>
</Sources>

它正确排序为:

<?xml version="1.0" encoding="UTF-8"?>
    <Sources>
    <name rank="">Continents / Regions</name>
    <name rank="">Continents / Regions (energy)</name>    
    </Sources>

但是,当输入为:

<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name rank="">Continents / Regions (energy)
  <name rank="">ABC</name>
</name>
<name rank="">Continents / Regions
  <name rank="">ABC</name>
</name>
</Sources>

输出不正确:

<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name rank="">Continents / Regions (energy)
  <name rank="">ABC</name>
</name>
<name rank="">Continents / Regions
  <name rank="">ABC</name>
</name>
</Sources>

如果有人能指出我应该关注的内容,我将不胜感激。提前谢谢!

编辑:正在使用的XSLT处理器是Saxon HE 9.4。这是我的Java代码。

tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);

Transformer transformer = tFactory.newTransformer(new StreamSource(RCSTestDriver.TestDataPath + "/transform.xslt")); 

2 个答案:

答案 0 :(得分:0)

当我尝试使用

输入文档重现问题时
<?xml version="1.0" encoding="UTF-8"?>
<Sources>
<name>Continents / Regions (energy)
  <name>ABC</name>
</name>
<name>Continents / Regions
  <name>ABC</name>
</name>
</Sources>

发布的样式表和XSLT 2.0处理器Saxon 9.4 HE从命令行运行我无法重现它,而是我得到了输出

<?xml version="1.0" encoding="UTF-8"?>
<Sources>
   <name rank="">Continents / Regions

<name rank="">ABC</name>
   </name>
   <name rank="">Continents / Regions (energy)

<name rank="">ABC</name>
   </name>
</Sources>

答案 1 :(得分:0)

这取决于有多少空白(这很难说明你的帖子)。但字符串值“Continents / Regions ABC”肯定应位于“Continents / Regions(energy)ABC”之前,因为“(”在“A”之前。也许您忽略了“ABC”是您的排序键的一部分?