2009-02-10 22 views
26

Hãy nói rằng tôi có một doc XML như thế này:Cách tham chiếu đến giá trị nút hiện tại trong XSL cho từng thử nghiệm?

<books> 
    <book>1110</book> 
    <book>1111</book> 
    <book>1112</book> 
    <book>1113</book> 
</books> 

Tôi đang cố gắng để thiết lập một điều kiện kiểm tra giá trị của nút hiện tại trong for-each, nhưng tôi đang làm một cái gì đó sai:

<xsl:for-each select="/books/book"> 
    <xsl:if test=".[='1112']"> 
     Success 
    </xsl:if> 
</xsl:for-each> 

Tôi đang làm gì không chính xác?

+0

. [SomeBoolean] là cú pháp hợp lệ trong XPath 1.0. –

Trả lời

37

Sử dụng . thực sự có thể tham chiếu đến nút (hoặc ngữ cảnh ") hiện tại, nhưng không phải cách bạn đang sử dụng tại đây. Trong XPath, .[foo] không phải là cú pháp hợp lệ - bạn cần sử dụng self::node()[foo] để thay thế. Ngoài ra, các nhà điều hành = cần một cái gì đó để phù hợp chống lại, trong trường hợp này bộ chọn text() để truy cập nội dung văn bản của phần tử:

<xsl:for-each select="/books/book"> 
    <xsl:if test="self::node()[text()='1112']"> 
     Success 
    </xsl:if> 
</xsl:for-each> 

Như đã nêu trong câu trả lời khác, tuy nhiên, trừ khi for-each của bạn hoạt động các hoạt động khác là tốt, bạn không cần phải lặp chút nào và có thể sử dụng chỉ if để thực hiện các nhiệm vụ tương tự:

<xsl:if test="/books/book[. = 1112]"> 
    Success 
</xsl:if> 
3

trong khi Ben đã trả lời câu hỏi của bạn một cách chính xác, sử dụng for-each chắc chắn là hầu hết các cách tiếp cận chung sai. Sau khi tất cả điều này là XSLT. Vì vậy, bạn có lẽ hơn tìm kiếm cái gì như thế này:

<xsl:if test="/books/book[text()='1112']"> 
    Success 
</xsl:if> 
+0

True; Tôi cho rằng OP chỉ cắt bỏ phần có liên quan của một khối 'for-each' lớn hơn, nhưng nếu đó là toàn bộ, thì sẽ tốt hơn nếu sử dụng' if' đơn giản này. –

12

Tôi đang cố gắng để thiết lập một điều kiện kiểm tra giá trị của nút hiện tại những for-each, nhưng tôi đang làm một cái gì đó sai:

điều đầu tiên đó là không chính xác là cú pháp:

.[='1112'] 

Có hai điều sai ở đây:

  1. Trong [và] không có vị: dấu "=" nhà điều hành cần hai đối số nhưng chỉ có một được cung cấp.

  2. .[x = y] vẫn là cú pháp không hợp lệ, mặc dù vị từ là OK. Điều này đã được quy định như:

    tự :: node() [điều kiện]

Điều thứ hai trong mã được cung cấp có thể được cải thiện là hướng dẫn <xsl:for-each>, mà isn' t cần thiết ở tất cả; Một biểu thức XPath đơn sẽ là đủ.

Để tóm tắt, một biểu thức XPath có thể là đánh giá với giá trị boolean yêu cầu là:

/books/book[. = '1112'] 

Nếu nó thực sự cần thiết mà điều kiện được kiểm tra bên trong hướng dẫn <xsl:for-each>, sau đó đúng XPath biểu thức tôi sẽ sử dụng là:

. = '1112' 

Ở trên là một đường so sánh ing và không được đánh giá là true() nếu có khoảng trắng xung quanh. Do đó, một so sánh số có thể tốt hơn:

. = 1112 
+1

Biểu thức '. = '1112'' làm việc tốt cho tôi. Cảm ơn. –

+0

@HosamAly, Bạn được chào đón. –

1

Hãy thử với điều này

<xsl:for-each select="/books/book"> 
    <xsl:if test="current() = '1112'"> 
     Success 
    </xsl:if> 
</xsl:for-each> 
Các vấn đề liên quan