不能在Saxon 9.7中使用<xsl:evaluate>

时间:2017-03-04 21:08:30

标签: saxon xslt-3.0

我正在使用此POM片段运行XML Maven插件:

    <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xml-maven-plugin</artifactId>
            <version>1.0.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>transform</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <transformationSets>
                    <transformationSet>
                        <dir>${basedir}/target/xml</dir>
                        <stylesheet>${basedir}/target/typesetting/fop/xslt/PhotoBook-fo.xslt</stylesheet>
                    </transformationSet>
                </transformationSets>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>net.sf.saxon</groupId>
                    <artifactId>Saxon-HE</artifactId>
                    <version>9.7.0-15</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

样式表包含一个功能<xsl:evaluate>,它是XSLT 3.0的一部分,据我所知,它在Saxon-HE 9.7.0中得到支持。样式表正确声明了XSLT版本:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="3.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:fo="http://www.w3.org/1999/XSL/Format"
            xmlns:xhtml="http://www.w3.org/1999/xhtml">

但处理这个片段:

        <xsl:for-each select="xhtml:tr[1]/xhtml:td">
            <xsl:element name="table-column" namespace="http://www.w3.org/1999/XSL/Format">
                <xsl:attribute name="column-width">
                    <xsl:evaluate select="@width"/>
                </xsl:attribute>
            </xsl:element>
        </xsl:for-each>

我得到了

[INFO] --- xml-maven-plugin:1.0.1:transform (default) @ birds-portfolio-1 ---
Static error at xsl:evaluate on line 132 column 56 of xhtml5-fo.xslt:  
XTSE0010: Unknown XSLT element: evaluate

我错过了什么?感谢。

2 个答案:

答案 0 :(得分:2)

Saxon 9.7 HE不支持任何XSLT 3.0语言功能,您需要PE或EE(http://saxonica.com/html/documentation/xsl-elements/evaluate.html)。您使用version="3.0"样式表在9.7 HE中获得的唯一增强功能是访问XPath 3.0表达式(如let)和函数(如serializeparse-xml)。

至于您的代码,您确定需要xsl:evaluate吗?似乎

            <xsl:attribute name="column-width" select="@width"/>

可能就足够了,除非您的width属性包含您需要评估的XPath表达式。

我甚至会替换

    <xsl:for-each select="xhtml:tr[1]/xhtml:td">
        <xsl:element name="table-column" namespace="http://www.w3.org/1999/XSL/Format">
            <xsl:attribute name="column-width">
                <xsl:evaluate select="@width"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:for-each>

    <xsl:for-each select="xhtml:tr[1]/xhtml:td">
        <table-column xmlns="http://www.w3.org/1999/XSL/Format" column-width="{@width}"/>
    </xsl:for-each>

答案 1 :(得分:1)

Martin Honnen已经有用地指出(+1)Saxon 9.7 HE不支持XSLT 3.0,但我想为未来可能在这方面遇到问题的读者增加另一种可能性:如果Saxon 9.7 EE或PE未能找到一个合适的许可证密钥,它似乎继续使用减少的功能,可能与HE一样。

一方面,这种优雅的降级可能会有所帮助,但另一方面,对于未能正确放置许可证密钥文件时不期望此行为的许可EE或PE用户也会造成混淆在新的机器设置上。