我正在尝试通过从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);
Run Code Online (Sandbox Code Playgroud)
在搜索了一些解决方案之后,我什至尝试使用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>
Run Code Online (Sandbox Code Playgroud)
请帮助我解决问题。
这是一个老问题,尽管我认为它仍然值得回答。
JDK 的默认实现使用 Xalan-J。早在 2005 年,Jira 就针对 Xalan 2.7 提出了一个问题,要求支持传递节点或文档对象。过去的10年里,这个问题仍未得到解决,尽管评论称这“很容易做到”。
然而,上述问题表明可以传递 DOM 树。事实上,以下方法似乎有效:
String doc = "<root>Hello world!</root>";
transformer.setParameter("mydoc", new StreamSource(new StringReader(doc)));
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您无法切换到功能更强大的 XSLT 处理器,例如 Saxon,您还可以考虑另一种相对简单的解决方法,我引用:
一种解决方法是使用样式表中的文档函数以及您选择的 URI。
URIResolver然后在变压器上安装一个。应该实现该URIResolver.resolve方法来查找该 URI 并返回DOMSource与您上面描述的类似的 URI。
此外,可以重写setParameter向 URIResolver 注册节点的方法,以使其使用正交。
在同一主题的 SO 答案中给出了一些替代解决方法。
| 归档时间: |
|
| 查看次数: |
1809 次 |
| 最近记录: |