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

XSLT input parameter not picked up when Saxon is in use?

我将一个简单的字符串参数传递到我的 Saxon 驱动的 XSLT,但它没有被接收。

这是 XSL (min.xsl):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">
    <xsl:template match="/">
        <xsl:param name="in"/>
        <Out>
            <xsl:choose>
                <xsl:when test="Val = $in">match!</xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="Val"/> != <xsl:value-of select="$in"/>
                </xsl:otherwise>
            </xsl:choose>
        </Out>
    </xsl:template>
</xsl:stylesheet>

下面是用于调用 XSLT 的代码:

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.FileInputStream;
import java.io.StringReader;

public class MinXSLT {
    public static void main(String[] args) throws Exception {
        try {
            Class.forName("net.sf.saxon.TransformerFactoryImpl");
            System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
            System.out.println("Plugged in Saxon");
        } catch (ClassNotFoundException ignore) {}

        final TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer e = transformerFactory.newTemplates(new StreamSource(new FileInputStream("src/test/resources/min.xsl"))).newTransformer();
        e.setParameter("in", "x");
        e.transform(new StreamSource(new StringReader("<Val>x</Val>")), new StreamResult(System.out));
    }
}

这是我的 pom.xmldependencies 部分:

<dependencies>
    <dependency>
        <groupId>saxon</groupId>
        <artifactId>saxon-he</artifactId>
        <version>9.2</version>
    </dependency>
</dependencies>

是的,只是 saxon-he

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

<?xml version="1.0" encoding="UTF-8"?><Out>match!</Out>

但是当使用 Saxon 时,我得到 'parameter mismatch' 结果,用一个空字符串代替参数值:

Plugged in Saxon
<?xml version="1.0" encoding="UTF-8"?><Out>x != </Out>

我在这里犯了什么罪?

郑重声明,我尝试使用较新版本的 Saxon(net.sf.saxon:Saxon-HE:9.7.x 等),结果相同;然而在实际项目中,我坚持 saxon:saxon-he:9.2 所以升级并不是一个真正的选择。

您需要将 <xsl:param name="in"/> 移到任何 xsl:template 之外,以将其作为您可以在转换前设置的全局参数。 JAXP 转换 API 无法设置模板内的 xsl:param,在带有撒克逊 API 的 XSLT 3 中,您可以直接调用命名模板或函数并在这样做时设置其参数,但是您的方法将模板应用于 JAXP 中的 Source 并不是为了那个。只需使用一个全局参数,即将 xsl:param 移到任何 xsl:template 之外并使其成为 xsl:stylesheet/xsl:transform.

的子项