如何在Saxon中扩展doc()功能

时间:2019-07-08 21:45:31

标签: java xquery saxon

我正在寻找一种扩展SAXON当前可用的doc()功能的方式,它可以从文件系统或http网络中读取XML,而不是从内存中读取XML。

我要使用它的方式就像:

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

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

到目前为止我所考虑的:

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

所以问题是:

  1. (简单起见)变体3是最好的一种吗?还是您会推荐其他方法?
  2. 可以使用ExtensionFunction并从内存中的xmls返回XdmNode吗?在我看来,它应该可以工作,但是我真的不想涉足某些极端情况或撒克逊雷场。

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

1 个答案:

答案 0 :(得分:0)

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

您同样可以使用扩展功能,但可能会稍微复杂一些。