具有条件的XPath表达式在单独的父元素子元素上

时间:2017-10-25 14:28:54

标签: xml xpath

给出一个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>

我希望为NAME元素提取SESSION元素的SESSION属性,其中包含以下所有条件:

  • SESSIONEXTENSION元素&lt; {1}}属性值等于TYPE
  • "READER"元素的ATTRIBUTE属性值等于NAME
  • "General Options"元素&lt ATTRIBUTE属性值等于VALUE

XPath表达式

""

返回包含所寻求的/SESSION/SESSIONEXTENSION[@TYPE='READER'] 属性值的SESSION元素。

然而,我尝试使用XPath表达式指定上述所有三个NAME元素要求

SESSION

没有按预期工作。

如何在XPath表达式中声明多个条件,其中条件是父元素( /SESSION/SESSIONEXTENSION[@TYPE='READER']/ATTRIBUTE[@NAME="General Options" and VALUE =""] )的单独子元素(SESSIONEXTENSIONATTRIBUTE)?

2 个答案:

答案 0 :(得分:2)

以下XPath返回NAME SESSIONATTRIBUTE的{​​{1}}元素NAME"General Options" {{1} } ATTRIBUTEVALUE ""SESSIONEXTENSION

TYPE

这条路径的基本结构如下:

"READER"

或者您可以将其更新为:

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

按条件使用模式排除项目:// tag[child1[condition1][condition2]][child[condition3]]/@attr

所以不要包括WRITER,请使用:

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

答案 1 :(得分:0)

在@ splash58的评论的基础上,我相信以下XPath会返回所需的值(&#34; name sessionAttribute nameGeneral Options 1}}和values =""以及sessionextension type="READER"&#34;):

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

XPath根据问题对XML进行评估,结果如下:

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测试上面的XPath。