13

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

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

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

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

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

4

4 回答 4

11

而表达式:

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

是正确的

这个表达式更有效

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

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

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

如果可能的名称数量非常长(无限且未知长度),则使用最后一种技术可能特别实用。管道分隔的可能名称字符串甚至可以作为外部参数传递给转换,这大大提高了它的通用性、可重用性和“干性”。

于 2012-10-23T04:14:28.623 回答
5

您正在寻找name()功能:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]
于 2012-10-22T14:46:11.000 回答
3

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

于 2012-10-22T15:39:28.087 回答
0

是的,您可以使用:

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

编辑:

只需重新阅读您的原始帖子并意识到您在问什么。上述语法不适用于这种情况。不确定如何获取要使用的节点名称,但节点名称不正确...

于 2012-10-22T14:37:44.653 回答