繁体   English   中英

将setParameter与节点集一起使用时,会引发异常“从java.lang.String到节点集的无效转换”

[英]When using setParameter with a node-set, it raises exception “Invalid conversion from java.lang.String to node-set”

我试图通过从我的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>

请帮我解决这个问题。

这是一个老问题,但我认为它仍然值得回答。

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。 然后在Transformer上安装URIResolver 应该实现URIResolver.resolve方法来查找该URI并返回一个类似于上面描述的DOMSource

此外,可以覆盖setParameter方法以使用URIResolver注册Node以使其正确使用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM