Como posso verificar se um valor de nó é um número usando XPath?
Alguma ideia?
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>
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
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 é :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 enumber(false)
é 0.Sempre
$v
que não puder ser usado como um número,number($v)
será NaNe 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.fonte
number($v) = number($v)
produz um resultado diferentenumber($v) = $v
?number($v) = number($v)
produz um resultado diferente denumber($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?Há um operador de teste de tipo incrível no XPath 2.0 que você pode usar:
fonte
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êmObserve 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 entantonumber()
, retornaria valorNaN
.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 é
fonte
O que achei muito útil é o seguinte:
fonte
Você sempre pode usar algo assim:
O castable é documentado pelo W3C aqui .
fonte
Tenho lidado com 01 - que é um numérico.
string(number($v)) != string($v)
faz a segregaçãofonte