2011-07-02 75 views
3

<bookmark/>。所需的输出我想要的是id的值5如何用xpath获得最近的祖先或祖先的子女

<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/>只给了我4

<?xml version="1.0" encoding="UTF-8"?> 
<content> 
    <section id="1"> 
     <section id="2"/> 
     <section id="3"/> 
     <section id="9"/> 
    </section> 
    <section id="4"> 
     <section> 
      <section id="10"/> 
      <section id="5"/> 
      <section> 
       <bookmark/> 
       <section id="6"> 
        <section id="7"> 
         <section id="8"/> 
        </section> 
       </section> 
      </section> 
     </section> 
    </section> 
</content> 
+0

好问题,+1。目前唯一正确的答案见我的答案。 –

回答

4

我理解的问题和所提供的XML文档的方式是,最近的id属性也可以发生在一个祖先(section)元素

在任何这种情况下,使用ony的preceding::轴(如该问题的其他答案中所指定的)的表达式不会选择任何节点。

一个正确的XPath表达式,它选择想要id属性是

(//bookmark/ancestor::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id 
    ) 
    [last()] 

如果id属性也被允许的bookmark元件本身上,上面的XPath表达式需要稍微修改以适应这样的:

(//bookmark/ancestor-or-self::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id 
    ) 
    [last()] 

待办事项:ancestor::preceding::轴不相交(不重叠)。

1

使用上述轴:

<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/> 
4

section[@id=5]不是祖先<bookmark>,但它是前面的它。

祖先轴包含上下文节点的 祖先;上下文节点的 祖先由上下文节点的父节点和 父节点的父节点构成 ;依此类推;因此, 祖先轴将总是包括 根节点,除非上下文节点是 根节点

轴前述包含的所有节点 同一文档的上下文 节点属于上下文之前在节点 按文档顺序,不包括任何 祖先和不包括属性 节点和命名空间节点

变化ancestor::preceding::

//bookmark/preceding::*[@id][1]/@id 
+0

Mads Hansen:这个解决方案不包括具有'id'属性的最近元素是父亲或祖先的情况。查看我的答案以获得正确的XPath表达式,其中也涵盖了这种情况。 –