我试图针对下面的XML编写XPath,这将使我获得列表中的所有节点@id =' ResponseActionList'对于特定的@rsp_cd,其中@act_cd在列表中不存在@id =' ActExcludeList'
<resp-env>
<cmd-resp>
<static>
<list id="ResponseActionList">
<listRow rsp_cd="R1" act_cd="A1" act_tx="A1 Text"/>
<listRow rsp_cd="R1" act_cd="A2" act_tx="A2 Text"/>
<listRow rsp_cd="R1" act_cd="A4" act_tx="A4 Text"/>
<listRow rsp_cd="R1" act_cd="A5" act_tx="A5 Text"/>
<listRow rsp_cd="R1" act_cd="A6" act_tx="A6 Text"/>
<listRow rsp_cd="R1" act_cd="A7" act_tx="A7 Text"/>
<listRow rsp_cd="R2" act_cd="A1" act_tx="A1 Text"/>
<listRow rsp_cd="R2" act_cd="A2" act_tx="A2 Text"/>
<listRow rsp_cd="R2" act_cd="A3" act_tx="A3 Text"/>
<listRow rsp_cd="R2" act_cd="A4" act_tx="A4 Text"/>
<listRow rsp_cd="R2" act_cd="A5" act_tx="A5 Text"/>
<listRow rsp_cd="R2" act_cd="A6" act_tx="A6 Text"/>
</list>
<list id="ActExcludeList">
<listRow act_cd="A2"/>
<listRow act_cd="A3"/>
</list>
</static>
</cmd-resp>
</resp-env>
我可以轻松地获取包含相应@rsp_cd的所有节点:
//static/list[@id='ResponseActionList']/listRow[@rsp_cd='R2']
我可以用以下方法排除特定@act_cd的节点:
//static/list[@id='ResponseActionList']/listRow[@rsp_cd='R2' and @act_cd!='A2']
我想要的是从上面第一个表达式中排除所有节点,其中@act_cd属性不在此表达式的结果中:
//static/list[@id='ActExcludeList']/listRow/@act_cd
我尝试过这样的事情,我没想到会这样做,而且我不确定下一步该尝试什么:
//static/list[@id='ResponseActionList']/listRow[@rsp_cd='R2' and not(contains(//static/list[@id='ActExcludeList']/listRow/@act_cd,@act_cd))]
答案 0 :(得分:0)
contains
函数用于查找其他字符串中的子字符串,而不是节点集中的值。您正在寻找的运算符是=
,它在XPath中是存在量化的 - 表达式a = b
其中a
和/或b
是节点集将成功集合a
中的任何节点都与b
中的任何相匹配。
//static/list[@id='ResponseActionList']/listRow[@rsp_cd='R2' and
not(@act_cd = //static/list[@id='ActExcludeList']/listRow/@act_cd)]