จะสร้างค่าบูลีนได้อย่างไร?


86

ฉันยังใหม่กับ XSLT และคิดไม่ออกว่าฉันผิดพลาดตรงไหนกับรหัสต่อไปนี้

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

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

มันจะคืนค่าจริงเสมอเมื่อมันถูกหมายถึงเท็จ ทำไม?


3
เป็นเพียงข้อเสนอแนะ แต่คุณอาจได้รับคำตอบที่ดีกว่าหากคุณเขียนชื่อของคุณเป็นคำถามที่เหมาะสมและหลีกเลี่ยงการพูด l33t
Will Dean

คำตอบ:


168

ค่าของตัวแปร $ var ตามที่กำหนดใน:

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

คือ

   true()

เนื่องจากใน XPath " false" เป็นสตริงธรรมดาซึ่งตรงข้ามกับfalse()ซึ่งเป็นตัวสร้างสำหรับbooleanค่าfalse()

ค่าบูลีนสองค่าใน XPath คือ (โปรดทราบว่าถูกสร้างขึ้น!):

   true() และ false()

รายละเอียดของการแปลงค่าใด ๆ เป็นบูลีนถูกสะกดไว้ในXPath Spec :

" ฟังก์ชันบูลีนจะแปลงอาร์กิวเมนต์เป็นบูลีนดังนี้:

  • จำนวนจะเป็นจริงก็ต่อเมื่อมันไม่ใช่ศูนย์บวกหรือลบหรือ NaN

  • ชุดโหนดจะเป็นจริงก็ต่อเมื่อไม่ว่างเปล่า

  • สตริงจะเป็นจริงก็ต่อเมื่อความยาวไม่ใช่ศูนย์

  • วัตถุประเภทอื่นที่ไม่ใช่ประเภทพื้นฐานทั้งสี่จะถูกแปลงเป็นบูลีนในลักษณะที่ขึ้นอยู่กับประเภทนั้น "

ในกรณีของคุณสตริง "เท็จ" ไม่ได้เป็นตัวเลข 0 และมีความยาวในเชิงบวกเพื่อให้การปกครองในกระสุนที่ 3 true()ดังกล่าวข้างต้นถูกนำไปใช้ให้ผลผลิต

ดังนั้นในการกำหนดตัวแปรใน XSLT 1.0 ซึ่งมีค่าคือ false()ต้องเขียนนิยามดังต่อไปนี้:

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

หรือถ้าคุณจำไม่ได้จริงๆคุณสามารถเขียน:

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

(ระบุนิพจน์ใด ๆ ที่ประเมินเป็นfalse()) และโปรเซสเซอร์ XSLT จะทำงานให้คุณ

ใน XSLT 2.0 การระบุประเภทของตัวแปรจะดีกว่าเสมอ :

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


@DimitreNovatchev สวัสดี Dimitre นี่คือวิธีแก้ปัญหาหากค่าบูลีนถูกเข้ารหัสในไฟล์แปลง XSL มีวิธีแก้ปัญหาfalseและtrueสตริงที่มาจากไฟล์ที่อยู่ระหว่างการแปลงที่ไม่เกี่ยวข้องกับการเปรียบเทียบสตริงหรือไม่
Jagger

1
@Jagger นี่คือคำถามอื่น คำถามนี้ถามว่า " จะสร้างค่าบูลีนได้อย่างไร " และมีคำตอบที่แม่นยำ คุณกำลังถามว่า: " วิธีตีความ (หรือแยกวิเคราะห์) สตริงเฉพาะให้เป็นค่าบูลีน " - นี่เป็นคำถามที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ฉันขอถามว่าการเปรียบเทียบสตริงผิดอะไร
Dimitre Novatchev

18

ฟังก์ชันบูลีน () ที่คุณใช้อยู่นั้นทำงานได้ดี สำหรับการใช้ค่าจริงและเท็จอย่างชัดเจนคุณควรใช้ฟังก์ชันต่อไปนี้:

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

เพียงแค่ FYI ตามเอกสาร MSDNบูลีน () จะส่งคืนสิ่งต่อไปนี้:

  • ถ้าอาร์กิวเมนต์เป็นจำนวนลบหรือบวกจะถูกแปลงเป็นค่าบูลีนจริง
  • ถ้าอาร์กิวเมนต์เป็นศูนย์หรือค่า NaN จะถูกแปลงเป็นเท็จ
  • ถ้าอาร์กิวเมนต์เป็นชุดโหนดที่ไม่ว่างเปล่าจะถูกแปลงเป็น true ชุดโหนดว่างจะถูกแปลงเป็นเท็จ
  • ถ้าอาร์กิวเมนต์เป็นสตริงที่ไม่ว่างเปล่าจะถูกแปลงให้เป็นจริง สตริงว่างจะถูกแปลงเป็นเท็จ
  • ถ้าอาร์กิวเมนต์เป็นอ็อบเจ็กต์ประเภทอื่นที่ไม่ใช่ประเภทพื้นฐานทั้งสี่ประเภทจะถูกแปลงเป็นบูลีนในลักษณะที่ขึ้นอยู่กับประเภทนั้น

คุณควรจัดรูปแบบรายการสุดท้ายของรายการของคุณใหม่ให้โดดเด่นมากขึ้นเนื่องจากเป็นรายการที่สำคัญ "boolean ('')" จะสร้างเท็จเช่นกัน
Tomalak

2
@Tomalak ดูคำตอบของฉัน มีรายละเอียดมากกว่าเล็กน้อยและอ้างถึงแหล่งที่มาที่แท้จริง: W3C XPath Spec แทนที่จะเป็น "MSDN"
Dimitre Novatchev

1
@ Dimitre: ฉันไม่คิดว่า MSDN เบี่ยงเบนไปจากข้อกำหนด W3C มากเกินไปในเรื่องนี้ :) แต่ชี้มีเป็นหลักสูตรที่ถูกต้องมากขึ้น
Tomalak

5

อาจจะช้าไปหน่อยในขั้นตอนนี้ แต่ imo จัดการกับบูลีนนั้นไม่คุ้มกับความพยายาม นี่คือวิธีที่ฉันจัดการกับบูลีน (บังคับ) ที่กลับมาจากฐานข้อมูล:

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

หวังว่านี่จะช่วยใครบางคนได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.