XPath 2.0: 检索属性值大小写不敏感的节点

3

我是第一次使用XPath,正在尝试通过它的属性来检索节点,但问题是该属性不区分大小写,这意味着我无法确定文档中字符串的大小写。

例如:

给定以下文档:

<Document xmlns:my="http://www.MyDomain.com/MySchemaInstance">
  <Machines>
    <Machine FQDN="machine1.mydomain.com">
      <...>
    </Machine>
    <Machine FQDN="Machine2.MyDomain.Com">
      <...>
    </Machine>
  </Machines>
</Document>

如果我想检索 machine1,我将使用 XPath:

//my:Machines/my:Machine/*[@FQDN='machine1.mydomain.com']

但是,如果使用相似的XPath获取machine2,将会失败,因为大小写不匹配:

//my:Machines/my:Machine/*[@FQDN='machine2.mydomain.com']  //Fails

我看到过一些帖子提到使用这样的东西(我不确定如何将命名空间应用于此):

translate(@FQDN, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')

但是,即使我让它工作起来也会非常麻烦,考虑到我将使用它的次数。


最后,我了解到XPath 2.0支持matches()和lower-case(),但由于对XPath不熟悉,我不知道如何应用它们:

例如,如果我尝试以下内容,就会出现“无效的限定名称”: //my:Machines/my:Machine/[matches(@FQDN, '(?i)machine1.mydomain.com')] //my:Machines/my:Machine/[lower-case(@FQDN, 'machine1.mydomain.com')]


有人能提供一个包括命名空间处理的XPath示例吗?

谢谢

1个回答

3

你的示例XML和XPath语句不匹配。

  • 示例XML元素未绑定到命名空间。声明了“my”命名空间前缀,但没有用于这些元素,因此它们位于“无命名空间”中。
  • 你的示例XPath在Machine的子元素上使用断言过滤器,而不是在具有@FQDNMachine元素上。

你可以使用以下任一方法来不区分大小写地查找值:

  • matches() function, with a flag for case-insensitive matching:

    //Machines/Machine[matches(@FQDN,'machine2.mydomain.com','i')]
    
  • upper-case() function to evaluate the upper-case strings:

    //Machines/Machine[upper-case(@FQDN)=upper-case('machine2.mydomain.com')]
    
  • lower-case() function to evaluate the lower-case strings:

    //Machines/Machine[lower-case(@FQDN)=lower-case('machine2.mydomain.com')]
    

有人能提供一个处理命名空间的XPath示例吗?

不确定您所说的命名空间处理是什么意思,但如果您想匹配这些元素而不考虑它们的命名空间,则可以使用通配符运算符:

//*:Machines/*:Machine[matches(@FQDN,'machine2.mydomain.com','i')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接