2012-02-27 2 views
1

xpath 표현식을 사용하여 DOM 트리에서 특정 div 클래스를 확인합니다 (VolkerK 덕분에!). eq() 또는 n 번째의 아이를() : 나중에 jQuery를로 바꾸고 자 할DomNode/Xpath 자식 요소 인덱스 위치 찾기

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $node) 
    $html['content'] = $node->textContent; 
    //$html['node-position'] = $node->position(); // (global) index position of the child 'foo' 
} 

은 결국 내가 가지고있는 (전역) 인덱스 위치 내 아이 'foo는'알 필요가있다.

할 방법이 있습니까?

나는 올바른 요소 (XPath/Domdocument check for child by class name)를 선택하는 것에 대해 다른 질문을하고 있습니다.

감사합니다.

UPDATE :

I 사용 있다는 것을 발견 하였다 :

$html['node-position'] = $node->getNodePath() 

것은 실제로 저 경로와 XPath는 구문 요소 번호 (/ HTML/바디/DIV 제공 [3]) 부모 노드의 자식 div 'foo'에 대해 어떻게 할 수 있습니까?

+0

nth-child가 필요합니까? 또는 요소에 클래스를 추가하면 충분합니까? 그런 다음 예를 들어 '$ ('. replaceThis'). each (function (e) {...}); ' – VolkerK

답변

4

는 XPath의 방법은 지정된 요소의 "위치"를 찾기 위해 위치가 정의 x가 (그 요소 x의 인덱스를 의미하는 XML 문서 내의 모든 엘리먼트 x)의 (문서 순) 순서는 이다

count(preceding::x) + count(ancestor-or-self::x) 

이 XPath 표현식이 요소 x을 현재 노드 (초기 컨텍스트 노드)로 평가할 때 이렇게 정의 된 "위치"가 생성됩니다.

XSLT - 기반의 검증 :

<t> 
    <d/> 
    <emp/> 
    <d> 
     <emp/> 
     <emp/> 
     <emp/> 
    </d> 
    <d/> 
</t> 

이 변환 :

이의이 XML 문서를 보자

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="v3rdEmp" select="/*/d/emp[2]"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "count($v3rdEmp/preceding::emp) 
    + 
    count($v3rdEmp/ancestor-or-self::emp) "/> 
</xsl:template> 
</xsl:stylesheet> 

는 3 emp 요소를 사용하여 위의 XPath 식을 평가 문서의 초기 컨텍스트 n 송시. 표현식의 x은 이제 원하는 요소 이름 -으로 대체됩니다. 그런 다음 표현식 평가의 결과가 출력됩니다.이 결과가 원하는 올바른 결과임을 알 수 있습니다.

3 
+0

고맙습니다.실제로 모든 요소의 배열을 만들고 나중에 경로를 비교하여 해결책을 찾았지 만이를 확인해 보겠습니다. +1하고 받아들입니다. – Mike

+0

@Mike : XPath가 간단한 표현으로 우리에게 제공 할 때, 왜 모든 요소에 대해 메모리를 낭비하고 (2 회), 이식성이없는 코드를 작성해야합니까? –

0

의 Foreach supports 구문 $traversable as $key => $item, 당신은 사용 때문에 때

foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $key => $node) 
    $html['content'] = $node->textContent; 
    $html['node-position'] = $key; 
} 
+0

안녕하세요, 감사합니다! 하지만 문제는 여러 개의 'foo'요소가 있는데, 그 중 일부는 'posts'내에 있지 않으므로 domnode에 대한 솔루션을 정말 갖고 싶습니다. 죄송합니다. 지적하지 않았습니다. – Mike