Java 撒克逊解析

Java Saxon Parsing

我正在使用 Saxon 解析器将大文件拆分成较小的文件。 下面是我的示例代码,

  TransformerFactory tFactory = TransformerFactory.newInstance();
           Transformer transformer = tFactory
                    .newTransformer(new StreamSource(new File(xsltPath)));
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            transformer.transform(new StreamSource(new File(sourcePath)),
                    new StreamResult(new File(resultDir)));

Where sourcePath = C:/path/Temp/AppModule.xml xsltPath = C:/path/Temp/create-fragment.xslt resultDir = C:/path/Temp/

此代码完美地将 AppModule.xml 拆分为更小的 xml 文件,但在控制台中有例外,

Error java.io.FileNotFoundException: C:\path\Temp (Access is denied) net.sf.saxon.trans.XPathException: java.io.FileNotFoundException: C:\path\Temp (Access is denied)

我用谷歌搜索,发现我应该为新的 File() 方法指定确切的文件名。但是正如您所见,我在编译时不知道文件名,仅在 运行 期间解析器识别输入 AppModule.xml 并将 xml 拆分为名称为 value 的较小文件在其中标记。

AppModule.xml

    <?xml version='1.0' encoding='UTF-8'?>
<data>
<value>A1</value>
<value>B1</value>
<value>C1</value>
<value>A2</value>
<value>B2</value>
<value>C2</value>
</data>

输出: A1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<test>A1</test>

同样会对应创建B1,c1,A2,B2,C2文件。

请分享您的宝贵意见。

您在结果对象中提供的文件不应是目录。如果转换不产生 "primary" 输出文件,而仅使用 xsl:result-document 产生输出,那么您应该将结果文件指定为类似 new File("c:/path/temp/dummy.xml") 的文件。此文件将用作 "base output URI" 来解析 xsl:result-document/@href.

中提供的任何相对文件名

您正在使用的 API 称为 JAXP,问题是它是为 XSLT 1.0 设计的,您只能有一个结果文档。 Saxon 曾尝试扩展 JAXP 中的概念以使其与 XSLT 2.0 一起工作,但它并不是真正为这项工作而设计的。您可能想看看 Saxon 的 s9api 接口作为替代。