2015-01-07 2 views
0

Firefox에서 XPath (1) 한 줄짜리 우선 순위 지정 작업을 수행하려면 어떻게해야합니까? |이 Firefox에서 '실패'하지만 Chrome에서 '작동'하는 이유는 무엇입니까?Firefox에서 XPath 순서 지정

어느 것이 옳은가요? (이 동작이 사양에 정의되어있는 경우) 그리고 어떻게 보드 전체에서 작동하게 할 수 있습니까?

<a>b</a> 
<a id="b"></a> 

크롬 39.0.2171.95

> $x("//a[@id='b'] | //a[text()='b']") 
< [<a id=​"b">​</a>​, <a>​b​</a>​] 

파이어 폭스 34.0.5

> $x("//a[@id='b'] | //a[text()='b']") 
< Array [ <a>, <a#b> ] 

편집 : 질문에 대한 | 행동 Firefox에서하지에 대한이 같은 or 선택 예를 제거 둘 사이의 차이.

+0

Firefox는 어떤 방식으로 "실패"합니까? 아마도 [이] (http://stackoverflow.com/questions/25407504/what-is-the-difference-between-or-and-when-programming-in-xslt/25407704#25407704) 또한 차이점을 이해하는 데 도움이됩니까? –

+0

@ MathiasMüller 고맙습니다. Chrome이 문서 사양을 명시 적으로 명시한 것처럼 여기에 오류가있는 것으로 보입니다. "게으른"선택자를위한 또 다른 방법을 찾아야합니다. –

+0

1) node-set은 정렬되지 않은 노드 목록입니다. 선택한 노드를 순서 지정하는 방법은 구현에 달려 있습니다. 대개 DOM 순서를 유지합니다. 2) 명세는 노드 집합의 순서를 정의하지 않는다. 연산자, 그래서 다시 그것을 처리하기 위해 구현합니다. Chrome과 FF는 모두 사양에 충실합니다. 그러나 – comeGetSome

답변

1

FF 대 크롬에서 서로 다른 결과를 볼 따라서, 주문을 처리해야 Michael Kay, saying :

XPath 1.0 초 pecification은 경로 표현식 (또는 연합 표현식)이 노드 집합, 즉 순서가없는 노드 집합을 반환하도록 정의합니다. 일부 호스트 언어 (예 : XSLT 1.0)는 노드 집합이 항상 문서 순서로 처리되는 임을 지정합니다. 하지만 당신은 (내가 말할 수있는 한) 어떤 Microsoft API에서 XPath를 호출하는 인 것처럼 보입니다. 그리고 나는 그 API가 처리 순서에 대해 이라고 말하면서 어떤 생각을 가지고 있는지 알지 못합니다. 정의 할 XPath 호스트 언어까지입니다. 또는 그것을 정의되지 않은 상태로 둘 수 있습니다.

그리고, 주요 브라우저 이제까지의 XPath 2.0 채택해야하는 경우 :

이 XPath는이 변화를.0은 경로 표현식과 유니온 표현식이 문서 순서로 다른 노드 시퀀스를 반환하도록 지정합니다. 귀하의 경우에는

이 단순히 의미 : 결과의 순서를 설정하고 중복 당신에게 문제가있는 경우 | 또는 union 연산자를 사용하지 마십시오. 이 표현식이 Firefox와 Chrome에서 동일한 순서로 결과를 반환하면 or (사용자가 질문에서 편집 한 경로 표현식)을 포함하는 조건부를 사용하십시오.

제 2 중점은 주문 된 집합의 요소들이 나열된다 : unorderedness이 세트의 속성이기 때문에

그러나 일반적

는 문서 순서는 노드 세트에 대해 보장 될 수없는 (시퀀스 또는 튜플과 달리) ( Set(mathematics)에서) 부적절합니다.

XPath 1.0의 많은 구현은 문서 순서의 노드 집합에있는 "항목"을 반환합니다. 이는 해당 항목이 사양에서 의무화 되었기 때문에가 아니라 많은 경우 문서에서 결과를 반환하기 때문입니다 질서가 정말로 이치에 맞습니다.


예를 this question 또는 this one를 들어, 이미 몇 가지 매우 유사한 질문이 있습니다.

1

| 연산자가 또는가 아닌 경우, 노드 집합은 왼손 xpath (파이프의 왼쪽)와 오른손 xpath에 의해 선택된 요소의 하위 세트를 포함합니다.

"//a[@id='b' or text()='b']" 

읽기 셀렉터 : 술어가 '참'으로 평가되면 순서의 모든 "A"요소 이송 그들은 DOM에 나타나고 술어 평가 [...]은, 상기 이송 요소는

"//a[@id='b'] | //a[text()='b']" 

읽기 셀렉터 노드 세트 결과에 부가 (상술 한 바와 같은) [@ ID = 'B'를] // 적용한 후 // 적용을 A [텍스트() = ' b '] 마지막으로 결과를 함께 결합 r 두 결과가 모두 포함 된 노드 집합을 반환합니다.

결과에있는 요소의 순서는 travert와 동일합니다. 즉, 문서에서 순서를 유지하지만 (노드 집합에 중복을 포함 할 수 없기 때문에) 중복은 포함되지 않습니다. 즉 // // | // 의 결과와 동일한 노드 집합이 결합하는 방법을 정의되지 않은,

그러나 (|)는 자사의 최대 구현에 따라서 당신은 내가 유일한 박사를 인용 할 수