查找DomNode / Xpath子元素的索引位置

时间:2012-02-27 12:33:14

标签: php xpath dom-node

我正在使用xpath表达式来确定我的DOM树中的某个div类(感谢VolkerK!)。

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'有哪个(全局)索引位置,因为我想稍后用jQuery替换它:eq()或nth-child()。

有办法吗?

我正在跟进我的另一个关于选择正确元素的问题(XPath/Domdocument check for child by class name)。

谢谢!

更新:

我发现使用:

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

实际上给了我父节点的xpath语法(/ html / body / div [3])中的路径和元素号,但是如何为子div'foo'?

2 个答案:

答案 0 :(得分:4)

查找给定元素x 的“位置”的XPath方法(其中,位置定义为序列中元素x的索引(in XML文档中所有x个元素的文档顺序)

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

当此XPath表达式使用元素x作为当前节点(初始上下文节点)进行评估时,将生成如此定义的“位置”。

基于XSLT的验证

我们有这个XML文档:

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

此转化

<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表达式。表达式中的x现在由我们想要的元素名称emp替换。然后输出表达式评估的结果 - 我们看到这是想要的,正确的结果:

3

答案 1 :(得分: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;
}