首页 文章

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

提问于
浏览
0

给定一个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'

我想要的只是 Value 观: bar foo foo baz 甚至 bar foo baz

提前致谢!

1 回答

  • 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

相关问题