检查至少1个节点值是否与特定模式匹配

时间:2013-08-01 12:58:24

标签: string xpath compare

我正在尝试检查包含特定模式的元素中的值。 例如,我有以下一些元素:

    <message>
      <locnr>A001</locnr>
      <locnr>K301</locnr>
      <locnr>Z310</locnr>
      <locnr>B311</locnr>
    </message>

我想找出至少有1个locnr元素

  • 'A'/'C'开头
  • ,第二个字符是 '0'/'1'/'2'

在上面的示例中,由于locnr的值为'A001',因此消息通过测试的文件。

4 个答案:

答案 0 :(得分:2)

如果您的XPath处理器支持XPath 2.0,请使用正则表达式。

/message[locnr[matches(., '^[AC][012]')]]

答案 1 :(得分:1)

以下XPath表达式应该执行您想要的操作:

message[substring(locnr,1,1)='A' or substring(locnr,1,1)='C']
       [substring(locnr,2,1)="0" or substring(locnr,2,1)="1" or substring(locnr,2,1)="2"]

答案 2 :(得分:0)

试试这个:

//message
[
  count(locnr[starts-with(text(),'A') or starts-with(locnr/text(),'C')])>0 
  and 
      substring(locnr/text(),2,1) = '0' 
    or 
      substring(locnr/text(),2,1) = '1' 
    or 
      substring(locnr/text(),2,1) = '2'
]

答案 3 :(得分:-2)

在我最近使用XPath和XML文档的经历中,我发现XPath表达式更多地设计用于帮助定位特定节点,而不是分析其中保存的值。当然你可以根据值过滤返回的节点,但我相信(有人纠正我,如果我错了),它只限于简单相等或大于/小于数值。这是通过如下声明完成的:

/书店/书[价格&gt; 35.00]

直接来自W3学校的XPath语法页面,并且会返回价值超过35的价格儿童的图书元素。

如果我在你的位置,我可能会使用XPath来获取XPath中的所有locnr元素,只需“locnr”,然后在返回的节点列表中运行循环。对于每个节点,您可以通过我找到的两种方式获取字符串的值。如果您知道该元素是一个叶子,则.text将起作用,但如果它可能不会那么注意,因为.text返回节点及其后代的所有值。另一种方法是访问节点的第一个子节点的nodeValue。类似的东西:

currentNode.childNodes [0] .nodeValue

只需使用字符串方法来提取您感兴趣的字符,并为您的模式提供条件。