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 $vpuò essere utilizzato come numero è :
number($v) = number($v)
Devi solo sostituire quanto $vsopra 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 $vnon 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 $vcui 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:floatvalore 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>
NaNvalore 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