1

我正在使用这个 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

我错过了什么?谢谢。

4

2 回答 2

2

Saxon 9.7 HE 不支持任何 XSLT 3.0 语言功能,为此您需要 PE 或 EE ( http://saxonica.com/html/documentation/xsl-elements/evaluate.html )。您在 9.7 HE 中使用样式表获得的唯一增强version="3.0"是访问 XPath 3.0 表达式(如let)和函数(如serializeor parse-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>
于 2017-03-05T13:43:38.980 回答
1

Martin Honnen 已经很有帮助地指出 (+1) Saxon 9.7 HE 不支持 XSLT 3.0,但我想为未来可能在这方面遇到问题的读者添加另一种可能性:如果 Saxon 9.7 EE 或 PE 无法找到合适的license key,它似乎可以继续使用减少的功能,也许就像在 HE 下一样。

一方面,这种优雅的降级可能会有所帮助,但另一方面,它也可能会让许可的 EE 或 PE 用户感到困惑,因为他们在未能将许可证密钥文件正确放置在新的机器设置。

于 2017-03-06T21:06:41.863 回答