Xml DOM是否应该拆分文本并进行规范化组合以提供标识?

Xml DOM是否应该拆分文本并进行规范化组合以提供标识?,xml,dom,Xml,Dom,昨天,我参与了一个关于DOM实现怪癖的讨论,提出了一个关于Text.splitText和Element.normalize行为以及它们应该如何行为的有趣问题 在中,Text.splitText定义为 在指定的偏移处将此文本节点拆分为两个文本节点,并将这两个节点作为兄弟节点保留在树中。然后,此节点仅包含偏移点之前的所有内容。一个新的文本节点(作为该节点的下一个同级节点插入)包含偏移点处和之后的所有内容 正常化是 将此元素下的子树的整个深度中的所有文本节点放入“正常”形式,其中只有标记(例如标记、注

昨天,我参与了一个关于DOM实现怪癖的讨论,提出了一个关于Text.splitText和Element.normalize行为以及它们应该如何行为的有趣问题

在中,Text.splitText定义为

在指定的偏移处将此文本节点拆分为两个文本节点,并将这两个节点作为兄弟节点保留在树中。然后,此节点仅包含偏移点之前的所有内容。一个新的文本节点(作为该节点的下一个同级节点插入)包含偏移点处和之后的所有内容

正常化是

将此元素下的子树的整个深度中的所有文本节点放入“正常”形式,其中只有标记(例如标记、注释、处理指令、CDATA节和实体引用)分隔文本节点,即没有相邻的文本节点。这可用于确保文档的DOM视图与保存和重新加载时的DOM视图相同,并且在使用依赖于特定文档树结构的操作(如XPointer查找)时非常有用

所以,如果我取一个包含“Hello World”的文本节点,在textNode中引用,然后

textNode.splitText(3)
textNode现在有了内容“Hello”,还有一个新的兄弟节点包含“World”

如果我当时

textNode.parent.normalize()
什么是textNode?该规范没有明确说明textNode必须仍然是其上一个父节点的子节点,只是更新为包含所有相邻的文本节点(然后将其删除)。删除所有相邻的文本节点,然后通过值的串联重新创建一个新节点,让textNode指向不再属于树的某个部分,这似乎是一种一致的行为。或者,我们可以像在splitText中一样更新textNode,这样它就保留了它的树位置,并获得一个新值


行为的选择真的非常不同,我找不到一个关于哪个是正确的澄清,或者这仅仅是规范中的一个疏忽(在2级或3级中似乎没有澄清)。任何DOM/XML大师都能提供一些启示吗?

虽然这似乎是一个合理的假设,但我同意规范中没有明确说明这一点。我所能添加的是,我读取它的方式,
textNode
或它的新同级(即,
splitText
的返回值)中的一个将包含新的连接值-该语句指定子树中的所有节点都以正常形式放置,而不是将子树标准化为新结构。我想唯一安全的办法是在正常化之前保留对家长的引用。

我想这里所有的赌注都没有了;我当然不会依赖任何特定的行为。唯一安全的做法是再次从其父节点获取节点。

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

当有疑问时,应采取防御措施