2017-02-17 43 views
0

我有这样的XML,获取最遥远的祖先节点-Xpath,XSLT

<doc> 
    <chap> 
     <sec originator="ABC"> 
      <app originator="body"> 
       <sec originator="body"> 
        <p>text</p> 
       </sec> 
      </app> 
     </sec> 
    </chap> 
    <chap> 
     <chap> 
      <app originator="DEF"> 
       <sec originator="body"> 
        <sec> 
         <p>text2</p> 
        </sec> 
       </sec> 
      </app> 
     </chap> 
    </chap> 
    <sec originator="GHI"> 
     <sec originator="body"> 
      <p>text</p> 
     </sec> 
    </sec> 
    <app originator="KLM"> 
     <sec> 
      <sec> 
       <p>text2</p> 
      </sec> 
     </sec> 
    </app> 
</doc> 

我已经模板<p>节点,从写,我需要得到最远距离祖先<sec><app>节点originator属性值。

我的XPath是

//p/(ancestor::app[@originator][last()] | ancestor::sec[@originator][last()])/@originator 

这将选择originator属性值ABC, body, DEF, body, GHI, KLM ..但是,我需要的是ABC, DEF, GHI, KLM

我怎样才能改变我的XPath来获得最远距离<sec><app>节点originator属性值

回答

1

在可以选择ancestor::*[self::app[@originator] | self::sec[@originator]][last()]/@originator一个p元素的情况下,看到http://xsltransform.net/bFWR5EQ

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 


    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p"> 
     <p orig="{ancestor::*[self::app[@originator] | self::sec[@originator]][last()]/@originator}"> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 
</xsl:transform> 

<?xml version="1.0" encoding="UTF-8"?><doc> 
    <chap> 
     <sec originator="ABC"> 
      <app originator="body"> 
       <sec originator="body"> 
        <p orig="ABC">text</p> 
       </sec> 
      </app> 
     </sec> 
    </chap> 
    <chap> 
     <chap> 
      <app originator="DEF"> 
       <sec originator="body"> 
        <sec> 
         <p orig="DEF">text2</p> 
        </sec> 
       </sec> 
      </app> 
     </chap> 
    </chap> 
    <sec originator="GHI"> 
     <sec originator="body"> 
      <p orig="GHI">text</p> 
     </sec> 
    </sec> 
    <app originator="KLM"> 
     <sec> 
      <sec> 
       <p orig="KLM">text2</p> 
      </sec> 
     </sec> 
    </app> 
</doc>