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 存在。

我能想到的就是:

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

第一个只在我在网上找到的一个 xpath 测试器中起作用,其余的根本不起作用。

我到处都看了(在 Whosebug 上阅读问题,在 w3schools、microsoft、ibm、xpath 测试仪、教程和 cheetsheets 上查看 tutorials/documentation/questions)并尝试解决几个小时。

如何 select column 个元素中的 @name@user:auto-column

请注意,属性 @user:auto-column 绑定到命名空间。 user 前缀在上面的元素上声明:xmlns:user='http://www.tableausoftware.com/xml/user'.

第一个 XPath 不应该起作用,除非您使用的 XPath 测试器简单地忽略了所有命名空间并处理了 namespace-unaware。

您列表中的第二个 XPath 是您想要使用的,以便解决 namespace-qualified 属性:

//column[@user:auto-column]/@name

但是,您需要确保 user 前缀的名称空间已声明,并且在您用于执行 XPath 的任何上下文中都可用。

否则,您可能希望仅在 local-name() 上寻找与名称空间无关的匹配和过滤方法。例如:

//column[@*[local-name() = 'auto-column']]/@name

现在,因为它仅按属性的 local-name() 过滤,所以您 运行 匹配具有相似属性名称且绑定到完全不同命名空间的元素的风险,而不是画面命名空间。这可能不太可能,但只是为了提高认识。