使用Java进行XSLT处理:在参数中传递xml内容

我想在处理XSLT时传递包含XML内容的参数。 这是我的代码:

import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; File xmlFile = new File(xmlFilePath); File xsltFile = new File(xslFilePath); Source xmlSource = new StreamSource(xmlFile); Result result = new StreamResult(System.out); TransformerFactory transFact = TransformerFactory.newInstance(); Transformer trans = transFact.newTransformer(xsltSource); trans.setParameter("foo", "Hello1Hello2"); trans.transform(xmlSource, result); 

然后我想在我的XSL文件中选择’bar’标签中包含的值。

  ...  

但这不起作用,我收到此错误消息:

 org.apache.xpath.objects.XString cannot be cast to org.apache.xpath.objects.XNodeSet 

所以我想我应该将XML对象传递给我的setParameter方法,但是哪一个? 我找不到一个如何创建XNodeSet对象的简单示例…

我怎样才能做到这一点? 谢谢。

如果您使用的是Saxon,最简单的解决方案是将StreamSource作为参数值传递:

 setParameter("foo", new StreamSource(new StringReader("baz"))); 

但这可能不适用于其他处理器:JAXP让它实现定义了什么类型的Object可以作为参数值传递。

您可能需要检查XSLT处理器的文档,它允许哪种参数类型以及它是否以及如何允许传入节点而不是字符串。 如果我了解http://www.saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html和http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon /jaxp/TransformerImpl.html#setParameter(java.lang.String,%20java.lang.Object)正确然后Saxon允许您以NodeInfo的forms传入节点。