【发布时间】:2019-07-08 21:45:31
【问题描述】:
我正在寻找 SAXON 中当前可用的 doc() 功能的扩展,它不会从文件系统或 http 网络中读取 XML,而是从我拥有这些 xml 的内存中读取 XML。
我想使用的方式是这样的:
mydoc('id')/root/subroot/@myattr
或
doc('mydoc://id')/root/subroot/@myattr
到目前为止我所考虑的:
- 使用 queryEvaluator.setContextItem() - 不能解决我的用例,因为我可以在一个查询中拥有多个 XML 源
- 在 Java 中注册一些自己的 URL 方案协议 - 在我看来有点矫枉过正,我从来没有这样做过
- 编写自己的 ExtensionFunction - 到目前为止似乎是正确的方法,但我很困惑我应该使用 ExtensionFunction 还是 ExtensionFunctionDefinition。此外,我对 Doc_1 和 Doc Saxonica 源代码有点困惑,因为它使用了 Atomizer 和其他未知的内部东西。
所以问题是:
- 变体 3 是最好的变体(为了简单起见)还是您会推荐其他方法?
- 可以使用 ExtensionFunction 并从我的内存中的 xmls 中返回 XdmNode 吗?在我看来它应该可以工作,但我真的不想涉足一些边缘情况或撒克逊雷区。
经验丰富的撒克逊用户的任何评论将不胜感激。
【问题讨论】:
-
可以使用saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/…设置自己的JAXP接口实现URIResolver docs.oracle.com/javase/8/docs/api/javax/xml/transform/…
-
实现 URIResolver 的一个示例在在线书籍 cafeconleche.org/books/xmljava/chapters/ch17s02.html#d0e32363 中,这与 Saxon 无关,但由于 Saxon 使用作为 JRE/JDK 标准库一部分的 JAXP 接口,该示例应用作如果您想查看如何实现接口的示例,这是一个很好的起点。
-
@MartinHonnen 感谢您指出如何使用和实现 URIResolver,我将采用这种方式,因为它比我想象的更简单