2015-12-16 60 views
1

我需要一个XPath(1.0),以获得与多个孩子的父节点,但只有一个类型的孩子(例如,或者<div><li>但不<div><li>) 。任何帮助?谢谢!XPath来获得父母有多个孩子,但只有一个类型的子

<doc> 
    <tom> 
     <janet /> 
    </tom> 
    <dick> 
     <janet /> 
     <jane /> 
    </dick> 
    <harry> 
     <jane /> 
    </harry> 
</doc> 

所以,对上面我们应该得到汤姆和哈里但不家伙

+3

一个例子将是非常有益的;-) – drkthng

+0

我不知道,一个例子是对这个问题特别有帮助,因为它解决一般来说,如果有方法检查子元素是否都是相同类型的。 – Nico21

回答

1

使用的例子作为参考,以下XPath 1.0表达式:

/doc/*[count(./*) = count(./*[name(.) = name(../*[1])])]

将返回所有的孩子doc其中该元素的子女总数等于与该元素的第一个子女姓名相同的子女人数。或者更简单地说,所有的孩子都有同样的名字,也就是'类型'。

然而,上述将返回有0或1子节点,所以将其限制为仅在有多个子节点,我们可以使用: /doc/*[count(./*) = count(./*[name(.) = name(../*[1])]) and count(./*) > 1]

如果您想进一步限制它,所有的孩子都在一定元素,例如jane,您可以使用:/doc/*[count(./*) = count(./*[name(.) = name(../*[1])]) and count(./*) > 1 and ./*[1] = ./jane[1]]

+0

非常聪明的解决方案,谢谢!我认为'//*[count(./*)= count(./* [name(。)= name(../* [1])])和count(./*)> 1]'可以如果对路径没有进一步的限制,就认为这是解决这个问题的办法。 – Nico21

相关问题