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 测试器中起作用,其余的根本不起作用。
我到处都看了(在 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()
过滤,所以您 运行 匹配具有相似属性名称且绑定到完全不同命名空间的元素的风险,而不是画面命名空间。这可能不太可能,但只是为了提高认识。
使用这个 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 测试器中起作用,其余的根本不起作用。
我到处都看了(在 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()
过滤,所以您 运行 匹配具有相似属性名称且绑定到完全不同命名空间的元素的风险,而不是画面命名空间。这可能不太可能,但只是为了提高认识。