如何从不同命名的属性列表中选择值?

时间:2017-04-21 21:10:06

标签: xml xpath

鉴于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

提前致谢!

1 个答案:

答案 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