Входной параметр XSLT не обнаружен, когда используется Saxon? - PullRequest
0 голосов
/ 17 сентября 2018

Я передаю простой строковый параметр в мой саксонский 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.

Странно, когда я удаляю зависимость саксонской, параметр выбирается, и я получаю ожидаемый результат:

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

Но когда Saxon используется, я получаю результат «несоответствие параметров» с пустой строкойвместо значения параметра:

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, поэтому обновление не является возможным вариантом.

1 Ответ

0 голосов
/ 17 сентября 2018

Вам нужно переместить <xsl:param name="in"/> за пределы любого xsl:template, чтобы иметь его в качестве глобального параметра, который вы можете установить до преобразования.Внутренние шаблоны xsl:param не устанавливаются API-интерфейсом преобразования JAXP, в XSLT 3 с API-интерфейсом Saxon вы можете напрямую вызывать именованный шаблон или функцию и задавать их параметры, но ваш подход с применением шаблонов к источнику в JAXP не являетсяпредназначено для этого.Просто используйте глобальный параметр, то есть переместите xsl:param за пределы любого xsl:template и сделайте его дочерним по отношению к xsl:stylesheet/xsl:transform.

...