ฉันจะตรวจสอบได้อย่างไรว่าค่าโหนดเป็นตัวเลขโดยใช้ XPath
ความคิดใด ๆ ?
ฉันจะตรวจสอบได้อย่างไรว่าค่าโหนดเป็นตัวเลขโดยใช้ XPath
ความคิดใด ๆ ?
คำตอบ:
ทดสอบค่ากับNaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
นี่เป็นเวอร์ชันที่สั้นกว่า (ขอบคุณ@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;
) โซลูชันของ Dimitre ทำงานได้ดี
วิธีที่สั้นที่สุดในการทดสอบว่าค่าที่อยู่ในตัวแปร$v
สามารถใช้เป็นตัวเลขได้หรือไม่คือ :
number($v) = number($v)
คุณต้องแทนที่$v
ข้างต้นด้วยนิพจน์ที่คุณต้องการทดสอบเท่านั้น
คำอธิบาย :
number($v) = number($v)
เห็นได้ชัดว่าเป็นจริงถ้า$v
เป็นตัวเลขหรือสตริงที่แสดงถึงตัวเลข
เป็นจริงสำหรับค่าบูลีนเนื่องจาก a number(true())
คือ 1 และnumber(false)
เป็น 0
เมื่อใดก็ตามที่$v
ไม่สามารถใช้เป็นตัวเลขได้ก็number($v)
จะเป็น NaN
และ NaN ไม่เท่ากับค่าอื่น ๆ แม้แต่กับตัวมันเอง
ดังนั้นนิพจน์ด้านบนจึงเป็นจริงเฉพาะสำหรับ$v
ค่าที่สามารถใช้เป็นตัวเลขได้และเป็นเท็จ
number($v) = number($v)
ให้ผลลัพธ์ที่แตกต่างจากnumber($v) = $v
?
number($v) = number($v)
ให้ผลลัพธ์ที่แตกต่างจากnumber($v) = $v
? ไม่ต้องสงสัยเลยว่ามีที่มาจากสิ่งที่คุณเขียน แต่ฉันไม่เห็นว่าคุณตอบคำถามนี้อย่างชัดเจนที่ใด ขออภัยหากฉันหนาแน่น IOW โซลูชันของคุณและโซลูชันของ @ Oded / @ Alejandro ให้ผลลัพธ์เหมือนกันหรือไม่?
มีตัวดำเนินการทดสอบประเภทที่น่าทึ่งใน XPath 2.0 ที่คุณสามารถใช้ได้:
<xsl:if test="$number castable as xs:double">
<!-- implementation -->
</xsl:if>
ฉันไม่ได้พยายามหาทางเลือกอื่น แต่เป็น "มุมมองเมตา" สำหรับปัญหานี้
คำตอบที่ Oded และ Dimitre Novatchev ให้ไว้แล้วนั้นถูกต้อง แต่สิ่งที่ผู้คนอาจหมายถึงจริงๆกับวลี "value is a number" คือฉันจะพูดอย่างไรโดยเปิดให้มีการตีความ
ในทางกลับกันคำถามที่ฟังดูแปลกประหลาดนี้: "คุณต้องการแสดงค่าตัวเลขของคุณอย่างไร"
ฟังก์ชัน XPath number()
ประมวลผลตัวเลขที่มี
โปรดทราบว่าสิ่งนี้ไม่รวมนิพจน์สำหรับค่าตัวเลขที่
สิ่งเหล่านี้ไม่ได้สร้างขึ้นเพียงเกณฑ์ องค์ประกอบที่มีเนื้อหาตามสคีมาxs:float
ค่าที่ถูกต้องอาจมีลักษณะที่กล่าวถึงข้างต้น แต่จะกลับมาคุ้มค่าnumber()
NaN
ดังนั้นตอบคำถามของคุณ "ฉันจะตรวจสอบกับ XPath ได้อย่างไรว่าค่าโหนดเป็นตัวเลข" คือ "ใช้โซลูชันที่กล่าวถึงแล้วโดยใช้number()
" หรือ "ด้วยนิพจน์ XPath 1.0 เดียวคุณทำไม่ได้" ลองนึกถึงรูปแบบตัวเลขที่เป็นไปได้ที่คุณอาจพบและหากจำเป็นให้เขียนตรรกะบางอย่างสำหรับการตรวจสอบความถูกต้อง / การแยกวิเคราะห์ตัวเลข ภายในการประมวลผล XSLT สามารถทำได้โดยใช้เทมเพลตพิเศษที่เหมาะสมไม่กี่ตัวอย่างเช่น
ปล. หากคุณสนใจเฉพาะตัวเลขที่ไม่ใช่ศูนย์การทดสอบที่สั้นที่สุดคือ
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
สิ่งที่ฉันพบว่ามีประโยชน์มากมีดังต่อไปนี้:
<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>
ฉันจัดการกับ 01 - ซึ่งเป็นตัวเลข
string(number($v)) != string($v)
ทำให้การแยก
NaN
ค่าXPath 1.0 ของชนิดข้อมูลตัวเลขไม่เท่ากับค่าตัวเลขใด ๆ และสำหรับการเปรียบเทียบหากอาร์กิวเมนต์อย่างน้อยหนึ่งอาร์กิวเมนต์เป็นข้อมูลตัวเลขที่พิมพ์จากนั้นอีกอาร์กิวเมนต์จะถูกส่งไปยังตัวเลขนี่เป็นการทดสอบตัวเลขที่สั้นที่สุด:number(MyNode)=MyNode