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']

但是获取 machine2 的类似 XPath 将失败,因为大小写不匹配:

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

我看到各种帖子提到使用类似的东西(我不确定如何将命名空间应用于此):

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

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


最后,我读到 XPath 2.0 支持 match() 和 lower-case() 但对 XPath 来说是新手,我不明白如何应用它们:

例如,如果我尝试以下操作,我会得到一个“无效的合格名称”: //my:Machines/my:Machine/ [matches(@FQDN, '(?i)machine1.mydomain.com')] //my:Machines /my:Machine/ [小写(@FQDN,'machine1.mydomain.com')]


有人可以提供一个示例 XPath,其中包括可以处理的命名空间吗?

谢谢

4

1 回答 1

3

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

  • 示例 XML 元素未绑定到名称空间。声明了“我的”命名空间前缀,但不用于这些元素,因此它们位于“无命名空间”中。
  • 您的示例 XPath 对 的子级使用谓词过滤器,Machine而不是对Machine具有@FQDN.

您可以使用以下任何一种方法来查找不区分大小写的值:

  • matches()函数,带有不区分大小写匹配的标志:

    //Machines/Machine[matches(@FQDN,'machine2.mydomain.com','i')]
    
  • upper-case()评估大写字符串的函数:

    //Machines/Machine[upper-case(@FQDN)=upper-case('machine2.mydomain.com')]
    
  • lower-case()评估小写字符串的函数:

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

有人可以提供一个示例 XPath,其中包括可以处理的命名空间吗?

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

//*:Machines/*:Machine[matches(@FQDN,'machine2.mydomain.com','i')]
于 2011-09-15T01:36:59.123 回答