【问题标题】:XPath selecting multiple elements with predicatesXPath 使用谓词选择多个元素
【发布时间】:2010-11-02 16:01:37
【问题描述】:

我有一个 XPath 查询,它正在做我想做的事,即使用给定的谓词选择“姓氏”和“给定名称”的联合(它实际上是我需要的非此即彼的,但联合工作正常):

/header/authors/surname[./text() and @id='1']
|
/header/authors/given-names[./text() and @id='1']

但是这对我来说似乎过于冗长,我觉得应该可以做一些更简洁的事情,例如:

/header/authors/(surname|given-names)[./text() and @id='1']

...但是这个版本不是有效的 XPath。

谁能告诉我编写原始 XPath 表达式的一种更简洁的方法,它不需要将完整路径写入两次?

谢谢

理查德

【问题讨论】:

  • “非此即彼”是什么意思?
  • @Alejandro:给定一个 id,所需的元素可以是“姓氏”或“给定名称”。这就是我想说的。我认为这是我需要的联合。

标签: xslt xpath


【解决方案1】:

首先,这是有效的 XPath 2.0:

/header/authors/(surname|given-names)[./text() and @id='1'] 

其次,这个 XPath 1.0:

/header/authors/*[self::surname|self::given-names][text()][@id='1'] 

【讨论】:

  • 这太棒了,我正要为它 +1。但是,在 XPath 1.0 版本中,最好不要在谓词中使用|。正确的运算符是or。在这种情况下,表达式仍然选择想要的节点,但在其他情况下,用| 替换or 不会产生等效的表达式。 +1,无论如何。
  • @Dimitre:关于| 联合集运算符,您是对的,但我在在这种情况下 使用了它,因为这两个术语都是节点集(并且因为简洁是钥匙)。谓词序列也是如此。
  • 这个答案解释了为什么我觉得我应该能够使用(surname|given-names)(当前项目没有使用 XPath 2.0),并且还提供了一个很棒的 XPath 1.0 替代方案。谢谢。
【解决方案2】:

怎么样

/header/authors/*[(name() = "surname" or name()="given-names") and ./text() and @id='1'] 

【讨论】:

  • 感谢您的回答。它确实节省了两次写路径,但与我的想法相比仍然有些笨拙。
【解决方案3】:

除了 Alejandro 和 Seva 的好答案之外,另一种选择是

(/header/authors/surname | /header/authors/given-names)[text() and @id='1']

这在 XPath 1.0 中有效。它仍然有点多余,但比您问题中冗长的版本更简洁。

另一种选择是为姓氏元素声明一个变量,为给定名称元素声明一个变量,然后

($surnames | $given-names)[text() and @id='1']

这可能会更长,但比上面的更容易阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多