Bir boole değeri nasıl oluşturulur?


86

XSLT'de tamamen yeniyim ve aşağıdaki kodla nerede yanlış yaptığımı çözemiyorum.

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

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

Yanlış olması gerektiği zaman her zaman doğruya dönüyor. Neden?


3
Sadece bir öneri, ancak başlığınızı doğru bir soru olarak yazarsanız ve l33t konuşmaktan kaçınırsanız daha iyi bir cevap alabilirsiniz.
Will Dean

Yanıtlar:


168

$ Var değişkeninin değeri şurada tanımlandığı gibidir:

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

dır-dir

   true()

Bunun nedeni , değerin yapıcısı olan XPath'de " false" sıradan bir dizedir.false()booleanfalse()

XPath'deki iki boole değeri (bunların oluşturulduklarına dikkat edin!):

   true() ve false()

Herhangi bir değeri mantıksal değere dönüştürmenin ayrıntıları, XPath Spesifikasyonunda açıklanmıştır. :

" Boole işlevi, argümanını aşağıdaki gibi bir boolean'a dönüştürür:

  • bir sayı, ancak ve ancak ne pozitif ne de negatif sıfır veya NaN ise doğrudur

  • bir düğüm kümesi, ancak ve ancak boş değilse doğrudur

  • bir dizge, ancak ve ancak uzunluğu sıfır değilse doğrudur

  • dört temel türden farklı bir türdeki bir nesne, bu türe bağlı bir şekilde bir mantıksal değere dönüştürülür "

Sizin durumunuzda "false" dizesi 0 sayısı değildir ve pozitif bir uzunluğa sahiptir, bu nedenle yukarıdaki 3. madde işaretindeki kural uygulanır ve sonuç verir true().

Bu nedenle, XSLT 1.0'da değeri olan bir değişkeni tanımlamak false() için tanımın aşağıdaki gibi yazılması gerekir:

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

veya bunu tam olarak hatırlamıyorsanız, her zaman yazabilirsiniz:

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

(olarak değerlendirilen herhangi bir ifadeyi belirtin false()) ve XSLT işlemci işi sizin yerinize yapacaktır.

XSLT 2.0'da değişkenin türünü açıkça belirtmek her zaman daha iyidir :

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


@DimitreNovatchev Merhaba Dimitre. Bu, Boole değerinin XSL dönüşüm dosyasına kodlanmış olması durumunda çözümdür. İçin düzgün bir çözüm var mı falseve truedize karSIlaStIrmasInI içermeyen dönüşüm altında olmanın dosyadan gelen dizeleri?
Jagger

1
@ Jagger, Bu başka bir soru için. Bu soru " Bir Boole değeri nasıl oluşturulur? " Sorusunu sorar ve kesin cevabını alır. Siz soruyorsunuz: " Belirli dizeleri Boole değerlerine nasıl yorumlayacaksınız (veya ayrıştıracaksınız) " - bu tamamen farklı bir sorudur. Dizi karşılaştırmasında neyin yanlış olduğunu sorabilir miyim?
Dimitre Novatchev

18

Kullandığınız boolean () işlevi gerçekten de işini yapıyor. Açıkça doğru ve yanlış değerleri kullanmak için aşağıdaki işlevleri kullanmalısınız:

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

Bilginize, MSDN belgelerine göre boolean () aşağıdakileri döndürür:

  • Bağımsız değişken negatif veya pozitif bir sayıysa, doğru Boole değerine dönüştürülür.
  • Bağımsız değişken sıfır veya NaN değeriyse, yanlışa dönüştürülür.
  • Bağımsız değişken boş olmayan bir düğüm kümesiyse, doğruya dönüştürülür. Boş bir düğüm kümesi yanlışa dönüştürülür.
  • Bağımsız değişken boş olmayan bir dizeyse, doğruya dönüştürülür . Boş bir dizge yanlışa dönüştürülür.
  • Bağımsız değişken, dört temel türden farklı bir türde bir nesne ise, bu türe bağlı bir şekilde bir Boolean'a dönüştürülür.

Listenizin sondan bir önceki öğesini, çok önemli olduğundan daha fazla öne çıkacak şekilde yeniden biçimlendirmelisiniz. "boolean ('')" da yanlış üretecektir.
Tomalak

2
@Tomalak, cevabıma bakın. Biraz daha ayrıntılıdır ve gerçek kaynağı aktarır: "MSDN" yerine W3C XPath Spec.
Dimitre Novatchev

1
@Dimitre: MSDN'nin bu konuda W3C spesifikasyonundan çok fazla saptığını düşünmüyorum. :) Ama orayı işaret etmek elbette daha doğru.
Tomalak

5

Belki bu aşamada biraz geç olabilir ama booleanlarla uğraşmak çabaya değmez. DB'den dönen bir boole (Zorunlu) ile nasıl başa çıktığımı burada:

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

Umarım bu birine yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.