2009-07-01 140 views
30

我知道这是一个简单的问题,但我无法弄清楚。 考虑下面简单的XML文档:从XPath中选择排除某些元素

<root> 
    <a></a> 
    <b></b> 
    <c></c> 
    <a></a> 
    <d></d> 
    <e></e> 
    <a></a> 
    <a></a> 
</root> 

什么是选择节点<b>的最佳方式,通过<e>使用XPath?

我正在寻找类似

/root/*[not(a)] 

(不这样做的伎俩)

+5

如何排除多个元素?我发现,它使用select =“* [not(self :: abc)] [not(self :: def)]” – lwpro2 2011-05-11 04:11:37

+0

这也应该用于排除多个元素[not(abc或def)] – novice 2013-09-11 09:16:54

回答

-2

你试过:

/根/ B | /根/ C |根/ d |/root/e

+4

这就是我实施的方式。不幸的是,可能有其他节点名称未知 – user123444555621 2009-07-01 12:11:39

6

我意识到这是一个老问题,但我最近碰到类似的问题,并使用以下xpath解决这个问题:

/root/*[not(name()='a')] 
7

回答补充一点,XPath 2.0中,你可以使用except

/root/(* except a) 

对于XPath 1.0中,托默勒格指出,这是做它的标准方式:

/root/*[not(self::a)] 

顺便说一句,如果有人在这里登陆试图在XSLT 2.0在xsl:template/@match使用这个属性就不会起作用,因为@match需要的图案,其尽管看起来像XPath表达式,都是而不是 XPath表达式。在这种情况下,XPath 1.0的解决方案将起作用。