XPath 2.0:按属性检索节点,其中值为case不敏感

时间:2011-09-14 23:56:44

标签: xpath xml-namespaces xpath-2.0

我是使用XPath的新手,我试图通过其属性检索节点,但问题是该属性不区分大小写,这意味着我不会完全知道字符串是如何在文档中装入的。

例如:

鉴于文件:

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

如果我想要检索机器1,我会使用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()和小写()但是对XPath不熟悉我不明白如何应用它们:

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


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

由于

1 个答案:

答案 0 :(得分:3)

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

  • 示例XML元素未绑定到命名空间。声明了“my”namespace-prefix,但不用于这些元素,因此它们位于“no namespace”中。
  • 您的示例XPath正在Machine的子项上使用谓词过滤器,而不是使用Machine的{​​{1}}元素。

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

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

    @FQDN
  • upper-case()函数来评估大写字符串:

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

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

有人可以提供包含处理的示例XPath   可以使用的命名空间?

不确定处理命名空间的含义,但是如果要匹配这些元素而不管它们的命名空间如何,那么可以使用通配符运算符作为命名空间:

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