Jestem zupełnie nowy w XSLT i nie mogę ustalić, gdzie popełniam błąd z następującym kodem.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Zawsze zwraca prawdę, jeśli ma być fałszywa. Czemu?
Jestem zupełnie nowy w XSLT i nie mogę ustalić, gdzie popełniam błąd z następującym kodem.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Zawsze zwraca prawdę, jeśli ma być fałszywa. Czemu?
Odpowiedzi:
Wartość zmiennej $ var zdefiniowana w:
<xsl:variable name="var" select="boolean('false')"/>
jest
true()
Dzieje się tak, ponieważ w XPath „ false
” jest zwykłym łańcuchem, w przeciwieństwie do false()
konstruktora boolean
wartościfalse()
Dwie wartości logiczne w XPath to (zwróć uwagę, że są zbudowane!):
true()
i false()
Szczegóły konwersji dowolnej wartości na wartość logiczną są opisane w specyfikacji XPath :
„Funkcja boolowska 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, ani NaN
zestaw węzłów jest prawdziwy wtedy i tylko wtedy, gdy nie jest pusty
łańcuch jest prawdziwy wtedy i tylko wtedy, gdy jego długość jest różna od zera
obiekt typu innego niż cztery podstawowe typy jest konwertowany na wartość logiczną w sposób zależny od tego typu "
W twoim przypadku ciąg „fałsz” nie jest liczbą 0 i ma dodatnią długość, więc stosowana jest reguła z trzeciego punktu powyżej, dając wynik true()
.
Dlatego też, aby zdefiniować zmienną w XSLT 1.0, której wartość to false()
, należy zapisać definicję w następujący sposób:
<xsl:variable name="vMyVar" select="false()"/>
lub, jeśli nie pamiętasz tego dokładnie, zawsze możesz napisać:
<xsl:variable name="vMyVar" select="1 = 0"/>
(określ dowolne wyrażenie, którego wynikiem jest 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()"/>
false
i true
ciągów znaków pochodzących z transformowanego pliku, które nie obejmuje porównywania ciągów?
Funkcja boolean (), której używasz, rzeczywiście wykonuje swoją pracę. Aby użyć jawnych wartości prawda i fałsz, należy użyć następujących funkcji:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
Po prostu do Twojej wiadomości, zgodnie z dokumentacją MSDN , boolean () zwraca następujące dane:
Być może trochę późno na tym etapie, ale radzenie sobie z wartościami logicznymi nie jest po prostu warte wysiłku. Oto jak poradziłem sobie z wartością logiczną (obowiązkową) wracającą z bazy danych:
<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>
Mam nadzieję, że to komuś pomoże