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 接口作为替代。
我正在使用 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 接口作为替代。