如何在 saxon 中扩展 doc() 功能
How to extend doc() functionality in saxon
我正在寻找 SAXON 中当前可用的 doc() 功能的扩展,它不会从文件系统或 http 网络中读取 XML,而是从我拥有这些 xml 的内存中读取。
我想要的使用方式是这样的:
mydoc('id')/root/subroot/@myattr
或
doc('mydoc://id')/root/subroot/@myattr
到目前为止我考虑的是:
- 使用 queryEvaluator.setContextItem() - 不能解决我的用例,因为我可以在一个查询中有多个 XML 来源
- 注册一些自己的 URL scheme 协议到 Java - 在我看来有点矫枉过正,我从来没有这样做过
- 编写自己的 ExtensionFunction - 到目前为止似乎是正确的方法,但我很困惑是应该使用 ExtensionFunction 还是 ExtensionFunctionDefinition。此外,我对 Doc_1 和 Doc Saxonica 源代码有点困惑,因为它使用 Atomizer 和其他未知的内部内容。
所以问题是:
- 变体 3 是最好的变体(为了简单起见)还是您会推荐一些其他方法?
- 可以从我的内存 xml 中使用 ExtensionFunction 和 return XdmNode 吗?在我看来它应该可以工作,但我真的不想涉足一些边缘案例或撒克逊雷区。
来自经验丰富的 Saxon 用户的任何评论都将受到赞赏。
执行此操作的标准方法是编写一个URIResolver
并将其注册到转换器。 URIResolver
被调用,提供请求的 URI,它被期望 return 一个源(可以是 StreamSource
、SAXSource
或 DOMSource
,例如)。在这种情况下,您通常会 return 一个 StreamSource
包装一个 StringReader
包装 String
包含 XML.
您同样可以使用扩展函数,但它可能有点复杂。
我正在寻找 SAXON 中当前可用的 doc() 功能的扩展,它不会从文件系统或 http 网络中读取 XML,而是从我拥有这些 xml 的内存中读取。
我想要的使用方式是这样的:
mydoc('id')/root/subroot/@myattr
或
doc('mydoc://id')/root/subroot/@myattr
到目前为止我考虑的是:
- 使用 queryEvaluator.setContextItem() - 不能解决我的用例,因为我可以在一个查询中有多个 XML 来源
- 注册一些自己的 URL scheme 协议到 Java - 在我看来有点矫枉过正,我从来没有这样做过
- 编写自己的 ExtensionFunction - 到目前为止似乎是正确的方法,但我很困惑是应该使用 ExtensionFunction 还是 ExtensionFunctionDefinition。此外,我对 Doc_1 和 Doc Saxonica 源代码有点困惑,因为它使用 Atomizer 和其他未知的内部内容。
所以问题是:
- 变体 3 是最好的变体(为了简单起见)还是您会推荐一些其他方法?
- 可以从我的内存 xml 中使用 ExtensionFunction 和 return XdmNode 吗?在我看来它应该可以工作,但我真的不想涉足一些边缘案例或撒克逊雷区。
来自经验丰富的 Saxon 用户的任何评论都将受到赞赏。
执行此操作的标准方法是编写一个URIResolver
并将其注册到转换器。 URIResolver
被调用,提供请求的 URI,它被期望 return 一个源(可以是 StreamSource
、SAXSource
或 DOMSource
,例如)。在这种情况下,您通常会 return 一个 StreamSource
包装一个 StringReader
包装 String
包含 XML.
您同样可以使用扩展函数,但它可能有点复杂。