Sou totalmente novo em XSLT e não consigo descobrir onde estou errado com o código a seguir.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Ele está sempre retornando verdadeiro quando se pretende que seja falso. Por quê?
Respostas:
O valor da variável $ var conforme definido em:
<xsl:variable name="var" select="boolean('false')"/>
é
true()
Isso ocorre porque no XPath "
false
" é uma string comum, ao contrário defalse()
, que é o construtor doboolean
valorfalse()
Os dois valores booleanos em XPath são (observe que eles são construídos!):
true()
efalse()
Os detalhes da conversão de qualquer valor em booleano são descritos nas especificações XPath .:
"A função booleana converte seu argumento em um booleano da seguinte maneira:
um número é verdadeiro se e somente se não for zero positivo ou negativo nem NaN
um conjunto de nós é verdadeiro se e somente se não estiver vazio
uma string é verdadeira se e somente se seu comprimento for diferente de zero
um objeto de um tipo diferente dos quatro tipos básicos é convertido em um booleano de uma forma que depende desse tipo "
No seu caso, a string "false" não é o número 0 e tem um comprimento positivo, então a regra do terceiro marcador acima é aplicada, rendendo
true()
.Portanto, para definir uma variável em XSLT 1.0, cujo valor é
false()
, é necessário escrever a definição da seguinte forma:<xsl:variable name="vMyVar" select="false()"/>
ou, se você não se lembra exatamente disso, você pode escrever:
<xsl:variable name="vMyVar" select="1 = 0"/>
(especifique qualquer expressão que avalie como
false()
) e o processador XSLT fará o trabalho para você.Em XSLT 2.0, é sempre melhor especificar explicitamente o tipo da variável:
<xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>
fonte
false
etrue
cordas provenientes do arquivo estar em transformação que não envolve comparação corda?A função boolean () que você está usando está realmente fazendo seu trabalho. Para usar valores verdadeiros e falsos explícitos, você deve usar as seguintes funções:
<xsl:variable name="var_false" select="false()"/> <xsl:variable name="var_true" select="true()"/>
Apenas para sua informação, de acordo com a documentação do MSDN , boolean () retorna o seguinte:
fonte
Talvez um pouco tarde neste estágio, mas lidar com booleanos simplesmente não vale o esforço. Veja como eu lidei com um booleano (obrigatório) voltando do 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>
Espero que isso ajude alguém
fonte