Frage XPath-Test, wenn der Knotenwert die Nummer ist


Wie kann ich überprüfen, ob ein Knotenwert eine Zahl ist, die XPath verwendet?

Irgendwelche Ideen?


75
2017-10-04 10:28


Ursprung


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>

102
2017-10-04 10:35



Die kürzeste Möglichkeit zu testen, ob der Wert in einer Variablen enthalten ist $v kann als eine Zahl verwendet werden:

number($v) = number($v)

Sie müssen nur die ersetzen $v oben mit dem Ausdruck, dessen Wert Sie testen möchten.

Erläuterung:

number($v) = number($v) ist offensichtlich wahr, wenn $v ist eine Zahl oder eine Zeichenfolge, die eine Zahl darstellt.

Dies gilt auch für einen booleschen Wert, weil a number(true()) ist 1 und number(false) ist 0.

Wann immer $v kann dann nicht als Nummer verwendet werden number($v) ist NaN

und NaN ist keinem anderen Wert, auch nicht sich selbst gleich.

Somit ist der obige Ausdruck nur wahr für $v deren Wert kann als Zahl verwendet werden und andernfalls falsch.


49
2017-10-04 17:09



Es gibt einen erstaunlichen Typprüfungsoperator in XPath 2.0, den Sie verwenden können:

<xsl:if test="$number castable as xs:double">
    <!-- implementation -->
</xsl:if>

16
2018-02-01 09:19



Ich versuche nicht, eine andere alternative Lösung zu bieten, sondern eine Meta-Ansicht für dieses Problem.

Die Antworten, die Oded und Dimitre Novatchev bereits gegeben haben, sind richtig, aber was die Leute wirklich mit dem Ausdruck "Wert ist eine Zahl" meinen, ist, wie würde ich sagen, offen für Interpretationen.

In gewisser Weise kommt es zu dieser bizarr klingenden Frage: "Wie möchten Sie Ihre numerischen Werte ausdrücken?"

XPath-Funktion number() verarbeitet Zahlen, die haben

  • Mögliche führende oder nachfolgende Leerzeichen
  • Vorzeichen nur bei negativen Werten
  • Punkt als Dezimaltrennzeichen (optional für Ganzzahlen)
  • alle anderen Zeichen aus dem Bereich [0-9]

Beachten Sie, dass dies keine Ausdrücke für numerische Werte enthält

  • sind in exponentieller Form ausgedrückt (z.B. 12,3 E45)
  • kann Vorzeichen für positive Werte enthalten
  • unterscheiden zwischen positiv und negativ Null
  • schließe den Wert für positive oder negative Unendlichkeit ein

Dies sind nicht nur erfundene Kriterien. Ein Element mit Inhalt, das laut Schema gültig ist xs:float Der Wert kann eine der oben genannten Eigenschaften enthalten. Noch number() würde Wert zurückgeben NaN.

Beantworten Sie also Ihre Frage "Wie kann ich mit XPath überprü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 und schreiben Sie bei Bedarf eine Art Logik für die Validierung / Zahlenanalyse. Innerhalb der XSLT-Verarbeitung kann dies mit durchgeführt werden einige geeignete zusätzliche Vorlagen, zum Beispiel.

PS. Wenn Sie nur Zahlen von Null interessieren, ist der kürzeste Test

<xsl:if test="number(myNode)">
    <!-- myNode is a non-zero number -->
</xsl:if>

14
2017-10-04 18:50



Der eine, den ich sehr nützlich fand, ist der folgende:

<xsl:choose>
  <xsl:when test="not(number(myNode))">
      <!-- myNode is a not a number or empty(NaN) or zero -->      
  </xsl:when>
  <xsl:otherwise>
      <!-- myNode is a number (!= zero) -->        
  </xsl:otherwise>
</xsl:choose>

9
2018-03-02 15:54



Du könntest immer so etwas verwenden:

string(//Sesscode) castable as xs:decimal

Castable wird von W3C dokumentiert Hier.


0
2017-11-25 12:02