2012-02-21 34 views
3

我正嘗試在Java中執行XSLT轉換。這裏是樣式表:在大括號中引用變量的樣式表不能編譯

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="person"> 
     <xsl:variable name="varname">info</xsl:variable> 
     <xsl:element name="{$varname}">content</xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

(這是一個非常簡單的例子證明了問題,其實我真的需要定義變量,然後使用它。)。

下面是Java代碼:

DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc=builder.parse(new File("C:\\temp\\test.xsl")); 
DOMSource xsl=new DOMSource(doc); 
Transformer transformer=TransformerFactory.newInstance().newTransformer(xsl); 

運行時,它會發出一個例外:

ERROR: 'Variable or parameter 'varname' is undefined.' 
FATAL ERROR: 'Could not compile stylesheet' 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:824) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:619) 

相同樣式表的其他發動機工作正常(在Internet Explorer中,MSXML,在GNU xsltproc的)。我究竟做錯了什麼?也許這個功能在Java中不被支持?或者,也許我應該首先設置一些參數到TransformerFactory或什麼?

+0

我不能重現此使用JDK 1.6.0_26,也沒有用內置的Xalan版本也不符合xalan的2.7.1,哪個版本是你的使用?也許你還可以包含你的'MyXMLReader'類的相關來源。 – 2012-02-21 10:29:27

+0

@Jörn,我正在使用JDK 1.6.0_24(64位)。 JDK 1.5上的結果相同,僅在堆棧跟蹤中的行號不同。 – 2012-02-21 11:52:32

+0

我編輯了這個問題,用標準類DocumentBuilderFactory替換MyXMLReader,等等。錯誤仍然是一樣的。 – 2012-02-21 12:21:40

回答

2

看來錯誤信息完全是誤導。實際的問題是DocumentBuilder未配置爲可識別名稱空間,因此不能識別xsl:variable聲明。解析器不知何故仍能識別大括號中的表達式。您可以通過啓用感知名稱空間解析的DocumentBuilderFactory解決該問題:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(new File("C:\\temp\\test.xsl")); 
+0

它的工作原理!謝謝Jörn!我懷疑這樣的事情。 – 2012-02-21 12:45:29

相關問題