2010-07-23 97 views
2

他,如何为每个父节点选择每个不是具有多个父节点的树中的第一个子节点

我想我对XPath专家有棘手的问题。有一个节点结构是这样的:

A(1)-| 
    |-B(1) 
    |-B(2) 
    |-B(3) 
A(2)-| 
    |-B(2.1) 
    |-B(2.2) 
    |-B(2.3) 
... 

如何,有一个XPath表达式,只能提取以下节点

A(1)-| 
    |-B(2) 
    |-B(3) 
A(2)-| 
    |-B(2.2) 
    |-B(2.3) 
... 

这是它的第一个子元素应该被排除每个父节点。

我试图A/B [位置()!= 1]但是这将仅过滤出B(1.1)和选择B(2.1)。

谢谢

回答

2

棘手。您可以选择具有兄弟之前的节点:

A/B[preceding-sibling::*] 

这将失败的第一个元素,其余成功。

+0

您在五秒打我给它。 – Welbog 2010-07-23 17:05:31

+0

谢谢。我也试过了。不知何故,它不适用于我使用的xalan。 实际上,根据结果我在http://www.futurelab.ch/xmlkurs/xpath.en.html了,有位置()解决方案!= 1应该工作一样好,但它不我的系统。 使用xalan(2.7.1)有什么特殊之处? – d56 2010-07-23 18:13:30

+0

谢谢。那是我的错误。这两种解决方案的工作(前同辈:: *和位置()= 1] – d56 2010-07-23 18:28:46

3

此XPath表达式(不使用preceding-sibling::轴):

/*/a/*[not(position()=1)] 

当此XML文档上施加:

<t> 
<a> 
    <b11/> 
    <b12/> 
    <b13/> 
</a> 
<a> 
    <b21/> 
    <b22/> 
    <b23/> 
</a> 
</t> 

选择想要的节点

<b12 /> 
<b13 /> 
<b22 /> 
<b23 /> 

这可以用这个XSLT转换进行验证,产生上述结果

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/*/a/*[not(position()=1)]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

感谢。这是我的错误。这两种解决方案的工作(前同辈:: *和位置()= 1] – d56 2010-07-23 18:28:08

相关问题