Bagaimana cara memeriksa apakah nilai node adalah angka yang menggunakan XPath?
Ada ide?
Uji nilai terhadap NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Ini adalah versi yang lebih pendek (terima kasih @Alejandro ):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
NaN
nilai tipe data angka tidak sama dengan nilai angka manapun dan untuk perbandingan jika setidaknya satu argumen adalah data angka yang diketik maka yang lain dilemparkan ke angka, ini adalah tes angka terpendek:number(MyNode)=MyNode
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), solusi Dimitre bekerja dengan baik namun.Cara sesingkat mungkin untuk menguji apakah nilai yang terkandung dalam variabel
$v
dapat digunakan sebagai angka adalah :Anda hanya perlu mengganti di
$v
atas dengan ekspresi yang nilainya ingin Anda uji.Penjelasan :
number($v) = number($v)
jelas benar, jika$v
adalah angka, atau string yang mewakili angka.Ini juga berlaku untuk nilai boolean, karena a
number(true())
bernilai 1 dannumber(false)
bernilai 0.Kapanpun
$v
tidak bisa digunakan sebagai angka, makanumber($v)
NaNdan NaN tidak sama dengan nilai lainnya, bahkan untuk nilai itu sendiri.
Jadi, ekspresi di atas benar hanya untuk
$v
yang nilainya dapat digunakan sebagai angka, dan salah jika tidak.sumber
number($v) = number($v)
hasil yang berbedanumber($v) = $v
?number($v) = number($v)
menghasilkan hasil yang berbedanumber($v) = $v
? Tidak diragukan lagi itu berasal dari apa yang Anda tulis, tetapi saya tidak melihat di mana Anda menjawab pertanyaan ini secara eksplisit. Maaf jika saya sedang bebal. IOW, apakah solusi Anda dan solusi @ Oded / @ Alejandro selalu memberikan hasil yang sama?Ada operator uji tipe luar biasa di XPath 2.0 yang dapat Anda gunakan:
<xsl:if test="$number castable as xs:double"> <!-- implementation --> </xsl:if>
sumber
Saya tidak mencoba memberikan solusi alternatif lain, tetapi "tampilan meta" untuk masalah ini.
Jawaban yang sudah diberikan oleh Oded dan Dimitre Novatchev benar tapi apa yang orang maksud dengan frase "nilai adalah angka" adalah, bagaimana saya mengatakannya, terbuka untuk interpretasi.
Di satu sisi, semuanya sampai pada pertanyaan yang terdengar aneh ini: "bagaimana Anda ingin mengekspresikan nilai numerik Anda?"
Fungsi XPath
number()
memproses angka yang memilikiPerhatikan bahwa ini tidak termasuk ekspresi untuk nilai numerik itu
Ini bukan hanya kriteria yang dibuat-buat. Elemen dengan konten yang sesuai dengan skema dengan
xs:float
nilai yang valid mungkin berisi salah satu karakteristik yang disebutkan di atas. Namunnumber()
akan mengembalikan nilaiNaN
.Jadi jawaban atas pertanyaan Anda "Bagaimana saya dapat memeriksa dengan XPath jika nilai node adalah angka?" adalah "Gunakan solusi yang telah disebutkan menggunakan
number()
" atau "dengan ekspresi XPath 1.0 tunggal, Anda tidak bisa". Pikirkan tentang kemungkinan format angka yang mungkin Anda temui, dan jika perlu, tulis beberapa jenis logika untuk validasi / penguraian angka. Dalam pemrosesan XSLT, ini dapat dilakukan dengan beberapa templat tambahan yang sesuai, misalnya.PS. Jika Anda hanya peduli dengan angka bukan nol, tes terpendek adalah
<xsl:if test="number(myNode)"> <!-- myNode is a non-zero number --> </xsl:if>
sumber
Yang menurut saya 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>
sumber
Anda selalu bisa menggunakan sesuatu seperti ini:
castable didokumentasikan oleh W3C di sini .
sumber
Saya telah berurusan dengan 01 - yang merupakan numerik.
string(number($v)) != string($v)
membuat pemisahansumber