xpath->查询的递归上下文节点

时间:2013-11-01 15:03:26

标签: php xpath

基本上我想要实现的是用一个页面中相应的data-src-nodes的内容替换一堆img-nodes的src-attributes的内容。如下所示。

<html>
   <body>
      <div id="a">
         <img src="" data-src="myValue" />
         <img src="" data-src="myValue2" />
      </div>
      <img src="" data-src="myValue" />
   </body>
</html>

我想通过找到一个公共基节点(在这种情况下,div中的img节点,其id为 a )并基于该节点

来实现此目的
  • 包含要复制的值的节点和#
  • 检索值的节点

脚本

<?PHP
$html = '<html><body><div id="a"><img src="" data-src="myValue"/><img src="" data-src="myValue2"/></div><img src="" data-src="myValue"/></body></html>';
$doc = new DOMDocument();
@$doc->loadHTML($html);

$basenode = false;
$xpath = new DOMXPath($doc);
$entries = $xpath->query('(//div[@id="a"])');

if ($entries->length > 0) $basenode = $entries->item(0);
if ($basenode) {
    $img = $xpath->query('//img', $basenode);
    foreach ($img as $curImg) {
        $from = $xpath->query('//@data-src', $curImg);
        $to = $xpath->query('//@src', $curImg);
        $to->item(0)->value = $from->item(0)->value;
    }
    echo $doc->saveXML();
}
?>

预期输出

<html>
   <body>
      <div id="a">
         <img src="myValue" data-src="myValue" />
         <img src="myValue2" data-src="myValue2" />
      </div>
      <img src="" data-src="myValue" />
   </body>
</html>

实际输出

<html>
   <body>
      <div id="a">
         <img src="myValue" data-src="myValue" />
         <img src="" data-src="myValue2" />
      </div>
      <img src="" data-src="myValue" />
   </body>
</html>

所以,行

$from = $xpath->query('//@data-src', $curImg);

似乎实际上是在根节点上进行搜索,而不是之前选择的img节点。我该如何解决这个问题?

(我知道可能的解决方法是省略明确选择img-nodes并执行类似from ='// div [@ id =“a”] / img / @ data-src'和='' // div [@ id =“a”] / img / @src'但我有点担心,我最终可能会在不同节点的属性之间复制值)

1 个答案:

答案 0 :(得分:0)

开头的

/指定绝对位置路径(即,从文档根目录)。相反,您希望使用 relative (相对于上下文节点)。

例如; .//@data-srcdescendant::img/@data-src,等等。