Wie kann ich mit XPath überprüfen, ob ein Knotenwert eine Zahl ist?
Irgendwelche Ideen?
Testen Sie den Wert gegen NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Dies ist eine kürzere Version (danke @Alejandro ):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
NaN
Wert des Zahlendatentyps keinem Zahlenwert entspricht und zum Vergleich, wenn mindestens ein Argument aus Zahlendaten besteht, das andere in Zahl umgewandelt wird, ist dies der kürzestenumber(MyNode)=MyNode
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
Die Lösung von Dimitre funktioniert jedoch einwandfrei.Der kürzest mögliche Weg, um zu testen, ob der in einer Variablen enthaltene Wert
$v
als Zahl verwendet werden kann, ist :Sie müssen nur das
$v
Obige durch den Ausdruck ersetzen, dessen Wert Sie testen möchten.Erklärung :
number($v) = number($v)
ist offensichtlich wahr, wenn$v
es sich um eine Zahl oder eine Zeichenfolge handelt, die eine Zahl darstellt.Dies gilt auch für einen booleschen Wert, da a
number(true())
1 undnumber(false)
0 ist.Wann
$v
immer nicht als Zahl verwendet werden kann,number($v)
ist NaNund NaN ist keinem anderen Wert gleich, auch nicht sich selbst gegenüber.
Somit ist der obige Ausdruck nur wahr, für
$v
dessen Wert eine Zahl verwendet werden kann, und ansonsten falsch.quelle
number($v) = number($v)
ein anderes Ergebnis erzielt wird alsnumber($v) = $v
?number($v) = number($v)
auflisten, in denen ein anderes Ergebnis erzielt wird alsnumber($v) = $v
? Zweifellos lässt sich das von dem ableiten, was Sie geschrieben haben, aber ich sehe nicht, wo Sie diese Frage explizit angesprochen haben. Entschuldigung, wenn ich dicht bin. IOW, liefern Ihre Lösung und die Lösung von @ Oded / @ Alejandro immer die gleichen Ergebnisse?In XPath 2.0 gibt es einen erstaunlichen Typ-Test-Operator, den Sie verwenden können:
quelle
Ich versuche nicht, eine weitere alternative Lösung bereitzustellen, sondern eine "Meta-Ansicht" für dieses Problem.
Die Antworten von Oded und Dimitre Novatchev sind richtig, aber was die Leute wirklich mit dem Ausdruck "Wert ist eine Zahl" meinen könnten, ist, wie würde ich sagen, offen für Interpretationen.
In gewisser Weise kommt alles auf diese bizarr klingende Frage an: "Wie wollen Sie Ihre numerischen Werte ausdrücken?"
Die XPath-Funktion
number()
verarbeitet Zahlen mitBeachten Sie, dass dies keine Ausdrücke für numerische Werte enthält, die
Dies sind nicht nur erfundene Kriterien. Ein Element mit einem Inhalt, dessen Schema einem gültigen
xs:float
Wert entspricht, kann eines der oben genannten Merkmale enthalten. Dennochnumber()
würde Wert zurückgebenNaN
.Beantworten Sie also Ihre Frage "Wie kann ich mit XPath prüfen, ob ein Knotenwert eine Zahl ist?" ist entweder "Verwenden Sie bereits erwähnte Lösungen mit
number()
" oder "Mit einem einzelnen XPath 1.0-Ausdruck können Sie nicht". Denken Sie über die möglichen Zahlenformate nach, auf die Sie möglicherweise stoßen, und schreiben Sie bei Bedarf eine Logik für die Validierung / Zahlenanalyse. Innerhalb der XSLT-Verarbeitung kann dies beispielsweise mit wenigen geeigneten zusätzlichen Vorlagen erfolgen.PS. Wenn Sie sich nur für Zahlen ungleich Null interessieren, ist der kürzeste Test
quelle
Das, was ich sehr nützlich fand, ist das Folgende:
quelle
Sie könnten immer so etwas verwenden:
castable wird hier von W3C dokumentiert .
quelle
Ich habe es mit 01 zu tun - was eine Zahl ist.
string(number($v)) != string($v)
macht die Trennungquelle