XSLT รับองค์ประกอบสุดท้าย


145

ฉันกำลังพยายามค้นหาองค์ประกอบสุดท้ายใน xml ของฉันซึ่งดูเหมือนว่า:

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

ฉันต้องการเมนูย้อนกลับบางประเภทโดยที่องค์ประกอบปัจจุบันและผู้ปกครองถูกเน้นว่า "ใช้งานอยู่" และพี่น้องเป็น "ไม่ใช้งาน" ผลลัพธ์ที่ได้คือฉันมีต้นไม้รกก็ต่อเมื่อฉันคิดว่าองค์ประกอบ "D" คลิก

องค์ประกอบ Double D เป็นปัญหาของฉัน เมื่อฉันใช้ select="//element[@name='D'][last()]"หรือselect="//element[@name='D' and last()]"(btw ข้อใดถูกต้อง?) ครั้งแรกที่เกิดขึ้นครั้งแรกขององค์ประกอบ D ถูกเลือก (ดีบักเกอร์แสดงให้เห็นว่า) นี่คือ 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>

คำตอบ:


303

คุณจำเป็นต้องใส่การlast()จัดทำดัชนีบนผลลัพธ์ของผู้สร้างแบบจำลองแทนที่จะเป็นส่วนหนึ่งของเกณฑ์การคัดเลือก ลอง:

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

1
เราจะหาโหนดก่อนอันสุดท้ายได้อย่างไร?
เอจ

5
TIL: เห็นได้ชัดว่าไม่มี [first ()] แต่คุณสามารถใช้ [1]
Jessica

9
เป็นเรื่องตลกที่ฉันยังคงได้รับคะแนนโหวตสำหรับคำถามนี้หลังจาก 7 ปี มันแสดงให้เห็นว่า XSLT มีข้อบกพร่องและมีข้อบกพร่องเพียงใด หลีกเลี่ยง XSLT เป็นโรคระบาด: D
Nik

4
XSLT สวยงาม ... ถ้าคุณอาศัยอยู่ในโลก XML
nicojs

// element [@ name = 'D'] [last ()] เป็นสำนวนมากกว่า
FigmentEngine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.