Xpath无法使用命名空间检查传递属性



使用此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存在。

我所能想到的就是:

  1. //column[@auto-column]/@name
  2. //column[@user:auto-column]/@name
  3. //column[@auto-column=user:column[@auto-column]]/@name

第一个只在我在网上找到的一个xpath测试人员中工作,其余的都不工作。

我已经找遍了我能找的地方(在stackoverflow上阅读这里的问题,查看w3schools、微软、ibm、xpath测试人员、教程和cheetsheets上的教程/文档/问题(,并尝试解决了几个小时。

如何选择具有@user:auto-columncolumn元素中的@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命名空间。这可能不太可能,但只是为了提高认识。

最新更新