0

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

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

我想查找是否至少有 1 个 locnr 元素

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

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

4

4 回答 4

2

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

/message[locnr[matches(., '^[AC][012]')]]
于 2013-08-01T13:21:51.720 回答
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"]
于 2013-08-01T13:10:53.597 回答
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'
]
于 2013-08-01T13:18:24.827 回答
-2

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

/书店/书[价格>35.00]

它直接来自 W3 学校的 XPath 语法页面,将返回具有价格子项的价值超过 35 的书籍元素。

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

currentNode.childNodes[0].nodeValue

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

于 2013-08-01T13:12:45.540 回答