XPath परीक्षण यदि नोड मान संख्या है


89

मैं कैसे जांच सकता हूं कि क्या एक नोड मूल्य XPath का उपयोग करके एक संख्या है?

कोई विचार?

जवाबों:


124

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>

10
क्योंकि XPath NaNमें संख्या डेटा प्रकार का 1.0 मान किसी भी संख्या मान के बराबर नहीं है और तुलना के लिए यदि कम से कम एक तर्क संख्या डेटा टाइप किया गया है, तो दूसरा नंबर पर डाला जाता है, यह सबसे छोटी संख्या परीक्षण है:number(MyNode)=MyNode

10
@ ऑपरेटर ( Required item type of first operand of '=' is numeric; supplied value has item type xs:string;) पर टाइप बेमेल के कारण @Alejandro द्वारा लघु संस्करण पूरी तरह से XPath 2.0 के साथ विफल हो जाता है , लेकिन दिमित्रे का समाधान ठीक काम करता है।
लुसारो

60

यह जांचने का सबसे कम संभव तरीका है कि चर में निहित मूल्य का $vउपयोग संख्या के रूप में किया जा सकता है :

number($v) = number($v)

आपको केवल $vउस अभिव्यक्ति के साथ उपरोक्त विकल्प की आवश्यकता है, जिसका मूल्य आप परीक्षण करना चाहते हैं।

स्पष्टीकरण :

number($v) = number($v)स्पष्ट रूप से सच है, अगर $vएक संख्या है, या एक स्ट्रिंग है जो एक संख्या का प्रतिनिधित्व करती है।

यह एक बूलियन मूल्य के लिए भी सच है, क्योंकि एक number(true())1 है और number(false)0 है।

जब भी $vएक नंबर के रूप में इस्तेमाल नहीं किया जा सकता है, तो number($v)NaN है

और NaN किसी भी अन्य मूल्य के बराबर नहीं है, यहां तक ​​कि खुद के लिए भी।

इस प्रकार, उपरोक्त अभिव्यक्ति केवल उसी के लिए सही है $vजिसका मूल्य एक संख्या के रूप में इस्तेमाल किया जा सकता है, और अन्यथा गलत।


1
+1 सहायक स्पष्टीकरण। क्या कोई ऐसे मामलों पर टिप्पणी कर सकता है जहां number($v) = number($v)से एक अलग परिणाम मिलता है number($v) = $v?
लार्स ऑक्ट

@ दर्शन: मैंने पहले ही इन मामलों पर टिप्पणी की है। क्या आप अभी तक एक अनदेखा मामला बता सकते हैं?
दिमित्रे नोवात्चेव

मेरा मतलब था कि कोई ऐसे मामलों को सूचीबद्ध कर सकता है जहां number($v) = number($v)से एक अलग परिणाम मिलता है number($v) = $v? संदेह है कि आपने जो लिखा है, उससे व्युत्पन्न है, लेकिन मैं यह नहीं देख रहा हूं कि आपने इस प्रश्न को स्पष्ट रूप से कहां संबोधित किया है। क्षमा करें यदि मैं सघन हो रहा हूँ। IOW, क्या आपका समाधान और @ Oded / @ एलेजैंड्रो का समाधान हमेशा एक ही परिणाम देता है?
19

@ दर्शन: मैंने ओड के समाधान को नहीं देखा है क्योंकि यह स्पष्ट रूप से कुछ है जिसका मैं उपयोग नहीं करना चाहता। मुझे लगता है कि Al2jandro का समाधान और मेरा समाधान $ v के किसी भी मूल्य के लिए समान उत्तर देते हैं
दिमित्रे Novatchev

1
@EricS, यह एक ही इसे खरीदने से आईईईई मानक तक पहुँच सकते हैं लगता है ... Byt यहाँ एक नजर है कार्य करें: cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF । विशेष रूप से, यह पैराग्राफ: "IEEE 754 NaN को शामिल करने वाले सभी संबंधपरक अभिव्यक्तियों को मान प्रदान करता है। C के वाक्यविन्यास में, विधेय x! = Y सत्य है, लेकिन अन्य सभी, x <y, x <= y, x = y; x> = y और x> y, जब भी x या y या दोनों NaN हो तो गलत हैं "
दिमित्रे नोवाचेव

