【问题标题】:xPath: Select parent element only if child element doesn't contain a certain valuexPath:仅当子元素不包含特定值时才选择父元素
【发布时间】:2011-04-20 01:35:56
【问题描述】:

鉴于此:

<element_1> 
    <element_2>Text</element_2> 
    <element_3> 
        <element_4> 
            <element_5>Text with @ in Value</element_5> 
        </element_4> 
        <element_4> 
            <element_5>Test Text</element_5> 
        </element_4> 
    </element_3> 
    <element_6> 
        <element_7> 
            <element_8>0</element_8> 
...

如何选择在 element_5 中包含“@”的 element_1 的所有实例?

【问题讨论】:

  • 好问题 (+1)。请参阅我对选择任何文档中所有必需元素的通用 XPath 表达式的回答——当事先不知道文档的结构时。

标签: xml xpath filtering


【解决方案1】:
element_1[not(contains(element_3/element_4/element_5,'@'))]

这被解释为

element_1[                          #select elements named "element_1"
  not(contains(                     #that do not contain
    element_3/element_4/element_5,  #children in this hierarchy
    '@'                             #the character @
  ))
]

【讨论】:

  • 这需要在 element_1 之前 // 前导吗?
  • 取决于您是否想在任何级别匹配 element_1,或者它是否始终是 DOM 的根。
  • 另请注意,此解决方案假定 element_5 始终位于 element_4 的正下方,而 element_4 又始终位于 element_3 的正下方,而 element_3 又始终位于 element_1 的正下方。其他两个解决方案假设 element_5 可以出现在 element_1 之下的任何级别。
  • 谢谢。我还不能对此进行测试,但如果这不起作用,我想我可以从这里弄清楚。
【解决方案2】:

我的 XPath 有点生锈了,但是是这样的:

//element_1[.//element_5[not(contains(., "@"))]]

【讨论】:

  • 我们有点挑剔,不推荐 // 操作符,当架构是众所周知的...
  • 没关系。 OP 并没有具体说明这一点。
  • 为什么降级?不管你是谁,至少有礼貌地留言说明你为什么被降级。
【解决方案3】:

如何选择所有实例 element_1 不包含“@” 在 element_5 中?

使用

//element_1[not(.//element_5[contains(.,'@')])]

在英文中,这意味着:选择文档中没有"element_5" 后代的所有"element_1" 元素,其字符串值包含字符串'@'

我使用 // 缩写只是因为 XML 文件的结构不清楚。

我始终建议尽可能避免使用 // 缩写,否则可能会导致 XPath 评估效率非常低。

【讨论】:

  • @Mads-Hansen:感谢您的编辑,但“descendent”是一个有效的英文单词。
【解决方案4】:
element1[not(contains(.//element_5, '@'))]

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 2023-03-18
    • 2018-06-15
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多