Bir düğüm değerinin XPath kullanan bir sayı olup olmadığını nasıl kontrol edebilirim?
Herhangi bir fikir?
Bir düğüm değerinin XPath kullanan bir sayı olup olmadığını nasıl kontrol edebilirim?
Herhangi bir fikir?
Yanıtlar:
Değeri NaN'ye karşı test edin :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Bu daha kısa bir versiyondur (teşekkürler @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;
) üzerindeki tip uyuşmazlığı nedeniyle XPath 2.0 ile tamamen başarısız oluyor, ancak Dimitre'nin çözümü iyi çalışıyor.
Bir değişkendeki değerin $v
sayı olarak kullanılıp kullanılamayacağını test etmenin mümkün olan en kısa yolu şudur :
number($v) = number($v)
$v
Yukarıdakileri yalnızca değerini test etmek istediğiniz ifadeyle değiştirmeniz gerekir .
Açıklama :
number($v) = number($v)
açıkça doğrudur, eğer $v
bir sayı veya bir sayıyı temsil eden bir dize .
Boole değeri için de doğrudur, çünkü a number(true())
1'dir venumber(false)
0'dır.
Her ne zaman $v
o zaman, bir sayı olarak kullanılamaznumber($v)
NaN
ve NaN, kendisi için bile başka herhangi bir değere eşit değildir.
Bu nedenle, yukarıdaki ifade yalnızca $v
değeri sayı olarak kullanılabilenler için doğrudur , aksi takdirde yanlıştır.
number($v) = number($v)
farklı bir sonuç verdiği durumlar hakkında yorum yapabilir number($v) = $v
mi?
number($v) = number($v)
farklı bir sonuç veren vakaları listeleyebilir number($v) = $v
mi? Kuşkusuz bu, yazdıklarınızdan türetilebilir, ancak bu soruyu açıkça nerede ele aldığınızı göremiyorum. Yoğun oluyorsam özür dilerim. IOW, çözümünüz ve @ Oded'in / @ Alejandro'nun çözümü her zaman aynı sonuçları mı veriyor?
Henüz başka bir alternatif çözüm sağlamaya çalışmıyorum, bu soruna bir "meta görünüm" sunmaya çalışıyorum.
Oded ve Dimitre Novatchev tarafından zaten verilen cevaplar doğrudur ancak insanların "değer bir sayıdır" cümlesiyle gerçekten kastettiği şey, bunu nasıl söylerim, yoruma açık olmasıdır.
Bir bakıma her şey kulağa tuhaf gelen şu soruya geliyor: "Sayısal değerlerinizi nasıl ifade etmek istiyorsunuz?"
XPath işlevi number()
,
Bunun sayısal değerler için ifadeler içermediğini unutmayın.
Bunlar sadece uydurma kriterler değildir. Şemaya göre geçerli bir xs:float
değer olan içeriğe sahip bir öğe , yukarıda belirtilen özelliklerden herhangi birini içerebilir. Yine number()
de değer döndürür NaN
.
Öyleyse sorunuzu yanıtlayın "Bir düğüm değerinin sayı olup olmadığını XPath ile nasıl kontrol edebilirim?" "Daha önce bahsedilen çözümleri kullan number()
" veya "tek bir XPath 1.0 ifadesi ile kullanamazsınız". Karşılaşabileceğiniz olası sayı biçimlerini düşünün ve gerekirse, doğrulama / sayı ayrıştırma için bir tür mantık yazın. XSLT işlemede bu, örneğin birkaç uygun ekstra şablonla yapılabilir.
PS. Yalnızca sıfır olmayan sayıları önemsiyorsanız, en kısa test
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
sayı veri türünün değeri herhangi bir sayı değerine eşit olmadığından ve karşılaştırma için en az bir bağımsız değişken yazılan sayınumber(MyNode)=MyNode