我是使用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,其中包括可以使用的命名空间的处理吗?
由于
答案 0 :(得分:3)
您的示例XML和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')]