XPath 2.0 : Retrieving nodes by attribute where value is case Insensitive

标签 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>

如果我想检索 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 支持 matches() 和 lower-case() 但作为 XPath 的新手我不明白如何应用它们:

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


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

谢谢

最佳答案

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

  • 示例 XML 元素未绑定(bind)到命名空间。 “我的” namespace 前缀已声明,但未用于这些元素,因此它们位于“无 namespace ”中。
  • 您的示例 XPath 在 Machine 的子元素上使用谓词过滤器,而不是在具有 @FQDNMachine 元素上使用谓词过滤器。<

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

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

Can someone provide a sample XPath that includes handling of Namespaces that would work?

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

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

关于XPath 2.0 : Retrieving nodes by attribute where value is case Insensitive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424367/

相关文章:

Python:忽略 elementtree.ElementTree 中的 xmlns

php SOAP 信封命名空间 <soap :Envelope and <SOAP-ENV:Envelope

xslt - 创造什么?函数或模板还是?

java - 从java中的xpath表达式中提取所有变量引用的最安全方法

结果之间有空格的 xmlstarlet

Java XPath 问题

xpath - 使用XPath选择不带 namespace 的节点

xml - XSLT和XPath出了点问题

java - 排除 xpath 表达式中的子元素

xml - 如何在xpath中选择属于同一组的节点?