ฉันยังใหม่กับ XSLT และคิดไม่ออกว่าฉันผิดพลาดตรงไหนกับรหัสต่อไปนี้
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
มันจะคืนค่าจริงเสมอเมื่อมันถูกหมายถึงเท็จ ทำไม?
ฉันยังใหม่กับ XSLT และคิดไม่ออกว่าฉันผิดพลาดตรงไหนกับรหัสต่อไปนี้
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
มันจะคืนค่าจริงเสมอเมื่อมันถูกหมายถึงเท็จ ทำไม?
คำตอบ:
ค่าของตัวแปร $ 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()"/>
false
และtrue
สตริงที่มาจากไฟล์ที่อยู่ระหว่างการแปลงที่ไม่เกี่ยวข้องกับการเปรียบเทียบสตริงหรือไม่
ฟังก์ชันบูลีน () ที่คุณใช้อยู่นั้นทำงานได้ดี สำหรับการใช้ค่าจริงและเท็จอย่างชัดเจนคุณควรใช้ฟังก์ชันต่อไปนี้:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
เพียงแค่ FYI ตามเอกสาร MSDNบูลีน () จะส่งคืนสิ่งต่อไปนี้:
อาจจะช้าไปหน่อยในขั้นตอนนี้ แต่ 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>
หวังว่านี่จะช่วยใครบางคนได้