2017-02-17 12 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

В контексте p элемента можно выбрать ancestor::*[self::app[@originator] | self::sec[@originator]][last()]/@originator см 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>