Como posso verificar se um valor de nó é um número usando XPath?
Alguma ideia?
Como posso verificar se um valor de nó é um número usando XPath?
Alguma ideia?
Respostas:
Teste o valor contra NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Esta é uma versão mais curta (obrigado @Alejandro ):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), a solução de Dimitre funciona bem, entretanto.
A maneira mais curta possível de testar se o valor contido em uma variável $v
pode ser usado como um número é :
number($v) = number($v)
Você só precisa substituir o $v
acima pela expressão cujo valor você deseja testar.
Explicação :
number($v) = number($v)
é obviamente verdadeiro, se $v
for um número ou uma string que representa um número.
Isso também vale para um valor booleano, porque a number(true())
é 1 e number(false)
é 0.
Sempre $v
que não puder ser usado como um número, number($v)
será NaN
e NaN não é igual a nenhum outro valor, nem mesmo a si mesmo.
Assim, a expressão acima é verdadeira apenas para $v
cujo valor pode ser usado como um número, e falsa caso contrário.
number($v) = number($v)
produz um resultado diferente number($v) = $v
?
number($v) = number($v)
produz um resultado diferente de number($v) = $v
? Sem dúvida, isso pode ser derivado do que você escreveu, mas não estou vendo onde você abordou essa questão explicitamente. Desculpe se estou sendo estúpido. IOW, sua solução e a solução de @Oded's / @Alejandro sempre produzem os mesmos resultados?
Não estou tentando fornecer outra solução alternativa, mas uma "metavisualização" para esse problema.
As respostas já fornecidas por Oded e Dimitre Novatchev estão corretas, mas o que as pessoas realmente querem dizer com a frase "valor é um número" está, como eu diria, aberto à interpretação.
De certa forma, tudo se resume a esta pergunta que soa bizarra: "como você deseja expressar seus valores numéricos?"
A função XPath number()
processa números que têm
Observe que isso não inclui expressões para valores numéricos que
Estes não são apenas critérios inventados. Um elemento com conteúdo que está de acordo com o esquema um xs:float
valor válido pode conter qualquer uma das características mencionadas acima. No entanto number()
, retornaria valor NaN
.
Portanto, responda à sua pergunta "Como posso verificar com XPath se um valor de nó é um número?" é "Usar soluções já mencionadas usando number()
" ou "com uma única expressão XPath 1.0, você não pode". Pense nos possíveis formatos de número que você pode encontrar e, se necessário, escreva algum tipo de lógica para validação / análise de número. No processamento XSLT, isso pode ser feito com alguns modelos extras adequados, por exemplo.
PS. Se você só se preocupa com números diferentes de zero, o teste mais curto é
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
valor do tipo de dados numéricos não é igual a nenhum valor numérico e, para comparação, se pelo menos um argumento for dado numérico digitado, o outro é convertido em número, este é o teste de número mais curto:number(MyNode)=MyNode