如何在 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

到目前为止我考虑的是:

  1. 使用 queryEvaluator.setContextItem() - 不能解决我的用例,因为我可以在一个查询中有多个 XML 来源
  2. 注册一些自己的 URL scheme 协议到 Java - 在我看来有点矫枉过正,我从来没有这样做过
  3. 编写自己的 ExtensionFunction - 到目前为止似乎是正确的方法,但我很困惑是应该使用 ExtensionFunction 还是 ExtensionFunctionDefinition。此外,我对 Doc_1 和 Doc Saxonica 源代码有点困惑,因为它使用 Atomizer 和其他未知的内部内容。

所以问题是:

  1. 变体 3 是最好的变体(为了简单起见)还是您会推荐一些其他方法?
  2. 可以从我的内存 xml 中使用 ExtensionFunction 和 return XdmNode 吗?在我看来它应该可以工作,但我真的不想涉足一些边缘案例或撒克逊雷区。

来自经验丰富的 Saxon 用户的任何评论都将受到赞赏。

执行此操作的标准方法是编写一个URIResolver并将其注册到转换器。 URIResolver 被调用,提供请求的 URI,它被期望 return 一个源(可以是 StreamSourceSAXSourceDOMSource,例如)。在这种情况下,您通常会 return 一个 StreamSource 包装一个 StringReader 包装 String 包含 XML.

您同样可以使用扩展函数,但它可能有点复杂。