Java 使用Saxon时未拾取XSLT输入参数?

Java 使用Saxon时未拾取XSLT输入参数?,java,xslt-2.0,saxon,Java,Xslt 2.0,Saxon,我正在将一个简单的字符串参数传递给我的Saxon驱动的XSLT,但它没有被接受 这是XSL(min.XSL): 是的,只是撒克逊人他 奇怪的是,当我删除Saxon依赖项时,参数被提取出来,我得到了预期的结果: <?xml version="1.0" encoding="UTF-8"?><Out>match!</Out> 匹配! 但在使用Saxon时,我会得到“参数不匹配”结果,并用一个空字符串代替参数值: Plugged in Saxon <?xml

我正在将一个简单的字符串参数传递给我的Saxon驱动的XSLT,但它没有被接受

这是XSL(
min.XSL
):

是的,只是撒克逊人他

奇怪的是,当我删除Saxon依赖项时,参数被提取出来,我得到了预期的结果:

<?xml version="1.0" encoding="UTF-8"?><Out>match!</Out>
匹配!
但在使用Saxon时,我会得到“参数不匹配”结果,并用一个空字符串代替参数值:

Plugged in Saxon
<?xml version="1.0" encoding="UTF-8"?><Out>x != </Out>
插入式萨克森 x!= 我犯了什么罪


为了记录在案,我尝试使用更新版本的Saxon(
net.sf.Saxon:Saxon-HE:9.7.x
等),结果相同;但是,在实际项目中,我一直使用
saxon:saxon he:9.2
,因此升级不是一个真正的选项。

您需要将
移动到任何
xsl:template
之外,以便在转换之前将其作为全局参数设置xsl:params,在使用Saxon API的XSLT 3中,您可以直接调用命名模板或函数,并在这样做时设置其参数,但您在JAXP中将模板应用于源的方法并不适用于此。只需使用一个全局参数,即将
xsl:param
移动到任何
xsl:template
之外,并使其成为
xsl:stylesheet/xsl:transform

的子项。我一直都理解,JAXP Transformer.setParameter()只能用于在样式表中设置全局
xsl:param
。然而,到目前为止,JAXP文档与XSLT的任何特定内容都相去甚远,因此可以进行其他解释,而且看起来其他供应商确实对其进行了不同的解释。不幸的是,由于规范中的模糊性而导致的JAXP互操作性问题由来已久。尽管JAXP文档是模糊的,但我认为XSLT 1.0规范的意图相当清楚:§11.4顶级xsl:param元素向样式表声明一个参数;XSLT没有定义将参数传递给样式表的机制。“,§11.6”使用xsl:with param元素将参数传递给模板。“XSLT 2.0对此有规定:§2.3”客户机应用程序传递给转换的参数与样式表参数匹配(参见9.5全局变量和参数),不针对初始模板中声明的模板参数。要执行的初始模板中的所有模板参数将采用其默认值。“谢谢,它成功了!知道为什么原始(非全局)xsl:param在没有Saxon的情况下工作吗(在这种情况下,我相信JDK-1.7附带的
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
将由我负责)?这是默认实现的一些非标准行为吗?@JanakaBandara,我不确定Xalan,无论是JRE/JDK内部化的版本还是Apache的独立版本,当我在deskop进行Java开发时,我需要单独测试,但到目前为止,在XSLT 1处理器上使用API时,我始终使用c考虑到任何
setParameter
或类似的方法都专门用于设置全局参数,而不是将那些本地参数设置为模板。因此,我的理解和推理与Michael Kay在其评论和XSLT规范的例外部分中概述的大致相同。
<dependencies>
    <dependency>
        <groupId>saxon</groupId>
        <artifactId>saxon-he</artifactId>
        <version>9.2</version>
    </dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?><Out>match!</Out>
Plugged in Saxon
<?xml version="1.0" encoding="UTF-8"?><Out>x != </Out>