XPath选择带谓词的多个元素

时间:2010-11-02 16:01:38

标签: xslt xpath

我有一个XPath查询正在做我想要的,即选择'surname'和&的联合。给定谓词的'给定名称'(它实际上是或者我需要的,但联合工作正常):

/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表达式的方法,它不需要两次写入完整路径?

由于

理查德

3 个答案:

答案 0 :(得分:26)

首先,这是有效的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 :(得分:4)

怎么样

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

答案 2 :(得分:2)

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

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

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

另一个替代方案是为姓氏元素声明变量,为给定名称元素声明变量,然后

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

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