2013-06-18 32 views
1

由於某種原因,很簡單的xsl:sort對我來說不起作用。 (道歉,如果我犯愚蠢的錯誤)xsl:sort在JDK 1.6中不起作用/默認xalan 2.7.0

我在JDK 1.6中打擊這個奇怪的巫術魔術行爲(檢查我的xalan版本是2.7.0)。從java運行時,以下xml,xslt,xsl:sort不起作用。

在我的代碼中,xslt被編譯和緩存,每次我都會得到一個Template來進行轉換。

這是我的xml:

<?xml version="1.0" encoding="UTF-8"?> 
<stats> 
    <matches> 
     <match> 
      <goal>10</goal> 
      <goal>2</goal> 
      <goal>30</goal> 
      <goal>344</goal> 
      <goal>59</goal> 
      <goal>6</goal> 
      <goal>27</goal> 
      <goal>18</goal> 
      <goal>999</goal> 
     </match> 
    </matches> 
</stats> 

和XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:template name="min"> 
     <xsl:param name="nodes" /> 
     <xsl:for-each select="$nodes"> 
      <xsl:sort data-type="number" /> 
      <xsl:if test="position() = 1"> 
       <xsl:element name="result"> 
        <xsl:value-of select="number(.)" /> 
       </xsl:element> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="max"> 
     <xsl:param name="nodes" /> 
     <xsl:for-each select="$nodes"> 
      <xsl:sort data-type="number" order="descending" /> 
      <xsl:if test="position() = 1"> 
       <xsl:element name="result"> 
        <xsl:value-of select="number(.)" /> 
       </xsl:element> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:variable name="tails" 
      select="/stats/matches/match/goal" /> 
     <xsl:call-template name="min"> 
      <xsl:with-param name="nodes" select="$tails" /> 
     </xsl:call-template> 
     <xsl:call-template name="max"> 
      <xsl:with-param name="nodes" select="$tails" /> 
     </xsl:call-template> 
    </xsl:template> 
<xsl:template match="text()" /> 
</xsl:stylesheet> 

沒有得到預期的輸出低於我的java程序:

<?xml version="1.0" encoding="UTF-8"?> 
<result>2</result> 
<result>999</result> 

- - 爲我的測試Java程序編輯添加的代碼----

import java.io.File; 
import java.io.StringWriter; 
import javax.xml.transform.Templates; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class XsltTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     System.out.print("XsltTest"); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     try { 
      Templates templates = tf.newTemplates(new StreamSource(new File(
        "src/main/resources/test.xsl"))); 
      Transformer tr = templates.newTransformer(); 
      StringWriter sw = new StringWriter(); 
      tr.transform(new StreamSource(new File("src/main/resources/test.xml")), new StreamResult(sw)); 
      System.out.println(); 
      System.out.println(sw.toString()); 

     } catch (Exception e) { 
      System.err.print(e); 
     } 

    } 

} 
+0

你的代碼看起來是正確的,應該工作。你可以嘗試在你的排序中明確指定一個'select'屬性('')? – Tomalak

+0

一個不合格的「它不起作用」對試圖幫助你的人非常討厭。當您嘗試XSLT時會得到什麼結果? – JLRishe

+0

@Tomalak感謝您的建議。我試着明確指定一個選擇屬性。仍然不起作用。我添加了用於我的測試程序的java代碼。 – Sanjit

回答

2

我可以證實這工作與撒克遜9.5的預期。所以我不認爲你的代碼有什麼問題。因此,無論您使用的Xalan版本有錯誤,還是錯誤地調用錯誤。 (如果你告訴我們它是如何失敗的,而不是隻是說「這是行不通的」,那麼我們將有一個線索。)

有沒有合理的理由來使用的Xalan這些天,比它的便利性等嵌入在JDK中。它沒有更新多年,沒有人修復這些錯誤。它只提供XSLT 1.0,這嚴重限制了你可以做的事情。切換到撒克遜。