নোডের মানটি হলে এক্সপথ পরীক্ষা


89

এক্সপ্যাথ ব্যবহার করে কোনও নোডের মান হ'ল আমি কীভাবে তা পরীক্ষা করতে পারি?

কোন ধারনা?

উত্তর:


124

NaN এর বিপরীতে মানটি পরীক্ষা করুন :

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

এটি একটি সংক্ষিপ্ত সংস্করণ (ধন্যবাদ @ আলেজান্দ্রো ):

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

10
কারণ এক্সপ্যাথে NaNসংখ্যা সংখ্যার ধরণের ডাটা টাইপের মান কোনও সংখ্যার মানের সমান হয় না এবং তুলনা করার জন্য যদি কমপক্ষে একটি যুক্তি সংখ্যা ডাটা টাইপ করা হয় তবে অন্যটি সংখ্যায় ফেলে দেওয়া হয়, এটি সংক্ষিপ্ত সংখ্যা পরীক্ষা:number(MyNode)=MyNode

10
@ Required item type of first operand of '=' is numeric; supplied value has item type xs:string;আলেজান্দ্রো দ্বারা সংক্ষিপ্ত সংস্করণটি = অপারেটর ( ) এর সাথে মেলে না এমন মিলের কারণে এক্সপথ ২.০ এর সাথে সম্পূর্ণ ব্যর্থ ,
Lucero

61

ভেরিয়েবলের মধ্যে থাকা মানটি $vএকটি সংখ্যা হিসাবে ব্যবহার করা যায় কিনা তা পরীক্ষার সবচেয়ে সংক্ষিপ্ততম উপায় :

number($v) = number($v)

আপনাকে কেবলমাত্র $vতার অভিব্যক্তিটি দিয়ে বিকল্পটির প্রয়োজন, যার মানটি আপনি পরীক্ষা করতে চান।

ব্যাখ্যা :

number($v) = number($v)স্পষ্টতই সত্য, যদি $vএকটি সংখ্যা হয়, বা একটি স্ট্রিং যা কোনও সংখ্যাকে উপস্থাপন করে।

এটি বুলিয়ান মানের ক্ষেত্রেও সত্য, কারণ number(true())এটি 1 এবং number(false)0 হয়।

যখনই $vকোনও সংখ্যা হিসাবে ব্যবহার করা যায় না, তখন number($v)এনএএন হয়

এবং NaN অন্য কোনও মানের সমান নয়, এমনকি নিজের কাছে।

সুতরাং, উপরোক্ত অভিব্যক্তিটি শুধুমাত্র তার জন্য সত্য $vযার মানটি একটি সংখ্যা হিসাবে ব্যবহার করা যেতে পারে এবং অন্যথায় মিথ্যা।


4
+1 সহায়ক ব্যাখ্যা। কেউ এমন ক্ষেত্রে মন্তব্য করতে পারেন যেখানে number($v) = number($v)থেকে আলাদা ফলাফল পাওয়া যায় number($v) = $v?
লার্শ 18

@ লার্শ: আমি ইতিমধ্যে এই মামলাগুলির বিষয়ে মন্তব্য করেছি। আপনি কি এখনও একটি সিদ্ধান্তহীন মামলা নির্দেশ করতে পারেন?
দিমিত্রে নোভাতেচেভ

আমি বোঝাতে চাইছি যে কেউ সেই ক্ষেত্রে তালিকা তৈরি করতে পারে যেখানে number($v) = number($v)থেকে আলাদা ফলাফল পাওয়া যায় number($v) = $v? নিঃসন্দেহে এটি আপনার লেখা থেকে উদ্ভূত, তবে আপনি কোথায় এই প্রশ্নটি স্পষ্টভাবে সম্বোধন করেছেন তা আমি দেখছি না। আমি ঘন হয়ে থাকলে দুঃখিত। আইওডাব্লু, আপনার সমাধান এবং @ ওদেডের / @ আলেজান্দ্রোর সমাধান সর্বদা একই ফল দেয়?
LarsH

@ লার্শ: আমি ওডেদের সমাধানটির দিকে নজর দিইনি কারণ এটি অবশ্যই এমন কিছু যা আমি ব্যবহার করতে চাই না। আমি মনে করি Al2jandro এর সমাধান এবং খনি সমাধানটি কোনও মান for v এর জন্য একই উত্তর দেয়
দিমিত্রে নোভাচেভ

