引用花括号中的变量的样式表无法编译

时间:2012-02-21 09:39:08

标签: java xslt

我正在尝试用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或其他什么?

1 个答案:

答案 0 :(得分: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"));