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 实现。
我正在 运行 安装一个 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 实现。