2010-06-03 36 views
6

Tại saotest = "" trên một boolean luôn trả về true

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

LUÔN trở thành sự thật?

Vì boolean có thể là 0,1, "false" và "true" theo định nghĩa, cách duy nhất để kiểm tra giá trị boolean là so sánh chuỗi với các giá trị này. Điều này không thể đúng.

+0

bạn có thể vui lòng đăng biểu thức XPath hiện tại của mình bằng một đoạn XML không? –

+0

Đây không phải là một câu hỏi nào cả. Xin vui lòng, đưa ra một ví dụ cụ thể - biểu thức XPath chính xác là gì và tệp XML là gì (đơn giản nhất có thể, xin vui lòng) mà biểu thức XPath này được đánh giá? –

+0

Thích xem một ví dụ, tôi đoán có một lỗi nhỏ trong cú pháp. –

Trả lời

8

Các test quy định tại <xsl:if> công trình như thể nó được gọi là boolean chức năng. Chức năng này không hoạt động theo cách bạn nghĩ. Nếu đối số của nó đánh giá đến một tập hợp nút (nó sẽ là nếu bạn sử dụng một đường dẫn làm đối số của nó), nó sẽ trả về true nếu tập nút không rỗng, và sai khác. Vì vậy, hiệu quả, bạn đang thử nghiệm cho sự tồn tại của một phần tử, không phải giá trị của nó. Nếu foo chứa false,

<xsl:if test="/path/to/foo"> 

sẽ luôn luôn đánh giá đúng, vì những gì bạn đang thực sự yêu cầu trong bài kiểm tra đó là "không tố này tồn tại?" và không phải "giá trị của phần tử có đúng không?" Và yếu tố tồn tại.

Nguyên tắc rằng các giá trị boolean phải true, false, 1, hoặc 0 là một phần của XML Schema (which see) và không XPath, mà không biết gì về quy tắc này. (XPath 1.0, nghĩa là XPath 2.0/XQuery 1.0 có the fn:boolean function, thông minh, tức là nhận biết lược đồ XML, đánh giá các giá trị boolean.) Để xác định xem giá trị có đúng trong XSLT hay không, bạn phải kiểm tra rõ ràng:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

Nếu tôi đang đọc http://www.w3.org/TR/xpath/#section-Boolean-Functions một cách chính xác, sẽ không có sự khác biệt giữa hai bài kiểm tra. Trên thực tế xsl: nếu được chỉ định để chuyển đổi kết quả thử nghiệm như thể bằng một cuộc gọi đến hàm boolean. –

+0

Bạn biết đấy, tôi biết điều đó. Đã sửa. –

+0

Trong ví dụ trên, bạn sẽ gặp phải sự cố khi bạn sử dụng bộ xử lý nhận biết lược đồ. Vì bộ xử lý biết từ lược đồ/path/to/foo là xs: boolean, nó sẽ tạo ra thông báo lỗi "Không thể so sánh xs: boolean với xs: string". Tôi có chính xác vấn đề này (với một thuộc tính boolean) - và tôi không thực sự biết làm thế nào để giải quyết nó. Bất kỳ giúp đỡ? –

0

Đặc tả xpath cung cấp chức năng boolean. Do đó boolean (Value) sẽ luôn trả về true hoặc false.

Các vấn đề liên quan