首页 > 解决方案 > 如何在撒克逊语中扩展 doc() 功能

问题描述

我正在寻找 SAXON 中当前可用的 doc() 功能的扩展,它不会从文件系统或 http 网络中读取 XML,而是从我拥有这些 xml 的内存中读取 XML。

我想使用它的方式是:

mydoc('id')/root/subroot/@myattr

或者

doc('mydoc://id')/root/subroot/@myattr

到目前为止我所考虑的:

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

所以问题是:

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

经验丰富的撒克逊用户的任何评论将不胜感激。

标签: javaxquerysaxon

解决方案


执行此操作的标准方法是编写 aURIResolver并将其注册到转换器。被URIResolver调用,提供所请求的 URI,并且预计会返回一个 Source(例如,可以是StreamSourceSAXSourceDOMSource)。在这种情况下,您通常会返回一个StreamSource包装 a StringReader,它包装String包含 XML 的内容。

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


推荐阅读