4
@ এরিকস, দেখে মনে হচ্ছে এটি কেবল আইইইই স্ট্যান্ডার্ডটি কিনে অ্যাক্সেস করতে পারে ... বাইটের এখানে একবার নজর দেওয়া উচিত: cs.berkeley.edu/~wkahan/ieee754status/IEE754.PDF । বিশেষত, এই অনুচ্ছেদ: "আইইইই 754 NaN এর সাথে জড়িত সমস্ত সম্পর্কিত এক্সপ্রেশনগুলিকে মান নির্ধারণ করে C সি এর বাক্য বিন্যাসে, প্রিডিকেট x! = Y সত্য তবে অন্য সমস্ত, x <y, x <= y, x == y, x> = y এবং x> y, x বা y বা উভয়ই
NAN

18

এক্সপ্যাথ ২.০ এ একটি দুর্দান্ত ধরণের পরীক্ষা অপারেটর রয়েছে যা আপনি ব্যবহার করতে পারেন:

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

15

আমি অন্য একটি বিকল্প সমাধান দেওয়ার চেষ্টা করছি না, তবে এই সমস্যার একটি "মেটা ভিউ"।

ওদেড এবং দিমিত্রে নোভাচাভ ইতিমধ্যে প্রদত্ত উত্তরগুলি সঠিক তবে লোকেরা "মান একটি সংখ্যা" বাক্যটি দিয়ে যা বোঝাতে পারে তা হ'ল, আমি কীভাবে এটি বলব, ব্যাখ্যা করার জন্য উন্মুক্ত।

একটি উপায়ে এটি সমস্ত এই উদ্ভট শব্দটির প্রশ্নে আসে: "আপনি কীভাবে নিজের সংখ্যার মানগুলি প্রকাশ করতে চান?"

এক্সপথ ফাংশনটি number()যে সংখ্যাগুলিতে প্রক্রিয়া করে

  • সম্ভাব্য নেতৃস্থানীয় বা পূর্ববর্তী সাদা স্থান
  • কেবলমাত্র নেতিবাচক মানগুলিতে সাইন অক্ষর পূর্ববর্তী
  • দশমিক বিভাজক হিসাবে বিন্দু (পূর্ণসংখ্যার জন্য alচ্ছিক)
  • পরিসর থেকে অন্যান্য সমস্ত অক্ষর [0-9]

মনে রাখবেন যে এটিতে সংখ্যাসূচক মানগুলির জন্য অভিব্যক্তি অন্তর্ভুক্ত নয়

  • সূচকীয় আকারে প্রকাশ করা হয় (যেমন 12.3E45)
  • ইতিবাচক মানগুলির জন্য সাইন অক্ষর থাকতে পারে
  • ধনাত্মক এবং negativeণাত্মক শূন্যের মধ্যে পার্থক্য রয়েছে
  • ইতিবাচক বা নেতিবাচক অসীমের মান অন্তর্ভুক্ত করুন

এগুলি কেবল মানদণ্ডে তৈরি হয় না। স্কিমা অনুযায়ী একটি বৈধ xs:floatমান হিসাবে সামগ্রী হিসাবে একটি উপাদান উপরোক্ত বৈশিষ্ট্যযুক্ত থাকতে পারে। তবুও number()মান ফিরে আসবে NaN

সুতরাং আপনার প্রশ্নের উত্তর "নোডের মান সংখ্যা হলে আমি কীভাবে এক্সপথ দিয়ে চেক করতে পারি?" হয় "ইতিমধ্যে উল্লিখিত সমাধানগুলি ব্যবহার করে number()" ব্যবহার করে "বা" একক এক্সপথ ০.০ এক্সপ্রেশন দিয়ে, আপনি পারবেন না "। আপনার মুখোমুখি হতে পারে এমন সম্ভাব্য সংখ্যার ফর্ম্যাটগুলি সম্পর্কে চিন্তা করুন এবং যদি প্রয়োজন হয় তবে বৈধতা / নম্বর পার্সিংয়ের জন্য এক ধরণের যুক্তি লিখুন। এক্সএসএলটি প্রসেসিংয়ের মধ্যে, এটি কয়েকটি উপযুক্ত অতিরিক্ত টেম্পলেটগুলির সাহায্যে করা যেতে পারে, উদাহরণস্বরূপ।

পুনশ্চ. আপনি যদি কেবলমাত্র শূন্য নম্বরের বিষয়ে চিন্তা করেন তবে সংক্ষিপ্ততম পরীক্ষাটি

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

4
+1 প্রশ্নের পিছনে সমস্যাগুলির ভাল বিশদ বিবরণ: ওপি বলতে কী বোঝাতে পারে বা বোঝাতে চেয়েছিল যদি তিনি জানতে চান তবে কী জিজ্ঞাসা করবেন।
LarsH

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

castালাই এখানে ডাব্লু 3 সি দ্বারা নথিভুক্ত করা হয়েছে


1

আমি 01 এর সাথে ডিল করছি - এটি একটি সংখ্যাসূচক।

string(number($v)) != string($v) বিভাজন করে তোলে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.