2010-10-04 13 views

उत्तर

98

टेस्ट 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 में 1.0 'NaN' संख्या के मूल्य डेटा प्रकार किसी भी संख्या मान के बराबर नहीं है और तुलना के लिए यदि कम से कम एक तर्क संख्या डेटा टाइप किया गया है तो दूसरा नंबर पर डाला जाता है, यह सबसे छोटा संख्या परीक्षण है: 'संख्या (MyNode) = MyNode' –

+7

द्वारा संक्षिप्त संस्करण @Alejandro पूरी तरह से XPath 2.0 के साथ विफल रहता है क्योंकि वें पर मेल नहीं मिला है ई = ऑपरेटर ('= 'के पहले ऑपरेंड का आवश्यक आइटम प्रकार संख्यात्मक है; आपूर्ति किए गए मान में आइटम प्रकार xs है: स्ट्रिंग; '), Dimitre का समाधान ठीक काम करता है। – Lucero

47

कम से कम जिस तरह से परीक्षण करने के लिए यदि किसी वैरिएबल $v में निहित मूल्य कर सकते हैं एक संख्या के रूप में इस्तेमाल किया जाना चाहिए:

number($v) = number($v) 

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

स्पष्टीकरण: अगर $v एक नंबर, या एक स्ट्रिंग है कि एक संख्या का प्रतिनिधित्व करता है

number($v) = number($v), स्पष्ट रूप से सच है।

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

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

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

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

+1

+1 सहायक स्पष्टीकरण। क्या कोई ऐसे मामलों पर टिप्पणी कर सकता है जहां 'संख्या ($ v) = संख्या ($ v)' 'संख्या ($ v) = $ v' से अलग परिणाम उत्पन्न करती है? – LarsH

+0

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

+0

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

14

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

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

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

XPath समारोह number() प्रक्रियाओं की संख्या केवल ऋणात्मक मानों

  • डॉट एक दशमलव विभाजक के रूप पर है कि

    • संभव आगे या पीछे कोई खाली स्थान के
    • पूर्ववर्ती संकेत चरित्र (पूर्णांकों के लिए वैकल्पिक)
    • सीमा से सभी अन्य पात्र [0-9]

    ध्यान दें कि यह संख्यात्मक मानों कि

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

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

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

    पीएस।

    string(//Sesscode) castable as xs:decimal 
    

    castable W3C here द्वारा प्रलेखित है: यदि आप केवल गैर शून्य संख्या के बारे में परवाह है, तो कम से कम परीक्षण

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

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

    0

    तुम हमेशा कुछ इस तरह इस्तेमाल कर सकते हैं है।

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

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

    <xsl:if test="$number castable as xs:double"> 
        <!-- implementation --> 
    </xsl:if> 
    
    संबंधित मुद्दे