提问人:RaffaMusicman 提问时间:2/4/2022 最后编辑:Mads HansenRaffaMusicman 更新时间:2/4/2022 访问量:29
Xpath 无法使用命名空间检查传递的属性
Xpath cannot check passing attribute using namespace
问:
使用以下 xpath 练习代码:
<datasource formatted-name='Activity' inline='true' source-platform='win' version='18.1' xmlns:user='http://www.tableausoftware.com/xml/user'>
<column datatype='integer' name='[Number of Records]' role='measure' type='quantitative' user:auto-column='numrec'>
<calculation class='tableau' formula='1' />
</column>
</datasource>
我想提取 ,但前提是属性存在。@name
user:auto-column
我能想到的就是:
//column[@auto-column]/@name
//column[@user:auto-column]/@name
//column[@auto-column=user:column[@auto-column]]/@name
第一个只在我在网上找到的一个 xpath 测试器中工作,其余的根本不起作用。
我尽可能地寻找了所有可能的地方(在stackoverflow上阅读问题,查看了w3schools,microsoft,ibm,xpath测试人员,教程和cheetsheets上的教程/文档/问题),并试图解决几个小时。
如何选择具有 ?@name
column
@user:auto-column
答:
1赞
Mads Hansen
2/4/2022
#1
请注意,该属性绑定到命名空间。前缀在上面的元素上声明:。@user:auto-column
user
xmlns:user='http://www.tableausoftware.com/xml/user'
第一个 XPath 应该不起作用,除非您使用的 XPath 测试器只是忽略了所有命名空间并处理了不知道命名空间的问题。
列表中的第二个 XPath 是您想要使用的,以便处理该命名空间限定属性:
//column[@user:auto-column]/@name
但是,您需要确保前缀的命名空间已声明,并且在用于执行 XPath 的任何内容的上下文中都可用。user
否则,您需要在 上寻找一种与命名空间无关的匹配和筛选方法。例如:local-name()
//column[@*[local-name() = 'auto-column']]/@name
现在,由于它仅按属性进行筛选,因此您冒着匹配具有相似属性名称的元素的风险,这些元素绑定到完全不同的命名空间,而不是 tableau 命名空间。这可能不太可能,但只是为了提高认识。local-name()
评论
0赞
RaffaMusicman
2/4/2022
非常感谢!像你这样的人让这个世界变得更美好!
0赞
Prophet
2/4/2022
@RaffaMusicman 如果这解决了您的问题,请接受答案
评论