2009-09-22 16 views
95

Próbuję znaleźć ostatni element w moim XML, który wygląda jakXSLT coraz ostatni element

<list> 
     <element name="A" /> 
     <element name="B" > 
      <element name="C" /> 
      <element name="D" > 
       <element name="D" /> 
       <element name="E" /> 
       <element name="F" /> 
       <element name="G" /> 
      </element> 
     <element name="H" /> 
     <element name="I" /> 
    </list> 

muszę dostać jakiś odwrotnej menu, gdzie prąd elementem i rodzice są zaznaczone jako „aktywny” i rodzeństwo jako "nieaktywne". Zamiast tego mam niechlujne drzewo tylko wtedy, gdy kliknę element "D".

Podwójne elementy D są moim problemem. Kiedy używam select="//element[@name='D'][last()]" lub select="//element[@name='D' and last()]" (z czego jeden jest poprawny?) Po raz pierwszy pierwsze wystąpienie elementu D jest wybrany (debugger pokazuje, że). Tutaj jest xsl

<xsl:template match="list"> 
    <xsl:apply-templates select="//navelement[@name = 'D'][last()]" mode="active"/> 
</xsl:template> 

<xsl:template match="element"> 
    <ul class="menu"> 
    <xsl:apply-templates select="preceding-sibling::node()" mode="inactive"/> 
     <li><a>....</a></li> 
    <xsl:apply-templates select="following-sibling::node()" mode="inactive"/> 
    </ul> 
    <xsl:apply-templates select="parent::element" mode="active"/> 
</xsl:template> 

<xsl:template match="element" mode="inactive"> 
     <li><a>....</a></li> 
</xsl:template> 

Odpowiedz

196

Musisz umieścić indeksowanie last() na wyniku nodelisty, a nie jako część kryteriów wyboru. Wypróbuj

(//element[@name='D'])[last()] 
+4

+1. Miły, zapomniałem, że możesz użyć() w ten sposób (i było daleko od korzystania z indeksu). – AnthonyWJones

+1

Jak znaleźć węzeł przed ostatnim? – Ege

+6

@Ege '[last() - 1]' pracował dla mnie – Jessica