Làm thế nào để tạo một giá trị boolean?


86

Tôi hoàn toàn mới sử dụng XSLT và không thể tìm ra nơi tôi làm sai với mã sau.

<xsl:variable name="var" select="boolean('false')"/>

<xsl:if test="$var'">variable is true</xsl:if>

Nó luôn trả về true khi nó có nghĩa là sai. Tại sao?


3
Chỉ là một gợi ý, nhưng bạn cũng có thể nhận được câu trả lời có tầm cỡ hơn nếu bạn viết tiêu đề của mình như một câu hỏi thích hợp và tránh nói l33t.
Will Dean

Câu trả lời:


168

Giá trị của biến $ var như được định nghĩa trong:

   <xsl:variable name="var" select="boolean('false')"/>

   true()

Điều này là do trong XPath " false" là một chuỗi thông thường, trái ngược với false(), là hàm tạo cho booleangiá trịfalse()

Hai giá trị boolean trong XPath là (lưu ý rằng chúng được xây dựng!):

   true()false()

Chi tiết chuyển đổi bất kỳ giá trị nào thành boolean được viết trong Thông số XPath :

"Hàm boolean chuyển đổi đối số của nó thành boolean như sau:

  • một số đúng nếu và chỉ khi nó không dương hoặc không âm và không phải là NaN

  • một tập hợp nút là đúng nếu và chỉ khi nó không trống

  • một chuỗi là true nếu và chỉ khi độ dài của nó khác 0

  • một đối tượng thuộc kiểu khác với 4 kiểu cơ bản được chuyển đổi thành kiểu boolean theo cách phụ thuộc vào kiểu đó "

Trong trường hợp của bạn, chuỗi "false" không phải là số 0 và có độ dài dương, do đó, quy tắc trong dấu đầu dòng thứ 3 ở trên được áp dụng true().

Do đó, để xác định một biến trong XSLT 1.0, có giá trị là false() , người ta cần viết định nghĩa như sau:

   <xsl:variable name="vMyVar" select="false()"/>

hoặc, nếu bạn không nhớ chính xác điều này, bạn luôn có thể viết:

   <xsl:variable name="vMyVar" select="1 = 0"/>

(chỉ định bất kỳ biểu thức nào được đánh giá là false()) và bộ xử lý XSLT sẽ thực hiện công việc cho bạn.

Trong XSLT 2.0, tốt hơn hết là chỉ định rõ ràng loại biến:

   <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>


@DimitreNovatchev Xin chào Dimitre. Đây là giải pháp nếu giá trị boolean được mã hóa cứng trong tệp chuyển đổi XSL. Có một giải pháp gọn gàng cho falsevà các truechuỗi đến từ tệp đang được chuyển đổi mà không liên quan đến so sánh chuỗi không?
Jagger

1
@Jagger, Đây là câu hỏi khác. Câu hỏi này hỏi " Cách tạo giá trị Boolean " và đã có câu trả lời chính xác. Bạn đang hỏi: " Làm thế nào để diễn giải (hoặc phân tích cú pháp) các chuỗi cụ thể thành các giá trị Boolean " - đây là một câu hỏi hoàn toàn khác. Tôi có thể hỏi có gì sai với so sánh chuỗi không?
Dimitre Novatchev

17

Hàm boolean () bạn đang sử dụng thực sự đang thực hiện công việc của nó. Để sử dụng các giá trị true và false rõ ràng, bạn nên sử dụng các hàm sau:

<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>

Chỉ FYI, theo tài liệu MSDN , boolean () trả về như sau:

  • Nếu đối số là số âm hoặc số dương, nó được chuyển đổi thành giá trị Boolean true.
  • Nếu đối số bằng 0 hoặc giá trị NaN, đối số đó được chuyển đổi thành sai.
  • Nếu đối số là một tập hợp nút không trống, nó sẽ được chuyển đổi thành true. Tập hợp nút trống được chuyển đổi thành sai.
  • Nếu đối số là một chuỗi không rỗng, nó được chuyển đổi thành true . Một chuỗi trống được chuyển đổi thành false.
  • Nếu đối số là một đối tượng của một kiểu khác với bốn kiểu cơ bản, nó được chuyển đổi thành Boolean theo cách phụ thuộc vào kiểu đó.

Bạn nên định dạng lại mục áp chót trong danh sách của mình để nổi bật hơn, vì nó là mục quan trọng. "boolean ('')" cũng sẽ tạo ra false.
Tomalak 06-08

2
@Tomalak, hãy xem câu trả lời của tôi. Nó chi tiết hơn một chút và trích dẫn nguồn thực sự: W3C XPath Spec, thay vì "MSDN".
Dimitre Novatchev

1
@Dimitre: Tôi không nghĩ rằng MSDN lệch quá nhiều so với thông số kỹ thuật của W3C về mặt này. :) Nhưng chỉ vào đó tất nhiên là đúng hơn.
Tomalak 06-08

5

Có lẽ hơi muộn ở giai đoạn này nhưng imo xử lý boolean không đáng để nỗ lực. Đây là cách tôi xử lý boolean (Bắt buộc) quay lại từ DB:

<xsl:variable name="vTrue" select="true()"/>                     
    <xsl:choose>
      <xsl:when test="string(Mandatory) = string($vTrue)">
        <xsl:text>Mandatory</xsl:text>
      </xsl:when>
      <xsl:otherwise>           
      </xsl:otherwise>
    </xsl:choose>

Hy vọng điều này sẽ giúp ai đó

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.