将文档作为参数传递给xslt

3
我正在这样设置参数:

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从未被执行)。
文档中包含指定的元素,因为使用“document(document23.xml)//Product”可以正常工作。
谢谢您的帮助。
2个回答

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

谢谢,但是我修复后仍然无法显示参数。 - Michael A
使用<xsl:copy-of select="$document23"/>开始调试它,如果你传入的是DOM节点,那么它应该输出完整的文档,就我所理解的。 - Martin Honnen
是的,这就是我尝试的,但它不会打印任何内容。我还确认了作为参数传递的文档不为空,并且可以使用xpath查询。 - Michael A
请编辑您的帖子,包括您使用的Saxon版本的详细信息以及一个小而完整的示例,以便其他人可以重现该问题,然后希望来自Saxonica的某个人告诉您缺少什么。 - Martin Honnen

1
您正在使用DOM和JAXP API,这不是使用Saxon的理想方式:DOM在Saxon中非常缓慢,而JAXP XPath API类型弱,因此您需要同时掌握接口规范和Saxon特定的细节才能成功使用。因此,我的第一个建议是,如果您致力于使用Saxon,则最好优先使用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将您正在尝试选择的文档显示出来;这通常会给您一个提示,说明问题出在哪里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接