有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

XSLT2.0使Saxon在从Java运行时生成新的结果文档

我正在尝试从java运行Saxon HE,使用可以在Saxon资源中找到的代码。我已经尝试过修改它,这样它就不会从java代码创建一个传统的文件,而是让xslt文件通过使用“结果文档”来实现这一点

我的xslt在Altova XMLSpy中确实按预期工作,但我想看看是否可以让Saxon做同样的事情-在那里没有运气,除了巨大的头痛和大量的挫折以及希望Python很快会得到支持之外

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

当我用谷歌搜索它时,我发现一个答案是找不到基本uri,但却看不到如何设置基本uri

所以我的第一个问题是:基本uri集在哪里?它是在java类中还是在xslt文件中?我看不出在xslt文件中应该在哪里设置它,所以我猜我必须将它设置为编译器/转换器的属性

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

在使用Altova的文件中,我以某种方式获取要转换的源xml文件的基本uri,然后将输出定向到相对目录。在Saxon中,基本uri似乎获得xslt文件的位置。。。不知道为什么会这样。 设置绝对路径时,我会收到一个错误,说明我正在使用未知协议。因此,我在路径之前输入了“file://”。现在我收到一条警告,抱怨一个文档在xslt文件路径和我在转换过程中使用的查找路径连接的路径上不可用

正如你所看到的,我在这里到处都是,所以一些指导方针和帮助将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    有两个用于运行Saxon转换的api,您还没有说您正在使用其中的哪一个

    无论哪种方式,xsl:result文档的href属性中使用的相对URI都是相对于转换的“基本输出URI”解析的

    如果您使用的是JAXP转换API,那么它是为XSLT1.0设计的,XSLT1.0无法识别基本输出URI的概念。因此,Saxon使用提供的JAXP结果对象的SystemID作为转换的目标。如果JAXP结果对象没有系统ID,例如,如果您提供的DOMResult或StreamResult没有指定系统ID,则可能会出现错误

    相比之下,s9api是为XSLT2.0设计的(带有3.0的扩展),因此它的XsltTransformer对象有一个显式的setBaseOutputURI()方法

    如果你做了一些事情,但没有成功,那么请确切地告诉我们你做了什么,以及它是如何失败的,然后我们可以帮助你下次做对。调试我们看不见的代码很困难