18

XPath 2.0 में एक अद्भुत प्रकार का परीक्षण ऑपरेटर है जिसका आप उपयोग कर सकते हैं:

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

15

मैं अभी तक एक और वैकल्पिक समाधान प्रदान करने की कोशिश नहीं कर रहा हूं, लेकिन इस समस्या के लिए एक "मेटा दृश्य"।

ओड और दिमित्रे नोवाचेव द्वारा पहले से उपलब्ध कराए गए उत्तर सही हैं लेकिन लोगों को "मूल्य एक संख्या है" वाक्यांश के साथ वास्तव में क्या मतलब हो सकता है, मैं इसे कैसे कहूंगा, व्याख्या के लिए खुला।

एक तरह से यह सब इस विचित्र लगने वाले सवाल पर आता है: "आप अपने संख्यात्मक मूल्यों को कैसे व्यक्त करना चाहते हैं?"

XPath फ़ंक्शन उन number()संख्याओं को संसाधित करता है जो हैं

  • संभव अग्रणी या अनुगामी व्हॉट्सएप
  • केवल नकारात्मक मूल्यों पर पूर्ववर्ती हस्ताक्षर चरित्र
  • दशमलव विभाजक के रूप में डॉट (पूर्णांक के लिए वैकल्पिक)
  • रेंज के अन्य सभी चरित्र [0-9]

ध्यान दें कि इसमें संख्यात्मक मानों के लिए भाव शामिल नहीं हैं

  • घातांक रूप में व्यक्त किए जाते हैं (उदाहरण के लिए 12.3E45)
  • सकारात्मक मूल्यों के लिए साइन चरित्र हो सकता है
  • सकारात्मक और नकारात्मक शून्य के बीच अंतर है
  • सकारात्मक या नकारात्मक अनंत के लिए मूल्य शामिल करें

ये सिर्फ मापदंड नहीं बने हैं। स्कीमा के साथ एक तत्व जो स्कीमा के अनुसार मान्य xs:floatहै, उसमें उपरोक्त वर्णित विशेषताओं में से कोई भी हो सकता है। फिर भी number()मान लौटाएगा NaN

तो अपने प्रश्न का उत्तर दें कि "नोड मूल्य संख्या होने पर मैं XPath के साथ कैसे जांच कर सकता हूं?" या तो " number()एक एक्सपीथ 1.0 अभिव्यक्ति के साथ" या " का उपयोग करके पहले से ही उल्लिखित समाधान का उपयोग करें , आप नहीं कर सकते हैं"। आपके द्वारा सामना किए जा सकने वाले संभावित संख्या स्वरूपों के बारे में सोचें, और यदि आवश्यक हो, तो सत्यापन / संख्या पार्सिंग के लिए किसी प्रकार के तर्क को लिखें। XSLT प्रसंस्करण के भीतर, यह कुछ उपयुक्त अतिरिक्त टेम्पलेट्स के साथ किया जा सकता है, उदाहरण के लिए।

पुनश्च। यदि आप केवल गैर-शून्य संख्याओं के बारे में परवाह करते हैं, तो सबसे छोटा परीक्षण है

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

1
+1 प्रश्न के पीछे के मुद्दों की अच्छी विस्तृत व्याख्या: ओपी का मतलब क्या हो सकता है या अगर वह जानता होगा कि क्या पूछना है।
लार्स ऑक्ट

9

जो मुझे बहुत उपयोगी लगा वह निम्नलिखित है:

<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>

2

आप हमेशा कुछ इस तरह का उपयोग कर सकते हैं:

string(//Sesscode) castable as xs:decimal

यहां W3C द्वारा कास्टेबल का दस्तावेजीकरण किया गया है


1

मैं 01 के साथ काम कर रहा हूं - जो एक संख्यात्मक है।

string(number($v)) != string($v) अलगाव बनाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.