将Document作为参数传递给xslt

时间:2014-05-21 09:37:55

标签: java xslt saxon

我正在设置如下参数:

Document doc_23 = createDocument(doc_bytes);
XPathExpression xpe = XPathFactory.newInstance().newXPath().compile("/");
transformer.setParameter("document23",xpe.evaluate(doc_23, XPathConstants.NODESET));

我也试过这个:

transformer.setParameter("document23",new StreamSource(new StringReader(xml_text)));

在我的xslt中,我得到的变量如下:

<xsl:variable name="document23" select="/.."></xsl:variable>

尝试使用它:

 <xsl:for-each select="$document23//Product">
                     <xsl:message>Test<xsl:value-of select="generalDetails/productCode"/></xsl:message>
 </xsl:for-each>

但是我不工作(for-each永远不会输入)。

该文档具有使用&#39;文档(document23.xml)//产品&#39;指定的beacasue元素。确实有效。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我发现一个问题,主要是你使用了<xsl:variable name="document23" select="/.."></xsl:variable>,如果你想定义一个外部参数,那么你需要使用<xsl:param name="document23" select="/.."/>,而不是xsl:variable

答案 1 :(得分:1)

你正在使用DOM和JAXP API,这不是使用Saxon的理想方式:使用Saxon的DOM非常慢,并且JAXP XPath API的类型非常弱,因此您需要具有接口规范以及撒克逊人特有的细节,以便成功使用它。所以我的第一个建议是,如果你致力于撒克逊,那么你最好更好地使用s9api API。

实际上我不明白你为什么要使用XPath接口。您似乎正在尝试运行XPath表达式“/”,它返回您提供的任何输入。这完全没有意义。

如果您确实想使用JAXP转换API(以及setParameter()),可以在此处描述您可以提供的内容:

http://www.saxonica.com/documentation/index.html#!using-xsl/embedding/jaxp-transformation

特别参见开头的段落“可以作为样式表参数提供的对象类型......”这链接到“可扩展性”部分,它告诉你

“如果[...]值是javax.xml.transform.Source(NodeInfo除外)的实例,则从指定的Source对象构建树,并将此树的根节点返回为功能的结果。“

因此,您可以像示例一样为setParameter()方法提供StreamSource或DOMSource。

如果xsl:for-each中的路径表达式似乎没有选择任何内容,请使用xsl:message或xsl:copy-of来显示您要选择的文档;这通常会让你知道出了什么问题。