当前位置: 首页 > 面试题库 >

如何在Java中将Saxon设置为Xslt处理器?

景修杰
2023-03-14
问题内容

这是一个简单的问题,但我找不到答案。我正在尝试使用Java处理XSLT 2.0样式表。它依赖于Saxon的XSL元素。

我当前的班级可以在简单的XSLT 1.0上正常工作,但是在用Saxon构建的2.0 XSLT上出现无法识别元素的错误。

我不知道如何告诉Java将Saxon用作处理器。我在课堂上使用javax.xml.transform。这是我可以设置的属性吗?我该怎么设置?谢谢!

编辑后, 我弄清楚了如何设置该属性以使用Saxon,但是现在出现此错误。

Provider net.sf.saxon.TransformerFactoryImpl not found

如何在我的应用程序中包含Saxon?


问题答案:

有多种方法可以执行此操作(按查找优先级顺序):

直接实例化

显式实例化Saxon工厂(对Michael在上面的评论致意):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

这种方法意味着您的代码在编译时被锁定为无法使用Saxon。 这可以看作是优势(没有风险使用错误的处理器运行)或劣势(没有机会在执行时配置其他处理器-
甚至没有Saxon Enterprise Edition)。

对于Saxon-PE,替代com.saxonica.config.ProfessionalTransformerFactory。对于Saxon-
EE,替代com.saxonica.config.EnterpriseTransformerFactory

指定班级名称

在构造工厂类时指定它:

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);

注意:从Java
6开始可用
。在Java
5的版本没有此方法。

这种方法使您可以在执行时选择处理器,同时仍然避免了类路径搜索的成本和风险。
例如,您的应用程序可以提供一些配置机制,以通过在各种Saxon工厂类之间进行选择来使其与不同的Saxon版本一起运行。

使用系统属性

javax.xml.transform.TransformerFactory在创建实例之前设置系统属性:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

或在命令行上(为便于阅读而中断行):

java -Djavax.xml.transform.TransformerFactory=
        cnet.sf.saxon.TransformerFactoryImpl YourApp

这种方法的缺点是系统属性会影响整个Java VM。
设置此属性以选择Saxon可能意味着您甚至可能不知道的应用程序中的其他模块开始使用Saxon而不是Xalan,并且如果该模块使用特定于Xalan的XSLT构造,则该模块可能会失败。

使用属性文件

创建以下文件:

JRE/lib/jaxp.properties

具有以下内容:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

这种方法具有与使用系统属性相似的结果。

服务加载器

在CLASSPATH上的任何JAR中创建以下文件:

META-INF/services/javax.xml.transform.TransformerFactory

具有以下内容:

net.sf.saxon.TransformerFactoryImpl

这种方法的缺点是,对类路径进行小的更改可能会导致应用程序使用其他XSLT引擎运行,而该引擎可能从未经过过测试。

平台默认

如果以上都不做,则将TransformerFactory加载平台默认实例。在此处可以找到对该可插入性层的友好描述。

请注意,此处的“平台”是指Java VM,而不是其运行的硬件或操作系统。 对于所有当前已知的Java VM,平台默认为Xalan版本(仅支持XSLT
1.0)。无法保证将来所有Java VM都会如此。

我认为这个答案是反对Java做事的一种说法。



 类似资料:
  • 我必须使用 XSLT 2.0 处理器来实现字符串操作函数,如 我在 POM 文件中添加了撒克逊的依赖项并运行了“mvn install”命令。通过执行此操作,“saxon-9.1.0.8.jar”被添加到“引用的库”文件夹下。 在代码中,我使用了 当我尝试调用下面一行< code > transformer factory . new instance(" net . SF . Saxon . t

  • 问题内容: 我可以如下设置Firefox的代理设置。 但是我也需要设置Chrome。.有人可以帮助我怎么做吗? 谢谢拉吉 问题答案: 您可以尝试使用该类,如下所示:

  • 问题内容: 谁能建议我如何将.TIF格式的图像存储到该图像并将其添加到列表模型?我试过了,但是给了我。 在这里,我编辑了代码,这是我的错误msg 异常,位于ListImage1.main(ListImage1.java:48)的javax.swing.ImageIcon。(ImageIcon.java:228)的线程“ main”中java.lang.NullPointerException 问题

  • 代码只是简单地将我的变量名设置为字符串“null”,所以我不知道如何让程序等待输入。编译器不允许我在不初始化变量的情况下声明它。

  • 问题内容: 我从这里获得了XSLT:http : //andrewjwelch.com/code/xslt/csv/csv-to- xml_v2.html 并将CSV文件转换为XML文档。在命令行上与以下命令一起使用时,它将执行此操作: java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml 现在,问题变成了: 如何在Ja

  • 主要是从这个问题:XSLT:CSV(或平面文件,或纯文本)到XML 我这里有一个XSLT:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html 它将CSV文件转换为XML文档。当与命令行上的以下命令一起使用时,它会这样做: java-jar saxon9he。jar-xsl:csv到xml。csv-it:main-o:output。xml