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?
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?
Câu trả lời:
Giá trị của biến $ var như được định nghĩa trong:
<xsl:variable name="var" select="boolean('false')"/>
Là
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 boolean
giá trịfalse()
Hai giá trị boolean trong XPath là (lưu ý rằng chúng được xây dựng!):
true()
và 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()"/>
false
và các true
chuỗi đến từ tệp đang được chuyển đổi mà không liên quan đến so sánh chuỗi không?
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:
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 đó