2013-09-24 17 views
0

與使用XML Spy進行測試相比,在將Java應用程序的XSLT應用程序時發生不一致的行爲。特別是,在使用Java時,xsl:for-each指令似乎不會遍歷整個列表。使用XML Spy進行測試時情況並非如此。xsl:for-each在Java中的錯誤行爲

我的XML文檔:

<metadata xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <maps> 
     <geographicCoverages> 
      <coverage key="ON">Ontario</coverage> 
      <coverage key="MB">Manitoba</coverage> 
      <coverage key="SK">Saskatchewan</coverage> 
      <coverage key="AB">Alberta</coverage> 
      <coverage key="BC">British Columbia</coverage> 
      <coverage key="YT">Yukon</coverage> 
      <coverage key="NU">Nunavut</coverage> 
     </geographicCoverages> 
    </maps> 
    <entry> 
    <string>GEO_COVERAGE</string> 
    <list> 
     <string>BC</string> 
     <string>ON</string> 
    </list> 
    </entry> 
    ... 
</metadata> 

我的XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
<xsl:output method="text" version="1.0" indent="yes"/> 

<xsl:key name="geoCoverageKey" match="metadata/maps/geographicCoverages/coverage" use="@key" /> 

<xsl:template match="/metadata"> 

<xsl:for-each select="entry[string='GEO_COVERAGE']/list"> 
    <xsl:value-of select="key('geoCoverageKey', string)" separator=", " /> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

當我測試用的XMLSpy上述XSLT,我得到我預期的輸出:

Ontario, British Columbia 

我的Java測試程序:

public static void main(String[] args) throws TransformerException { 
    String xsltPath = "test_migration.xslt"; 
    String xmlPath = "test-migration.xml"; 
    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    Transformer transformer = tFactory.newTransformer(new StreamSource(xsltPath)); 

    StreamResult result = new StreamResult(new StringWriter()); 

    transformer.transform(new StreamSource(xmlPath), result); 
    System.out.println(result.getWriter().toString()); 
} 

然而,當我運行上面的Java測試程序,輸出我回來只包含一個價值;安大略省。我不知道爲什麼我會得到這種差異。

+0

你在用什麼處理器? Java的版本可能不是XSLT 2.0,因此您的value-of中的分隔符選項可能不起作用。 –

回答

0

JDK中的默認處理器是Xalan。 Xalan是一款XSLT 1.0處理器。當XSLT 1.0處理器被賦予一個指定版本=「2.0」的樣式表時,需要(在XSLT 1.0處理器的規則下)忽略XSLT 1.0中未定義的屬性。 「分隔符」屬性屬於這個類別。在XSLT 1.0中,xsl:value-of輸出節點集中的第一個節點,並忽略其餘節點。

答案是安裝Saxon,它提供Java中的XSLT 2.0處理。

+0

你是絕對正確的,在一天左右的時間內我已經達到了同樣的解決方案。雖然你的詳細解釋填補了空白的原因。謝謝一堆! –