Java 在另一台机器上 运行 XSLT 处理抛出 TransformerConfigurationException

Java XSLT processing throws TransformerConfigurationException when run on another machine

我正在 运行 安装一个 Java 应用程序,它应该根据 javax.xml.transform.Transformer 进行一些 XSLT 处理。我使用 java-7-openjdk-amd64 在旧笔记本上开发了它。 当我 运行 它在安装了 java-8-openjdk-amd64 的另一台机器上时,T运行sformer 抛出以下异常:

javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected.

XPST0017: XPath syntax error [...] Cannot find a matching 1-argument function named {http://xml.apache.org/xslt/java}java.text.SimpleDateFormat.new() at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:176) at net.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:139) at net.sf.saxon.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:91)

xsl 文件如下所示(省略不重要的细节):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">

  <xsl:template match="/">
    <html>

      <body>
        <h1>Test Report</h1>
        <h2>Test run</a> at         
          [<xsl:value-of
            select="java:format(java:java.text.SimpleDateFormat.new('dd.MM.yyyy HH:mm:ss'), java:java.util.Date.new())" />]
        </h2>

所以 T运行sformer 显然调用 SimpleDateFormat 有问题,但为什么呢?我找不到有关 Java7 与 Java8 的任何信息。我什至把用Jdk7编译的Jar文件复制到另一台机器上运行。同样的问题,所以这似乎是 运行 时间问题。 SO 上有一些关于 java 和 XSLT 的问答,但结果对我没有任何用处。

事实证明,这个声明 <xsl:stylesheet version="2.0" 并不能确保实际使用 XSLT v2.0。 javax.xml.transform.Transformer "secretly" 在旧机器上使用 XSLT v1.0(java-7-openjdk-amd64),在另一台机器上使用 XSLT v2.0 和 Saxon v9.1.0(java-8-openjdk-amd64)。

依赖项是在编译时由 maven pom.xml 设置的。但显然,当 运行 它与 Jre7 一起使用时,这没有任何效果。我本可以通过查看堆栈跟踪 (net.sf.saxon.TransformerFactoryImpl) 注意到它,但由于之前没有错误,我不知道任何特定的 TransformerFactory 实现。