在XPath中是否可以将OR运算符与节点名一起使用?

时间:2012-10-22 14:34:45

标签: xpath

使用XPath,我知道您可以通过以下方式使用union运算符:

//*[@id="Catalog"]/thead | //*[@id="Catalog"]/tbody

这对我来说似乎有些尴尬。有没有办法做一些类似于其中之一的事情呢?

//*[@id="Catalog"]/(thead|tbody)
//*[@id="Catalog"]/(thead or tbody)
//*[@id="Catalog"]/*[nodename="thead" or nodename="tbody"]

这对我来说似乎更具可读性和直观性......

4 个答案:

答案 0 :(得分:8)

表达式:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]

是正确的

此表达式效率更高

//*[@id="Catalog"]/*[self::thead or self::tbody]

还有第三种方法可以检查元素的名称是否是指定的字符串序列之一

//*[@id="Catalog"]/*[contains('|thead|tbody|',concat('|',name(),'|'))]

如果可能名称的数量很长(无限长度和未知长度),使用这最后一种技术尤其实用。管道分隔的可能名称字符串甚至可以作为外部参数传递给转换,这极大地增加了它的通用性,可重用性和“干”性。

答案 1 :(得分:5)

您正在寻找name()功能:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]

答案 2 :(得分:3)

请注意,使用XPath 2.0,您的尝试//*[@id="Catalog"]/(thead|tbody)是正确的。但是,对于XPath 1.0,这种方法不起作用。

答案 3 :(得分:0)

是的,你可以使用:

//*[@id="Catalog"]/[nodename='thead' or nodename='tbody']

编辑:

重新阅读原帖并意识到你在问什么。对于这种情况,上述语法不正确。不知道如何获取要使用的节点的名称但是nodename不正确...