我是 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
的子元素上使用谓词过滤器,而不是在具有@FQDN
的Machine
元素上使用谓词过滤器。<
您可以使用以下任一方法来查找不区分大小写的值:
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/