與使用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測試程序,輸出我回來只包含一個價值;安大略省。我不知道爲什麼我會得到這種差異。
你在用什麼處理器? Java的版本可能不是XSLT 2.0,因此您的value-of中的分隔符選項可能不起作用。 –