是否可以在 XPath 1.0 中同时获取属性的值和节点内的文本


Is it possible to get an attribute's value and the text within a node at the same time in XPath 1.0?

我在这里尝试了解决方案:使用 XPath 获取属性但它给了我一个错误。

我有一些像这样的XHTML:

<a href="link.php">Click me!</a>

我正在递归解析XML并尝试同时获取href属性(link.php)和链接文本(Click me!)。

<?php
$node = $xpath->query('string(self::a/@href) | self::a/text()', $nodes->item(0));

此代码引发以下错误:

警告:DOMXPath::query():无效类型

如果我分别执行这两个中的任何一个,它们都可以工作,但不能一起使用:

<?php
$node = $xpath->evaluate('string(self::a/@href)', $nodes->item(0));
$node = $xpath->query('self::a/text()', $nodes->item(0));

如果我使用以下方法,我会得到整个属性(href="link.php"),而不仅仅是它的值:

<?php
$node = $xpath->query('self::a/@href | self::a/text()', $nodes->item(0));

有没有办法在 PHP 中使用 XPath 1.0 同时获取两个文本值?

正如其他人所建议的,您可以使用concat()(PHP XPath支持它!请参阅下面的演示)来组合属性值和元素的内容。

其他人建议的 XPath 的问题可能是,从您尝试的代码(即使用 self::a)来看,上下文节点 ( $nodes->item(0) ) 已经是<a>元素,因此a/@href相对于当前上下文节点意味着返回href子元素的属性a当前元素,这就是您没有匹配的原因。在这种情况下,您使用self::a是正确的,或者,或者,只是.可用于引用当前上下文节点:

$doc = new DOMDocument();
$xml = <<<XML
<root>
<a href="link.php">Click me!</a>
</root>
XML;
$doc->loadXML($xml);
$xpath = new DOMXpath($doc);
$nodes = $xpath->query('//a');
$node = $xpath->evaluate('concat(@href, "|", .)', $nodes->item(0));
echo $node;

eval.in demo

输出:

link.php|Click me!