当 运行 来自 Java 时使 Saxon 生成新的结果文档

Making Saxon produce new result document when run from Java

我正在尝试 运行 来自 java 的 Saxon HE,使用可以在 Saxon 资源中找到的代码。我已经尝试更改它,以便它不会从 java 代码创建附加文件,而是让 xslt 文件通过使用 "result-document".

来执行此操作

我的 xslt 在 Altova XMLSpy 中确实按预期工作,但我想看看我是否能让 Saxon 做同样的事情 - 运气不好,除了剧烈的头痛和大量的挫折感以及许多希望 Python 很快就会得到支持...

我收到以下错误消息:主要输出文件的系统标识符未知。

当我 google 它时,我找到了找不到基本 uri 的答案,但是在任何地方都看不到如何设置基本 uri...

所以我的第一个问题是:基本 uri 设置在哪里?它是在 java class 中还是在 xslt 文件中?我看不到我将在 xslt 文件中设置它的位置,所以我的猜测是我必须将它设置为 compiler/transformer?

的 属性

另一个问题是关于结果文档的实际 href 属性。如果我想指向一个相对路径,语法是什么,也许示例是什么样的? 那么绝对路径呢?

在我在 Altova 中运行的文件中,我以某种方式获取了要转换的源 xml 文件的基本 uri,然后我将输出定向到相关目录。在撒克逊语中,基本 uri 似乎反而获得了 xslt 文件的位置......不知道为什么会这样。 设置绝对路径时,我收到一条错误消息,指出我正在使用未知协议。所以我在路径前输入了"file:///"。现在我收到一条警告,抱怨在 xslt 文件路径和我在转换过程中使用的查找路径连接的路径上没有可用的文档。

如您所见,我到处都是,因此非常感谢一些指南和帮助。

有两个 API 用于 运行 撒克逊变换,您还没有说您使用的是哪一个。

无论哪种方式,xsl:result-文档的 href 属性中使用的相对 URI 都是相对于转换的 "base output URI" 解析的。

如果您使用的是 JAXP 转换 API,这是为 XSLT 1.0 设计的,它不识别基本输出 URI 的概念。因此,Saxon 使用提供的 JAXP 结果对象的 SystemID 作为转换的目标。如果 JAXP 结果对象没有系统 ID,例如,如果您提供未指定系统 ID 的 DOMResult 或 StreamResult,则可能会出错。

相比之下,s9api API 是为 XSLT 2.0(具有 3.0 的扩展)设计的,因此它的 XsltTransformer 对象有一个明确的 setBaseOutputURI() 方法。

如果您做了某事但没有奏效,请准确告诉我们您做了什么以及失败的确切原因,然后我们可以帮助您下​​次做对。很难调试我们看不到的代码。