我正在设置如下参数:
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元素。确实有效。
感谢您的帮助。
答案 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来显示您要选择的文档;这通常会让你知道出了什么问题。