XSLT nhận phần tử cuối cùng


138

Tôi đang cố gắng tìm phần tử cuối cùng trong xml của mình, trông giống như:

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

Tôi cần nhận được một số loại menu đảo ngược, trong đó yếu tố hiện tại và cha mẹ được tô sáng là "hoạt động" và anh chị em là "không hoạt động". Thay vào đó, kết quả là tôi chỉ có một cây lộn xộn khi giả sử phần tử "D" được nhấp.

Yếu tố Double D là vấn đề của tôi. Khi tôi sử dụng select="//element[@name='D'][last()]"hoặc select="//element[@name='D' and last()]"(btw cái nào đúng?) Lần đầu tiên xuất hiện phần tử D được chọn (trình gỡ lỗi cho thấy điều đó). Đây là 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>

Câu trả lời:


290

Bạn cần đặt last()chỉ mục vào kết quả nốt, chứ không phải là một phần của tiêu chí lựa chọn. Thử:

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

6
+1. Thật tuyệt, tôi đã quên bạn có thể sử dụng () theo cách đó (và đã không sử dụng bộ chỉ mục).
AnthonyWJones

1
Làm thế nào chúng ta có thể tìm thấy nút trước cái cuối cùng?
Ege

5
TIL: Rõ ràng không có [đầu tiên ()] nhưng bạn có thể sử dụng [1]
Jessica

8
Thật buồn cười là tôi vẫn nhận được phiếu bầu cho câu hỏi này sau 7 năm. Nó thực sự cho thấy XSLT thiếu sót và khiếm khuyết như thế nào. Tránh XSLT như một bệnh dịch: D
Nik

2
XSLT rất đẹp ... nếu bạn đang sống trong một thế giới XML
nicojs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.