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

Aje*_*i32 9 xpath

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

//*[@id="Catalog"]/thead | //*[@id="Catalog"]/tbody
Run Code Online (Sandbox Code Playgroud)

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

//*[@id="Catalog"]/(thead|tbody)
//*[@id="Catalog"]/(thead or tbody)
//*[@id="Catalog"]/*[nodename="thead" or nodename="tbody"]
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 9

虽然表达式:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]
Run Code Online (Sandbox Code Playgroud)

是正确的

这个表达式更有效:

//*[@id="Catalog"]/*[self::thead or self::tbody]
Run Code Online (Sandbox Code Playgroud)

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

//*[@id="Catalog"]/*[contains('|thead|tbody|',concat('|',name(),'|'))]
Run Code Online (Sandbox Code Playgroud)

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


cho*_*oba 5

您正在寻找name()功能:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]
Run Code Online (Sandbox Code Playgroud)