鉴于XPath查询会产生一个名称不同的属性列表,您是否可以附加到该查询以仅选择值并省略属性名称等? (为了便携性,我瞄准了XPath 1.0)
地址人员的XML示例:
<people>
<person workaddr="foo" homeaddr="bar"/>
<person workaddr="baz" homeaddr="foo"/>
<person workaddr="qux" homeaddr="zoo"/>
</people>
我的XPath查询,用于查找以地址foo
以任何方式关联的任何人的所有地址:
//person[@*='foo']/@*['addr' = substring(name(.), string-length(name(.)) - string-length('addr') +1) and . != '']
(我知道这会匹配任何人任何属性,其值为foo
,而不只是foo
地址,因为在实际情况除了工作和家庭地址之外还有其他属性。如果您碰巧知道如何改进我的查询以将属性值检查限制为名称以addr
结尾的属性,这将是一个很好的奖励)
至少根据http://www.freeformatter.com/xpath-tester.html#ad-output我的查询结果是:
Attribute='homeaddr=bar'
Attribute='workaddr=foo'
Attribute='homeaddr=foo'
Attribute='workaddr=baz'
我喜欢的只是价值观:bar foo foo baz
甚至bar foo baz
提前致谢!
答案 0 :(得分:1)
这就是特定XPath测试程序在输出中持久化的方式。您可以轻松切换到更好地满足您需求的不同工具,例如,http://www.xpathtester.com/xpath不会在输出中打印属性名称,因为您可以看到in this demo。此外,XPath处理器库,如果您正在使用它,总是提供一种方法来只读取其API中属性的值。
现在关于另一个问题,您似乎将结果限制为名称以“addr”结尾的属性,因此只需在前一个路径步骤中实现相同的谓词,以将“foo”的检查限制为名称结束的属性使用'addr':
//person[@*[
'addr' = substring(name(.), string-length(name(.)) - string-length('addr') +1)
and .='foo'
]]
/@*[
'addr' = substring(name(.), string-length(name(.)) - string-length('addr') +1)
and . != ''
]
<强> demo
强>