【问题标题】:XPath expression with conditions on separate parent element child elements带有单独父元素子元素条件的 XPath 表达式
【发布时间】:2018-04-06 16:49:01
【问题描述】:

给定一个 XML 文档,例如:

<SESSION NAME ="TEST" REUSABLE ="NO" SORTORDER ="Binary" VERSIONNUMBER ="1">
    <SESSIONEXTENSION DSQINSTNAME ="TEST_SQ" DSQINSTTYPE ="Source Qualifier" NAME ="Relational Reader" SINSTANCENAME ="TEST_SQ" SUBTYPE ="Relational Reader" TRANSFORMATIONTYPE ="Source Definition" TYPE ="READER"/>
    <SESSIONEXTENSION DSQINSTNAME ="TEST_TG" DSQINSTTYPE ="Source Qualifier" NAME ="Relational Reader" SINSTANCENAME ="TEST_TG" SUBTYPE ="Relational Reader" TRANSFORMATIONTYPE ="Source Definition" TYPE ="WRITER"/>
    <ATTRIBUTE NAME ="General Options" VALUE =""/>
</SESSION>

我希望为满足以下所有条件的SESSION 元素提取SESSION 元素的NAME 属性:

  • SESSIONEXTENSION元素的TYPE属性值等于"READER"
  • ATTRIBUTE元素的NAME属性值等于"General Options"
  • ATTRIBUTE元素的VALUE属性值等于""

XPath 表达式

/SESSION/SESSIONEXTENSION[@TYPE='READER']

返回一个包含所寻找的NAME 属性值的SESSION 元素。

但是,我尝试使用 XPath 表达式指定上述SESSION 元素要求列表中的所有三个

 /SESSION/SESSIONEXTENSION[@TYPE='READER']/ATTRIBUTE[@NAME="General Options" and VALUE =""]

没有按预期工作。

如何在 XPath 表达式中声明多个条件,其中条件适用于父元素 (SESSION) 的单独子元素 (SESSIONEXTENSIONATTRIBUTE)?

【问题讨论】:

  • 尝试使用@VALUE=... 而不是VALUE=...
  • /SESSION[SESSIONEXTENSION[@TYPE='READER'] and ATTRIBUTE[@NAME="General Options" and @VALUE =""]]

标签: xml xpath


【解决方案1】:

以下 XPath 返回 SESSION 中的 NAME 元素,其中 ATTRIBUTE NAME"General Options"ATTRIBUTE VALUE"" 和 @987654320@@9876543 "READER":

//SESSION[ATTRIBUTE[@NAME='General Options'][@VALUE='']][SESSIONEXTENSION[@TYPE='READER']]/@NAME

该路径的基本结构如下:

// tag[child1[condition1][condition2]][child[condition3]]/@attr

或者您可以将其更新为:

// tag[child1[condition1 and condition2] and child[condition3]]/@attr

按条件使用模式排除项目:[not(condition)]

所以不包括 WRITER,使用这个:

//SESSION[ATTRIBUTE[@NAME='General Options'][@VALUE='']][SESSIONEXTENSION[@TYPE='READER']][not(SESSIONEXTENSION[@TYPE='WRITER'])]/@NAME

【讨论】:

  • 您好 Vitaly,感谢您的回答。如果有两个名为 SESSIONEXTENSION 的孩子,其中一个是 TYPE="WRITER",并且我希望只有在我的 sessionextension 都没有 type="WRITER" 的情况下才能获取会话名称。在这种情况下,我不应该收到任何结果。我应该如何修改我的 xpath 表达式?
  • 您应该在会话中添加另一个参数,以按条件排除元素,我会在几分钟内更新答案
【解决方案2】:

基于@splash58 的评论,我相信以下XPath 返回所需的值(“当Attribute nameGeneral Optionsvalues =""sessionextension type="READER"sessionname”):

string(/SESSION[SESSIONEXTENSION[@TYPE='READER'] and ATTRIBUTE[@NAME="General Options" and @VALUE =""]]/@NAME)

根据问题中的 XML 评估的 XPath 会导致:

TEST

删除 XPath 周围的 string() 环绕以获取属性名称和值 - 即:

/SESSION[SESSIONEXTENSION[@TYPE='READER'] and ATTRIBUTE[@NAME="General Options" and @VALUE =""]]/@NAME

计算结果为

NAME=TEST

反对上述 XML。

使用 https://www.freeformatter.com/xpath-tester.html 测试的以上 XPaths。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2018-07-09
    • 2020-04-24
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多