6

我编写了一个使用 JAXB 进行 XSL 转换的 Java 应用程序。我在类路径中包含了 saxon9.jar,这样我就可以在命令行上使用 XSLT 2.0 而不是 XSLT 1.0。

java -classpath ./lib/saxon9.jar:./ -jar myApp.jar

我在我的 XSL 中包含了代码来报告使用的 XSLT。

<xsl:comment><xsl:text >
</xsl:text>XSLT Version: <xsl:value-of select="system-property('xsl:version')" /> <xsl:text >
</xsl:text>XSLT Vendor: <xsl:value-of select="system-property('xsl:vendor')" /> <xsl:text >
</xsl:text>XSLT Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /> <xsl:text >
</xsl:text></xsl:comment>

它报告。

XSLT Version: 1.0
XSLT Vendor: Apache Software Foundation (Xalan XSLTC)
XSLT Vendor URL: http://xml.apache.org/xalan-j

这是作为 JVM 一部分的默认实现。

如何让它使用我指定的撒克逊语?


跟进:

所以这些方法都不起作用(除了将 saxon jar 放在 endorsed 目录中),但它们都应该起作用。似乎我使用“-jar myApp.jar”和想要替代 XSLT 实现的组合是不兼容的。换句话说...

java -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./ -jar myApp.jar

...不起作用,但这确实...

java -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./myApp.jar org.dacracot.myApp

...有趣的是,我什至不必指定工厂,我得到了撒克逊版本...

java -classpath ./lib/saxon9.jar:./myApp.jar org.dacracot.myApp

4

5 回答 5

2

查看TransformerFactory.newInstance()的 javadoc,了解配置工厂的所有可能方法。

  1. 系统属性
  2. 库/jaxp.properties
  3. 服务配置文件(可能在 saxon JAR,/META-INF/services/javax.xml.transform.TransformerFactory)
于 2009-02-15T01:51:55.817 回答
2

The last example you posted(w/o -Djavax...) works because the META-INF/services directory contains a file named

java.xml.transform.TransformerFactory

with the content

net.sf.saxon.TransformerFactoryImpl

The reason using

java -cp lib/saxon9.jar;myjar.jar

works and

java -cp lib/saxon9.jar -jar myjar.jar

doesn't is that using the -jar option tells java(w).exe to ignore the rest of the command line and pull everything (classpath included) from the jar's manifest file. If you put saxon9.jar in your jar manifest's classpath it should work.

Manifest-Version: 1.0
Main-Class: net.my.MainClass
Class-Path: lib/saxon9.jar
于 2009-04-13T13:26:19.873 回答
2

您是否尝试过将您的 jar 放在背书目录中?

如果您不希望效果是全局的,请使用以下选项:

-Djava.endorsed.dirs=my_dir

在命令行中。

于 2009-02-13T20:59:48.897 回答
1

此系统属性应设置替换 TransformerFactory:

java -Djavax.xml.transform.TransformerFactory=com.foobar.AcmeTransformer MyApp

我相信你想要的工厂类是net.sf.saxon.TransformerFactoryImpl

于 2009-02-13T21:40:16.600 回答
0

怎么样

java -Xbootclasspath:lib/saxon9.jar -classpath . -jar myApp.jar
于 2009-02-13T21:06:36.150 回答