5

我正在尝试通过从我的 java 代码中调用 XSLT 来转换 XML。我在将 XML 字符串作为参数传递给 XSLT 时遇到问题。这会导致异常:从“java.lang.String”到“node-set”的无效转换。

这是调用 XSLT 的方法:

Transformer l_transformer
=TransformerFactory.newInstance().newTransformer(xslt_file_path);
l_transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
l_transformer.setParameter("collateralDoc", param_xmlString);

StringWriter l_writer = new StringWriter();
StringReader l_reader = new StringReader(inputXML);

Source l_in = new StreamSource(l_reader);
Result l_out = new StreamResult(l_writer);

l_transformer.transform(l_in, l_out);

在搜索了一些解决方案后,我什至尝试从 param XML 字符串创建一个 Document 对象,并将 Document 对象传递给 setParameter 对象。然后我得到了这个例外:

从“com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl”到“node-set”的无效转换。

处理此输入 XML 参数的 XSLT 代码和引发异常的行: <xsl:variable name="infoList" select="$paramXML/a/b"/>

我需要作为参数传递的参数 XML 如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b>
        <c>
            <d>blah</d>
            <e>blah</e>
        </c>
        <f>
            <g>blah</g>
            <h>blah</h>
        </f>
    </b>
</a>

请帮助我解决问题。

4

1 回答 1

2

这是一个古老的问题,尽管我认为它仍然值得回答。

JDK 的默认实现使用 Xalan-J。早在 2005 年,Jira 就针对 Xalan 2.7 提出了一个问题,要求支持传递节点或文档对象。在过去的 10 年里,这个问题还没有得到解决,尽管评论表明它“很容易做到”。

但是,上述问题表明可以传递 DOM 树。事实上,以下似乎有效:

String doc = "<root>Hello world!</root>";
transformer.setParameter("mydoc", new StreamSource(new StringReader(doc)));

如果由于某种原因您无法切换到功能更强大的 XSLT 处理器,例如 Saxon,您还可以考虑另一种相对简单的解决方法,我引用:

一种解决方法是在您的样式表中使用您选择的 URI 中的文档函数。URIResolver然后在Transformer上安装一个。URIResolver.resolve应该实现该方法以查找该 URI 并返回DOMSource您在上面描述的那个。

此外,您可以覆盖setParameter使用 URIResolver 注册节点的方法,以使其使用正交。

在这个关于同一主题的 SO 的答案中给出了一些替代的解决方法。

于 2015-09-13T20:04:13.670 回答