Como criar um valor booleano?
Pergunta
Eu sou totalmente novo para XSLT e não pode funcionar onde estou indo errado com o seguinte código.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
É sempre retornando verdadeiro quando se pretende ser falsa. Por quê?
Solução
O valor da variável $ var como definido:
<xsl:variable name="var" select="boolean('false')"/>
é
true()
Isto porque, em XPath "false
" é uma cadeia comum, em oposição a false()
, que é o construtor para o valor boolean
false()
Os dois valores booleanos em XPath são (note que eles são construídos!):
true()
e false()
O detalhe de converter qualquer valor para booleano estão escritas outin XPath Spec :.
"A boolean função converte o argumento para um booleano da seguinte forma:
-
um número é verdadeira se e somente se não é nem de zero positivo ou negativo nem NaN
-
um conjunto de nós é verdadeira se e somente se é não-vazia
-
Uma cadeia é verdadeira se e somente se seu comprimento é diferente de zero
-
um objecto de um tipo diferente do que os quatro tipos básicos é convertido para um booleano de uma forma que é dependente desse tipo "
No seu caso a string "false" não é o número 0 e tem um comprimento positivo, de modo que a regra no 3º item acima é aplicada, produzindo true()
.
false()
, é preciso escrever a definição como o seguinte:
<xsl:variable name="vMyVar" select="false()"/>
ou, se você não lembrar exatamente isso, você sempre pode escrever:
<xsl:variable name="vMyVar" select="1 = 0"/>
(especificar qualquer expressão que avalia false()
) e o processador XSLT irá fazer o trabalho para você.
Em XSLT 2.0, é sempre melhor para explicitamente especificar o tipo da variável:
<xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>
Outras dicas
A função booleana () que você está usando é de fato fazendo é trabalho. Para usar os valores verdadeiros e falsos explícitas você deve usar as seguintes funções:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
Apenas FYI, por MSDN documentação , boolean () retorna o seguinte:
- Se o argumento for um negativo ou um número positivo, ele é convertido para o valor booleano verdadeiro.
- Se o argumento é zero ou um valor NaN, ele é convertido em falso.
- Se o argumento for um nó-conjunto não vazio, ele é convertido em realidade. Um nó-conjunto vazio é convertido em falso.
- Se o argumento é uma string não-vazia, ele é convertido para true . Uma cadeia vazia é convertido em falso.
- Se o argumento é um objeto de um tipo diferente do que os quatro tipos básicos, ele é convertido em um valor booleano de uma forma que é dependente desse tipo.
Um pouco tarde nesta fase, talvez, mas imo lidar com booleans é apenas não vale a pena 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