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

我将一个简单的字符串参数传递给我的 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是我的部分pom.xml:


<dependencies>

    <dependency>

        <groupId>saxon</groupId>

        <artifactId>saxon-he</artifactId>

        <version>9.2</version>

    </dependency>

</dependencies>

是的,只是saxon-he。


我在这里犯了什么罪?


作为记录,我尝试使用较新版本的 Saxon(net.sf.saxon:Saxon-HE:9.7.x等),结果相同;但是在实际项目中我被困住了saxon:saxon-he:9.2所以升级并不是一个真正的选择。


慕尼黑5688855
浏览 180回答 1
1回答

慕斯709654

您需要移动<xsl:param name="in"/>any的外部xsl:template以将其作为可以在转换之前设置的全局参数。xsl:param内部模板不能由 JAXP 转换 API 设置,在带有 Saxon API 的 XSLT 3 中,您可以直接调用命名模板或函数并在这样做时设置其参数,但是您在 JAXP 中将模板应用于源的方法并不适用于此.&nbsp;只需使用全局参数,即移动xsl:paramany的外部xsl:template并使其成为 的子项xsl:stylesheet/xsl:transform。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java