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

Foi útil?

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().

Portanto, para definir uma variável em XSLT 1.0, cujo valor é 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top