Bagaimana cara membuat nilai boolean?

86

Saya benar-benar baru mengenal XSLT dan tidak tahu di mana kesalahan saya dengan kode berikut.

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

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

Itu selalu mengembalikan true ketika itu dimaksudkan untuk menjadi salah. Mengapa?

sydlawrence
sumber
3
Hanya sebuah saran, tetapi Anda mungkin akan mendapatkan jawaban yang lebih baik jika Anda menulis judul Anda sebagai pertanyaan yang tepat dan menghindari berbicara l33.
Akankah Dean

Jawaban:

168

Nilai variabel $ var seperti yang didefinisikan di:

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

adalah

   true()

Ini karena di XPath " false" adalah string biasa, bukan false(), yang merupakan konstruktor untuk booleannilaifalse()

Dua nilai boolean di XPath adalah (perhatikan bahwa keduanya dibuat!):

   true() dan false()

Detail untuk mengonversi nilai apa pun ke boolean dijelaskan dalam Spesifikasi XPath .:

"Fungsi boolean mengubah argumennya menjadi boolean sebagai berikut:

  • suatu bilangan benar jika dan hanya jika tidak positif atau negatif nol atau NaN

  • set node benar jika dan hanya jika tidak kosong

  • sebuah string bernilai true jika dan hanya jika panjangnya bukan nol

  • objek dengan tipe selain dari empat tipe dasar diubah menjadi boolean dengan cara yang bergantung pada tipe itu "

Dalam kasus Anda, string "false" bukanlah angka 0 dan memiliki panjang positif, sehingga aturan dalam poin ke-3 di atas diterapkan, menghasilkan true().

Oleh karena itu, untuk mendefinisikan variabel dalam XSLT 1.0, yang nilainya adalah false() , seseorang perlu menulis definisi sebagai berikut:

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

atau, jika Anda tidak terlalu mengingatnya, Anda selalu dapat menulis:

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

(tentukan ekspresi apa pun yang mengevaluasi false()) dan prosesor XSLT akan melakukan pekerjaan untuk Anda.

Di XSLT 2.0, selalu lebih baik untuk secara eksplisit menentukan jenis variabel:

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

Dimitre Novatchev
sumber
@DimitRaihanna Hai Dimit. Ini adalah solusi jika nilai boolean di-hardcode dalam file transformasi XSL. Apakah ada solusi yang tepat untuk string falsedan yang trueberasal dari file yang sedang dalam transformasi yang tidak melibatkan perbandingan string?
Jagger
1
@Jagger, Ini untuk pertanyaan lain. Pertanyaan ini menanyakan " Bagaimana cara membuat nilai Boolean " dan mendapatkan jawaban yang tepat. Anda bertanya: " Bagaimana menafsirkan (atau mengurai) string tertentu ke dalam nilai Boolean " - ini adalah pertanyaan yang sama sekali berbeda. Bolehkah saya bertanya apa yang salah dengan perbandingan string?
Dimitre Novatchev
18

Fungsi boolean () yang Anda gunakan memang melakukan tugasnya. Untuk menggunakan nilai benar dan salah eksplisit Anda harus menggunakan fungsi berikut:

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

Untuk diketahui saja, sesuai dokumentasi MSDN , boolean () mengembalikan yang berikut:

  • Jika argumennya adalah angka negatif atau positif, itu diubah menjadi nilai Boolean true.
  • Jika argumennya nol atau nilai NaN, itu akan diubah menjadi salah.
  • Jika argumennya adalah kumpulan node yang tidak kosong, itu akan diubah menjadi benar. Node-set kosong diubah menjadi false.
  • Jika argumennya adalah string yang tidak kosong, itu akan diubah menjadi benar . String kosong diubah menjadi false.
  • Jika argumen adalah objek dari tipe selain dari empat tipe dasar, itu akan diubah menjadi Boolean dengan cara yang bergantung pada tipe itu.
Yuval Adam
sumber
Anda harus memformat ulang item terakhir dari daftar Anda agar lebih menonjol, karena ini yang paling penting. "boolean ('')" akan menghasilkan false juga.
Tomalak
2
@Tomalak, lihat jawaban saya. Ini sedikit lebih rinci dan mengutip sumber sebenarnya: Spesifikasi W3C XPath, daripada "MSDN".
Dimitre Novatchev
1
@Dimitre: Saya rasa MSDN tidak terlalu banyak menyimpang dari spesifikasi W3C dalam hal ini. :) Tapi menunjuk ke sana tentu saja lebih tepat.
Tomalak
5

Mungkin agak terlambat pada tahap ini, tetapi berurusan dengan boolean tidak sebanding dengan usahanya. Inilah cara saya menangani boolean (Wajib) yang kembali dari 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>

Semoga ini bisa membantu seseorang

outofcoolnames
sumber