Come posso verificare se il valore di un nodo è un numero utilizzando XPath?
Qualche idea?
Come posso verificare se il valore di un nodo è un numero utilizzando XPath?
Qualche idea?
Risposte:
Verifica il valore rispetto a NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Questa è una versione più breve (grazie @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;
), la soluzione di Dimitre funziona comunque bene.
Il modo più breve possibile per verificare se il valore contenuto in una variabile $v
può essere utilizzato come numero è :
number($v) = number($v)
Devi solo sostituire quanto $v
sopra con l'espressione di cui vuoi testare il valore.
Spiegazione :
number($v) = number($v)
è ovviamente vero, se $v
è un numero o una stringa che rappresenta un numero.
È vero anche per un valore booleano, perché a number(true())
è 1 ed number(false)
è 0.
Ogni volta che $v
non può essere utilizzato come numero, number($v)
è NaN
e NaN non è uguale a nessun altro valore, nemmeno a se stesso.
Pertanto, l'espressione precedente è vera solo per il $v
cui valore può essere utilizzato come numero e falsa in caso contrario.
number($v) = number($v)
produce un risultato diverso number($v) = $v
?
number($v) = number($v)
produce un risultato diverso number($v) = $v
? Senza dubbio è derivabile da quello che hai scritto, ma non vedo dove hai affrontato questa domanda in modo esplicito. Scusa se sono ottuso. IOW, la tua soluzione e quella di @ Oded / @ Alejandro producono sempre gli stessi risultati?
Non sto cercando di fornire un'altra soluzione alternativa, ma una "meta view" a questo problema.
Le risposte già fornite da Oded e Dimitre Novatchev sono corrette, ma ciò che la gente potrebbe veramente intendere con la frase "il valore è un numero" è, come direi, aperto all'interpretazione.
In un certo senso tutto arriva a questa bizzarra domanda: "come vuoi esprimere i tuoi valori numerici?"
La funzione XPath number()
elabora i numeri che hanno
Nota che questo non include espressioni per valori numerici che
Questi non sono solo criteri inventati. Un elemento con contenuto che è secondo lo schema un xs:float
valore valido potrebbe contenere una qualsiasi delle caratteristiche sopra menzionate. Eppure number()
restituirebbe valore NaN
.
Quindi rispondi alla tua domanda "Come posso verificare con XPath se il valore di un nodo è un numero?" è "Usa soluzioni già menzionate usando number()
" o "con una singola espressione XPath 1.0, non puoi". Pensa ai possibili formati numerici che potresti incontrare e, se necessario, scrivi un qualche tipo di logica per la convalida / l'analisi del numero. Nell'elaborazione XSLT, questo può essere fatto con pochi modelli aggiuntivi adatti, ad esempio.
PS. Se ti interessano solo i numeri diversi da zero, il test più breve è
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
valore del tipo di dati numerico non è uguale a nessun valore numerico e per confronto se almeno un argomento è un numero digitato, l'altro vienenumber(MyNode)=MyNode