使用此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、微软、ibm、xpath测试人员、教程和cheetsheets上的教程/文档/问题(,并尝试解决了几个小时。
如何选择具有@user:auto-column
的column
元素中的@name
?
@user:auto-column
绑定到一个命名空间。user
前缀是在上面的元素上声明的:xmlns:user='http://www.tableausoftware.com/xml/user'
。
第一个XPath不应该工作,除非您使用的XPath测试人员忽略了所有名称空间,并且处理了不知道名称空间的名称空间。
列表中的第二个XPath是您想要使用的,以便处理命名空间限定的属性:
//column[@user:auto-column]/@name
但是,您需要确保user
前缀的名称空间已声明,并且在用于执行XPath的上下文中可用。
否则,您可能希望仅在local-name()
上查找与命名空间无关的匹配和筛选方法。例如:
//column[@*[local-name() = 'auto-column']]/@name
现在,因为它只通过属性的local-name()
进行过滤,所以您有可能匹配具有相似属性名称的元素,这些元素绑定到完全不同的命名空间,而不是tableau命名空间。这可能不太可能,但只是为了提高认识。