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

Xpath cannot check passing attribute using namespace

提问人:RaffaMusicman 提问时间:2/4/2022 最后编辑:Mads HansenRaffaMusicman 更新时间:2/4/2022 访问量:29

问:

使用以下 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>

我想提取 ,但前提是属性存在。@nameuser: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,microsoft,ibm,xpath测试人员,教程和cheetsheets上的教程/文档/问题),并试图解决几个小时。

如何选择具有 ?@namecolumn@user:auto-column

XML XPath 命名空间

评论


答:

1赞 Mads Hansen 2/4/2022 #1

请注意,该属性绑定到命名空间。前缀在上面的元素上声明:。@user:auto-columnuserxmlns: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 如果这解决了您的问题,请接受答案