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

时间:2018-09-17 17:24:03

标签: java xslt-2.0 saxon

我正在将一个简单的字符串参数传递给由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));
    }
}

这是我的dependencies的{​​{1}}部分:

pom.xml

是的,只是<dependencies> <dependency> <groupId>saxon</groupId> <artifactId>saxon-he</artifactId> <version>9.2</version> </dependency> </dependencies>

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

saxon-he

但是当使用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> 等),结果相同;但是在实际项目中,我坚持使用net.sf.saxon:Saxon-HE:9.7.x,因此升级并不是真正的选择。

1 个答案:

答案 0 :(得分:1)

您需要将<xsl:param name="in"/>移到任何xsl:template之外,才能将其作为可在转换前设置的全局参数。模板内部的xsl:param不能由JAXP转换API设置,在具有Saxon API的XSLT 3中,您可以直接调用命名的模板或函数并设置其参数,但是在JAXP中将模板应用于Source的方法不是为了那个。只需使用全局参数,即可将xsl:param移到任何xsl:template的外面,并使其成为xsl:stylesheet/xsl:transform的子元素。