2008-08-27 8 views
6

어제 DOM 구현의 단점에 관한 토론에 휘말 렸습니다. Text.splitText 및 Element.normalise 동작에 관해 흥미로운 질문이 제기되었고, 어떻게 동작해야하는지에 관해 알려졌습니다.ID를 부여하기 위해 DOM splitText와 normalize를 작성해야합니까?

DOM Level 1 Core에서이 Text.splitText은 형제로서 트리 내에 보존 지정된 오프셋 (offset)이 개 텍스트 노드에 ...로

휴식이 텍스트 노드를 정의한다. 이 노드에는 오프셋 포인트까지의 모든 내용 만 포함됩니다. 이 노드의 다음 형제로 삽입되는 새 Text 노드에는 오프셋 포인트 이후의 모든 내용이 포함됩니다. 표준화는

...

는 "정상"형식에만 마크 업 (예를 들어, 태그, 주석, 처리에이 요소 아래의 서브 트리의 최 심부까지 존재하는 모든 Text 노드를 넣습니다 명령어, CDATA 섹션 및 엔티티 참조)는 텍스트 노드를 분리합니다. 즉, 인접한 텍스트 노드가 없습니다. 이는 문서의 DOM보기가 저장되고 다시로드 된 것처럼 동일하고 특정 문서 트리 구조에 의존하는 작업 (예 : XPointer 조회)이 사용될 때 유용합니다.

그래서 textNode에서 참조에 "Hello World"를 포함하는 텍스트 노드를 가지고 가고, 할 경우,

textNode.splitText(3) 

textNode 이제 내용에 "Hello"가, 새로운 형제는 "세계"를 포함하는

그때

textNode.parent.normalize() 

textNode 어떤 경우? 이 스펙은 textNode가 이전 부모 노드의 자식 노드 여야한다는 것을 분명히하지 않고 인접한 모든 텍스트 노드를 포함하도록 업데이트됩니다. 인접한 모든 텍스트 노드를 제거한 다음 값을 연결 한 새 노드를 다시 작성하여 textNode가 더 이상 트리의 일부가 아닌 것을 가리키는 컨소시엄 동작 인 것으로 보입니다. 또는 splitText에서와 같은 방법으로 textNode를 업데이트 할 수 있으므로 트리 위치가 유지되고 새 값을 가져옵니다.

동작 선택은 실제로 매우 다르며 어느 것이 옳았는지에 대한 설명을 찾지 못했습니다. 또는 이것이 사양의 단순한 감독 일 수도 있습니다 (레벨 2 또는 3에서 명확하게 보이지 않는 것 같습니다.). 어떤 DOM/XML 전문가가 빛을 비출 수 있습니까?

답변

3

저는 초기에 DOM 작업 그룹에있었습니다. , 나는 우리가 textNode 새로운 합류 값을 포함 할을 의미 확신하지만, 우리가하지 않았다 경우 일부 구현 대신 textNode를 재사용의 새 노드를 만들 수 있다는 것이 가능 사양에을 말한다 그것은 구현 자에게 더 많은 작업을 요구할 것이다.

의심스러운 경우 프로그램을 방역하십시오.

1

합리적인 가정처럼 보일 지 모르지만 본인이 명료하게 명확하게 밝혀지지 않았 음에 동의합니다. 추가 할 수있는 것은 내가 읽는 방식이 textNode이거나 새 형제 (즉, splitText의 반환 값)에 새 조인 값이 포함될 것입니다. 문은 서브 트리에있는 모든 노드 을 넣을 것을 지정합니다. sub-tree가 새로운 구조로 정규화 된 것은 아닙니다. 나는 안전한 유일한 일은 정규화하기 전에 부모에 대한 참조를 유지하는 것 뿐이라고 생각합니다.

1

나는 모든 베팅이 여기에 있다고 생각합니다. 나는 주어진 행동에 확실히 의지하지 않을 것이다. 유일하게 안전한 것은 부모로부터 노드를 다시 얻는 것입니다.