关于xml:DOM的splitText和normalization组成应该提供身份吗?

关于xml:DOM的splitText和normalization组成应该提供身份吗?

Should DOM splitText and normalise compose to give the identity?

昨天,我陷入了有关DOM实现怪癖的讨论中,引起了一个有关Text.splitText和Element.normalise行为以及它们应如何表现的有趣问题。

在DOM Level 1核心中,Text.splitText被定义为...

Breaks this Text node into two Text nodes at the specified offset, keeping both in the tree as siblings. This node then only contains all the content up to the offset point. And a new Text node, which is inserted as the next sibling of this node, contains all the content at and after the offset point.

归一化为...

Puts all Text nodes in the full depth of the sub-tree underneath this Element into a"normal" form where only markup (e.g., tags, comments, processing instructions, CDATA sections, and entity references) separates Text nodes, i.e., there are no adjacent Text nodes. This can be used to ensure that the DOM view of a document is the same as if it were saved and re-loaded, and is useful when operations (such as XPointer lookups) that depend on a particular document tree structure are to be used.

因此,如果我使用一个包含" Hello World"的文本节点(在textNode中引用)并执行

1
textNode.splitText(3)

textNode现在具有内容" Hello",以及一个包含" World"的新同级

如果我那么

1
textNode.parent.normalize()

什么是textNode?该规范并未明确指出textNode必须仍然是其先前父级的子级,只是对其进行了更新以包含所有相邻的文本节点(然后将其删除)。删除所有相邻的文本节点,然后使用值的串联重新创建一个新节点,这似乎是一种一致的行为,而textNode指向的树不再是该树的一部分。或者,我们可以以与splitText相同的方式更新textNode,以便它保留其树位置并获取新值。

行为的选择确实有很大的不同,我无法确定哪种方法是正确的,或者这仅仅是规范中的一个疏忽(似乎在第2或第3级中没有得到澄清) 。那里的任何DOM / XML专家都可以提供一些帮助吗?


早期我是DOM工作组的成员;我确定我们要让textNode包含新的联接值,但是如果我们在规范中未说明,则某些实现可能会创建一个新节点而不是重用textNode,尽管这将需要更多的工作。实现者。

如有疑问,请进行防御性编程。


我认为这里所有的赌注都没有;我当然不会依赖任何给定的行为。唯一安全的操作是再次从其父节点获取该节点。


虽然这似乎是一个合理的假设,但我同意在规范中未明确阐明。我可以添加的是,我的阅读方式(textNode之一或新的同级项(即,splitText的返回值))将包含新的联接值-该语句指定子树中的所有节点都是以正常形式表示,而不是将子树标准化为新结构。我猜唯一安全的是在规范化之前保留对父级的引用。


推荐阅读