Wie kann ich mit XPath überprüfen, ob ein Knotenwert eine Zahl ist?
Irgendwelche Ideen?
Wie kann ich mit XPath überprüfen, ob ein Knotenwert eine Zahl ist?
Irgendwelche Ideen?
Antworten:
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>
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 :
number($v) = number($v)
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 und number(false)
0 ist.
Wann $v
immer nicht als Zahl verwendet werden kann, number($v)
ist NaN
und 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.
number($v) = number($v)
ein anderes Ergebnis erzielt wird als number($v) = $v
?
number($v) = number($v)
auflisten, in denen ein anderes Ergebnis erzielt wird als number($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?
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 mit
Beachten 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. Dennoch number()
würde Wert zurückgeben NaN
.
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
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero 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