Pertanyaan Tes XPath jika nilai node adalah angka


Bagaimana saya bisa memeriksa apakah nilai node adalah angka menggunakan XPath?

Ada ide?


75
2017-10-04 10:28


asal


Jawaban:


Uji nilai terhadap NaN:

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

Ini adalah versi yang lebih singkat (terima kasih @Alejandro):

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

102
2017-10-04 10:35



Cara yang sesingkat mungkin untuk menguji apakah nilai yang terkandung dalam variabel $v dapat digunakan sebagai angka:

number($v) = number($v)

Anda hanya perlu mengganti $v di atas dengan ekspresi yang nilainya ingin Anda uji.

Penjelasan:

number($v) = number($v) jelas benar, jika $v adalah angka, atau string yang mewakili angka.

Memang benar juga untuk nilai boolean, karena a number(true()) adalah 1 dan number(false) adalah 0.

Kapanpun $v tidak dapat digunakan sebagai angka, lalu number($v) adalah NaN

dan NaN tidak sama dengan nilai lainnya, bahkan untuk dirinya sendiri.

Dengan demikian, ekspresi di atas hanya berlaku untuk $v yang nilainya dapat digunakan sebagai angka, dan salah jika sebaliknya.


49
2017-10-04 17:09



Ada operator uji jenis yang menakjubkan di XPath 2.0 yang dapat Anda gunakan:

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

16
2018-02-01 09:19



Saya tidak mencoba memberikan solusi alternatif, tetapi "meta view" untuk masalah ini.

Jawaban sudah disediakan oleh Oded dan Dimitre Novatchev benar tetapi apa yang orang-orang mungkin maksud dengan frase "nilai adalah angka" adalah, bagaimana saya akan mengatakannya, terbuka untuk interpretasi.

Dengan cara itu semua datang ke pertanyaan yang terdengar aneh ini: "Bagaimana Anda ingin mengekspresikan nilai numerik Anda?"

Fungsi XPath number() memproses angka yang ada

  • kemungkinan spasi putih di belakang atau di belakangnya
  • karakter tanda sebelumnya hanya pada nilai negatif
  • dot sebagai pemisah desimal (opsional untuk bilangan bulat)
  • semua karakter lain dari jangkauan [0-9]

Perhatikan bahwa ini tidak termasuk ekspresi untuk nilai-nilai numerik itu

  • dinyatakan dalam bentuk eksponensial (mis. 12.3E45)
  • dapat berisi karakter tanda untuk nilai positif
  • memiliki perbedaan antara nol positif dan negatif
  • termasuk nilai untuk infinity positif atau negatif

Ini bukan hanya kriteria yang dibuat. Unsur dengan konten yang sesuai dengan skema valid xs:float nilai mungkin mengandung salah satu karakteristik yang disebutkan di atas. Namun number() akan mengembalikan nilai NaN.

Jadi jawablah pertanyaan Anda, "Bagaimana saya bisa memeriksa dengan XPath jika nilai node adalah angka?" baik "Gunakan solusi yang sudah disebutkan menggunakan number()"atau" dengan ekspresi XPath 1.0 tunggal, Anda tidak bisa ". Pikirkan tentang kemungkinan format angka yang mungkin Anda temui, dan jika diperlukan, tuliskan beberapa jenis logika untuk validasi / parsing angka. Dalam pemrosesan XSLT, ini dapat dilakukan dengan beberapa templat tambahan yang sesuai, misalnya.

PS. Jika Anda hanya peduli tentang angka bukan nol, tes terpendek adalah

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

14
2017-10-04 18:50



Yang saya temukan sangat berguna adalah sebagai berikut:

<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



Anda selalu dapat menggunakan sesuatu seperti ini:

string(//Sesscode) castable as xs:decimal

castable didokumentasikan oleh W3C sini.


0
2017-11-25 12:02