如何更改 S9API 中的 XdmNode 基本 URI

How to change XdmNode base URI in S9API

我有一个用于 Saxon 的 S9API XdmNode 实例的自制缓存,通过 URI 实现 getputmoveremove 操作。 move 操作允许将 XdmNode 从一个 URI 移动到另一个。

我的问题是 XdmNode 在内部保留了文档的基本 URI。如何更新底层 NodeInfo 的基本 URI?当底层节点是DOMNodeWrapper时,可以更新基础URI。但是例如 TinyDocumentImpl 是不可变的。

是否有允许更新 TinyDocumentImpl 的基础 URI 的解决方案 涉及通过制作树的完整副本来构建新文档?

由于缺少 "saxon" 标签,我在第一次出现时错过了这个问题。

一种选择是使用 LinkedTree 作为您选择的树模型;链接树是可变的,DocumentImpl class 有一个 setBaseURI() 方法。您可以使用 DocumentBuilder.setTreeModel() 选择树模型。 (但要小心使用;如果在转换过程中更改节点的属性,后果是不可预测的。)

另一种选择是将 TreeInfo 包装在 net.sf.saxon.tree.wrapper.RebasedDocument 中,这将创建原始节点的虚拟副本,除了具有不同的基本 URI 外,其他都是相同的。虚拟副本的内存消耗几乎为零,但在树中导航时开销很小。