Jak utworzyć wartość logiczną?

Jestem zupełnie nowy w XSLT i nie mogę rozgryźć, gdzie idę źle z poniższym kodem.

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

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

Zawsze zwraca prawdę, gdy ma być fałszywa. Dlaczego?

Author: Mathias Müller, 2008-12-06

3 answers

Wartość zmiennej $var zdefiniowanej w:

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

Jest

   true()

Dzieje się tak dlatego, że w XPath "false " jest zwykłym ciągiem znaków, w przeciwieństwie do false(), który jest konstruktorem dla boolean wartości false()

Dwie wartości logiczne w XPath to (zauważ, że są skonstruowane!):

true() oraz false()

Szczegóły konwersji dowolnej wartości na wartość logiczną są pisane outin XPath Spec .:

"The boolean funkcja konwertuje swój argument na wartość logiczną w następujący sposób:

  • Liczba jest prawdziwa wtedy i tylko wtedy, gdy nie jest ani dodatnim, ani ujemnym zerem nor nan

  • Node-set jest true wtedy i tylko wtedy, gdy jest niepustym

  • Ciąg jest prawdziwy wtedy i tylko wtedy, gdy jego długość jest niezerowa

  • Obiekt typu innego niż cztery typy podstawowe jest konwertowany na boolean w sposób zależny od tego typu "

W Twoim przypadku ciąg "false" nie jest liczbą 0 i ma dodatnią Długość, więc zastosowana jest reguła w 3. Bulle powyżej, dając true().

Dlatego, aby zdefiniować zmienną w XSLT 1.0, której wartość jest false(), należy zapisać definicję w następujący sposób:

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

Lub, jeśli nie do końca pamiętasz, zawsze możesz napisz:

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

(podaj Dowolne wyrażenie, które jest ewaluowane do false()), a procesor XSLT wykona pracę za Ciebie.

W XSLT 2.0 zawsze lepiej jest jawnie określić typ zmiennej:

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

 163
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-06 17:29:56

Funkcja boolean (), której używasz, rzeczywiście wykonuje swoją pracę. Do używania jawnych wartości true I false należy użyć następujących funkcji:

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

Dla twojej informacji, zgodnie z MSDN documentation, funkcja boolean () zwraca następujące wartości:

  • jeśli argument jest liczbą ujemną lub dodatnią, jest on konwertowany na wartość logiczną true.
  • jeśli argument ma wartość zero lub wartość NaN, jest on konwertowany na false.
  • jeśli argument jest niepustym zestawem węzłów, to / align = "left" / Pusty zestaw węzłów jest konwertowany na false.
  • jeśli argument jest niepustym łańcuchem znaków, jest on konwertowany na true. Pusty łańcuch jest konwertowany na false.
  • jeśli argument jest obiektem typu innego niż cztery typy podstawowe, jest on konwertowany do logiki w sposób zależny od tego typu.
 16
Author: Yuval Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-06 15:33:49

Być może trochę późno na tym etapie, ale imo radzenie sobie z booleanami nie jest warte wysiłku. Oto jak poradziłem sobie z booleanem (obowiązkowym) wracającym z 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>

Hope this helps someone

 5
Author: outofcoolnames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-02 09:29:51