XSLT son elemanı alıyor


138

Ben gibi görünüyor benim xml, son elemanı bulmaya çalışıyorum:

    <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>

Geçerli öğenin ve ebeveynlerin "etkin" ve kardeş "etkin değil" olarak vurgulandığı bir tür ters menü almam gerekiyor. Bunun yerine sadece "D" elemanı tıkladığında dağınık bir ağaç var.

Çift D elemanları benim sorunum. select="//element[@name='D'][last()]"Veya select="//element[@name='D' and last()]"(btw hangisinin doğru?) Kullandığımda ilk kez D elemanının oluşması seçildiğinde (hata ayıklayıcı bunu gösterir). İşte 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>

Yanıtlar:


290

last()Dizin oluşturmayı, seçim ölçütlerinin bir parçası olarak değil, nodelist sonucuna koymanız gerekir . Deneyin:

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

6
+1. Güzel bir, () bu şekilde kullanabileceğinizi unutmuştum (ve bir indeksleyicinin kullanımında yoldaydı).
AnthonyWJones

1
Düğümü sonuncusundan önce nasıl bulabiliriz?
Ege

5
TIL: Görünüşe göre [ilk ()] yok ama kullanabilirsiniz [1]
Jessica

8
7 yıl sonra hala bu soruya oy verebilmem komik. Gerçekten XSLT'nin ne kadar kusurlu ve kusurlu olduğunu gösterir. Veba olarak XSLT'den kaçının: D
Nik

3
XSLT güzel ... XML dünyasında
yaşıyorsanız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.