查询集合中包含文本节点的一组节点

时间:2021-07-28 15:37:39

标签: xml xpath

我在保险业工作,我们将保单编码为 XML。我正在尝试从策略的 XML 中获取与特定状态集匹配的所有 StateCd 节点。目前我有这个作为我的查询:

/CoPolicy/CoLobs/CoLob/WkPolicy/WkStates/WkState[WkStateCd != 'FL' and WkStateCd != 'IL']/WkStateCd

这将为我提供伊利诺伊州和佛罗里达州的所有节点。但是我想在这个列表中添加几个状态。如果我只是创建一个“WkStateCd != 'XX' and WkStateCd != 'YY' and...”的永无止境的列表,那么阅读起来会很痛苦,而且似乎也是不好的做法。我想做类似的事情:

Dim states As String[] = ["AL", "FL", "DC", ... ]
Dim xPath As String =  "/CoPolicy/CoLobs/CoLob/WkPolicy/WkStates/WkState[WkStateCd In states]/WkStateCd"

在 XPath 中是否有一种简单/干净的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

在 XPath 中,当右侧是序列时,相等运算符的作用类似于“输入”。如果左侧等于序列中的任何项目,它将评估为真。如果您的处理器支持 XPath 2.0+,您可以将 XPath 表达式构造为:

/CoPolicy/CoLobs/CoLob/WkPolicy/WkStates/WkState[WkStateCd = ('AL',FL','DC',...)]/WkStateCd

在 XPath 2.0 之前,无法直接在 XPath 表达式中使用逗号运算符来形成这样的序列。

如果您想排除列表中的状态(例如,执行“not in”),您通常会在条件周围放置一个 not():

not(WkStateCd = ('AL',FL','DC',...))

许多人在“不在”场景中犯的一个经典错误是尝试:

WkStateCd != ('AL',FL','DC',...)

当涉及序列时,这意味着不同于传统的“不在”。