2008-12-06 47 views
79

Tôi hoàn toàn mới đối với XSLT và không thể tìm ra nơi tôi đang làm sai với mã sau đây.Cách tạo giá trị boolean?

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

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

Luôn luôn quay trở lại đúng khi bị sai. Tại sao?

+2

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

+0

Xin cảm ơn các bạn, xin lỗi về điều đó. – sydlawrence

Trả lời

160

Giá trị của biến $ var theo quy định tại:

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

      true()

Đây là becaus e trong XPath "false" là một chuỗi bình thường, như trái ngược với false(), đó là các nhà xây dựng cho giá trị booleanfalse()

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

      true()false()

các chi tiết của conve rting bất kỳ giá trị nào để boolean được đánh vần trong số XPath Spec.:

"Chức năng boolean chuyển đổi đối số của nó để một boolean như sau:

  • một số là đúng khi và chỉ khi nó không phải là tích cực hay tiêu cực zero cũng không NaN

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

  • một chuỗi là đúng nếu và chỉ khicủa nóchiều dài không phải là zero

  • một đối tượng của một loại khác với bốn loại cơ bản được chuyển thành một boolean trong một cách mà 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, sinh lãi true().

Vì vậy, để xác định một biến trong XSLT 1.0, có giá trị làfalse(), người ta cần phải 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 này, bạn luôn có thể viết:

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

(chỉ định mọi biểu thứ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 nó luôn luôn là tốt hơn để xác định rõ kiểu dữ liệu của biến:

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

+0

@DimitreNovatchev Hi 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 các chuỗi 'false' và' true' đến từ tệp đang được chuyển đổi 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: "* Cách diễn giải (hoặc phân tích) 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 khi so sánh chuỗi không? –

16

Hàm boolean() mà 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 chức năng sau:

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

Just FYI, theo MSDN documentation, boolean() trả về như sau:

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

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

+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 đúng: Wath XPath Spec của W3C, thay vì "MSDN". –

+1

@Dimitre: Tôi không nghĩ rằng MSDN deviates quá nhiều từ spec W3C trong lĩnh vực này. :) Nhưng chỉ * có * tất nhiên là chính xác hơn. – Tomalak

5

Một hơi muộn ở giai đoạn này có lẽ nhưng imo đối phó với các phép toán luận chỉ là không đáng nỗ lực. Heres làm thế nào tôi xử lý một boolean (bắt buộc) trở 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 người

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