【问题标题】:Find parent node on node content text在节点内容文本上查找父节点
【发布时间】:2011-02-01 10:48:29
【问题描述】:

嘿,我正在尝试找出节点内容文本的父节点。

示例:

<div>
    <h1>Node to find</h1>
    <p>another node</p>
</div>

我所有的代码都知道节点中的文本是什么,我的脚本需要找出文本包含在哪个节点中。

我尝试了以下 xpath:

 1. //*[. = "'. $text .'"]
 2. //*[contains(., "'. $text .'")]

第一个给了我一个空的 nodeList 第二个给了我很多节点,但它给了我所有包含文本的父级,我只想要第一个父级。

感谢您的帮助。

【问题讨论】:

标签: php xpath


【解决方案1】:

我不确定我是否理解您答案的 "'. $text .'" 部分...我猜这意味着一些示例文本,而不是对名为 text 的变量的预期引用?

无论如何,当您使用contains(., "foo") 时,您是在询问当前节点的字符串值是否包含“foo”。当前节点的字符串值是所有后代文本节点的字符串值的串联。这就是//*[contains(., "foo")] 返回节点列表的原因:它匹配每个包含“foo”的文本节点的每个祖先。 (而且它可能非常低效,因为您在树中的每个节点上都执行该连接功能。)

您的starts-with() 答案(有时)起作用的原因是您很幸运:文本节点的父节点有其他前面的兄弟姐妹有自己的文本,因此祖父节点的文本值以其他内容开头。效率也很低……

如果您要查找的文本仅位于一个文本节点中——即它不会被拆分到多个元素/cmets / 等中——那么您可以有效且准确地仅匹配包含该文本的元素节点,使用 [edited]:

//*[text()[contains(., "foo")]]

(类似于@biziclop 所说的)。

如果您正在查看的文本可能被拆分为多个元素/cmets / 等--那么您可以使用这个[编辑,两次]

//*[contains(., "foo") and not(*[contains(., "foo")])]

但那是相当低效的。以下不保证有效:

//*[contains(., "foo")][1]

它将为您提供[已编辑,两次]每个元素是其父元素的第一个子元素(是包含文本的元素的祖先)。 (或者一个空的节点集,如果没有找到“foo”。)我相信@Alejandro 在这个...我仍然没有内化如何判断 [position() = x] 何时适用于最近的位置步骤只要。无论如何,这个 XPath 表达式不能保证给你正确的结果。

【讨论】:

  • 感谢拉斯的回答。你真的解释了一切。似乎我有一些关于我希望它如何工作的替代方案。保存这个以供将来参考。再次感谢。
  • @LarsH:第一个含义:每个元素,使得第一个文本节点子节点包含“foo”。第二个:如果我包含“foo”,我的父母总是包含“foo”。最后一个意思:每个第一个包含“foo”的孩子
  • @Alej:啊,好点子。我忘记了,关于 contains() 在其第一个参数节点集中获取第一个节点......可能需要编辑。事实上,我的三个示例 XPath 都错了吗? :-p
  • @Alej 和@Henrik:更新了我的答案,希望它现在是正确的。
  • @LarsH:现在,第一个很好。第二个有隐式转换问题:从函数调用中取出“任何子元素”节点集。关于第三个:我改写意思:来自那些包含“foo”的孩子,第一个
【解决方案2】:

我正在尝试找出父节点 节点内容文本。
[...] 但它给了我所有的父母 包含文本,我只想要 第一父母。

经典答案是:

//*[text()[contains(.,$pText)]]

含义:任何元素至少有一个文本节点子节点包含$pText变量/参数引用字符串值作为其字符串值的一部分

提到了可能的混合内容模型。我怀疑这是一个真正的考虑,但无论如何,这就是答案:

//*[contains(.,$pText)][not(*[contains(.,$pText)])]

含义:任何包含$pText 作为其字符串值的一部分的元素,没有任何包含$pText 作为其字符串值一部分的子元素。换句话说,最里面的元素包含$pText 字符串值。

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多