【问题标题】:Is there any requirement for DOM used to create a DominoTree, such as being namespaceaware or created with level 2 dom builder?用于创建 DominoTree 的 DOM 是否有任何要求,例如具有命名空间意识或使用 2 级 dom 构建器创建?
【发布时间】:2022-11-10 18:31:35
【问题描述】:

在调用 saxon 库处理 xquery 表达式之前,我们添加了将 DOM 转换为 Domino 的代码,这涉及构建一个 xml 文档作为输出。 对于使用某些 DOM 构建器创建的 DOM,可以看到以下异常:

java.lang.NullPointerException
    at net.sf.saxon.om.NameOfNode.equals(NameOfNode.java:177)
    at net.sf.saxon.om.SingletonAttributeMap.put(SingletonAttributeMap.java:69)
    at net.sf.saxon.om.NodeInfo.attributes(NodeInfo.java:528)
    at net.sf.saxon.tree.util.Navigator.copy(Navigator.java:673)
    at net.sf.saxon.om.NodeInfo.copy(NodeInfo.java:568)
    at net.sf.saxon.tree.util.Navigator.copy(Navigator.java:679)
    at net.sf.saxon.om.NodeInfo.copy(NodeInfo.java:568)
    at net.sf.saxon.event.ComplexContentOutputter.decompose(ComplexContentOutputter.java:860)
    at net.sf.saxon.event.ComplexContentOutputter.append(ComplexContentOutputter.java:656)

原因似乎是节点属性类型的 node.getLocalName() 为 Domino 返回 null。如果将 DOM 转换为 Tiny Tree 或使用 DOMWrapper 将其传递给 Saxon,则相同的设置有效。

Xquery 使用多米诺骨牌,预计可以工作,抛出异常。

【问题讨论】:

  • 我认为就 DOM 而言,Saxon 需要一个命名空间感知 DOM。
  • 但是相同的模型,在使用 TinyTree 和 DOM 时也可以工作。 Domino 有什么不同吗?
  • 我认为只有 Michael Kay 可以回答这个问题,所以你必须等到他出现在这里,或者,如果它很紧急,也许可以删除你的 * 问题并尝试在saxonica.plan.io/projects/saxon/issues 提出问题。
  • 是的,会这样做,谢谢你的帮助!

标签: dom domdocument saxon domparser


【解决方案1】:

您已在 Saxonica 支持论坛上提出此问题,地址为 https://saxonica.plan.io/issues/5727

总结一下:

(a) 无论是使用 Saxon 中的 DOM 包装器,还是使用 Domino 结构(添加额外的索引),DOM 都应该是命名空间感知的,并且应该使用命名空间感知(即 level-2)接口构建。

(b) 如果您不遵守该规则,我们不应该崩溃(因此我们将修复您观察到的崩溃),但我们不能保证提供符合 XPath 的结果。从非命名空间感知 DOM 到有效 XDM 实例的映射是未定义且不可预测的,因此 XPath 处理的结果是未定义的。例如,这可能意味着当结果被序列化时,它不是格式良好的 XML(例如,它可能在元素或属性名称中包含未声明的前缀。

【讨论】:

    最近更新 更多