我编写了一个利用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?
跟进:
所以这些方法都不起作用(除了将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
答案 0 :(得分:2)
答案 1 :(得分:2)
查看TransformerFactory.newInstance()的javadoc,了解配置工厂的所有可能方法。
答案 2 :(得分:2)
您发布的最后一个示例(w / o -Djavax ...)有效,因为META-INF / services目录包含名为
的文件java.xml.transform.TransformerFactory
内容
net.sf.saxon.TransformerFactoryImpl
使用
的原因java -cp lib/saxon9.jar;myjar.jar
有效,
java -cp lib/saxon9.jar -jar myjar.jar
不是使用-jar选项告诉java(w).exe忽略命令行的其余部分并从jar的清单文件中提取所有内容(包括类路径)。如果你把saxon9.jar放在你的jar清单的类路径中它应该可以工作。
Manifest-Version: 1.0
Main-Class: net.my.MainClass
Class-Path: lib/saxon9.jar
答案 3 :(得分:1)
此系统属性应设置替换TransformerFactory:
java -Djavax.xml.transform.TransformerFactory=com.foobar.AcmeTransformer MyApp
我相信你想要的工厂类是 net.sf.saxon.TransformerFactoryImpl
答案 4 :(得分:0)
怎么样
java -Xbootclasspath:lib/saxon9.jar -classpath . -jar myApp.jar