使用XPath,我知道您可以通过以下方式使用union运算符:
//*[@id="Catalog"]/thead | //*[@id="Catalog"]/tbody
这对我来说似乎有些尴尬。有没有办法做一些类似于其中之一的事情呢?
//*[@id="Catalog"]/(thead|tbody)
//*[@id="Catalog"]/(thead or tbody)
//*[@id="Catalog"]/*[nodename="thead" or nodename="tbody"]
这对我来说似乎更具可读性和直观性......
答案 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不正确...