我有一个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表达式的方法,它不需要两次写入完整路径?
由于
理查德
答案 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']
这可能会更长,但比上面更容易阅读。