अगर नोड मौजूद है तो xpath खोजें


201

अगर आप एक नोड (टैग) मौजूद है तो xpath क्वेरी का उपयोग कैसे करें?

उदाहरण के लिए यदि मुझे यह सुनिश्चित करने की आवश्यकता है कि वेबसाइट पेज में सही मूल संरचना जैसे / html / बॉडी और / html / हेड / शीर्षक है


शायद अनिवार्य तत्वों संकेत के साथ XML स्कीमा का उपयोग करना बेहतर है? इसलिए जांच लें कि कोई दस्तावेज़ इसका उपयोग करता है या नहीं।
abatishchev

जवाबों:


321
<xsl:if test="xpath-expression">...</xsl:if>

उदाहरण के लिए

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>

41
इस तरह की उच्च रेटिंग को देखकर आश्चर्य हुआ कि प्रश्न XSLT के उपयोग को बिल्कुल भी निर्दिष्ट नहीं करता है।
tjmoore

यह भयानक है लेकिन क्या होगा अगर मैं जाँच करना चाहता था कि क्या यह मौजूद है या खाली है?
SearchForKnowledge

3
@SearchForKnowledge, आपको संभवतः एसओ पर एक नए प्रश्न के रूप में पूछना चाहिए, लेकिन एक त्वरित मार्गदर्शिका के रूप में: html/body and not(html/body/node())(यानी, बस परीक्षण करें यदि यह मौजूद है और इसमें कोई बच्चा नोड्स या टेक्स्ट नोड्स नहीं है)।
हाबिल

71

निम्नलिखित अभिव्यक्ति का प्रयास करें: boolean(path-to-node)


3
यह ठीक वैसा ही है, जब मुझे xx का उपयोग lxml के साथ पायथन में करना था।
इयान सैमुअल मैकलीन एल्डर

1
InfoPath 2010 के भीतर नियम शर्तों और नियम
अधिनियमों का

3
यह इस अर्थ में सही उत्तर है कि यह वास्तव में एक्सपीथ क्वेरी है, अन्य उत्तरों के अधिकांश के विपरीत।
पॉल एथरटन

48

पैट्रिक सही है, दोनों के उपयोग में xsl:if, और एक नोड के अस्तित्व के लिए जाँच के लिए वाक्यविन्यास में। हालाँकि, पैट्रिक की प्रतिक्रिया का तात्पर्य है, अगर-तब-तब के बराबर कोई xsl नहीं है, इसलिए यदि आप एक if-if जैसी चीज़ की तलाश कर रहे हैं, तो, आप सामान्य रूप से बेहतर उपयोग कर रहे हैं xsl:chooseऔर xsl:otherwise। तो, पैट्रिक का उदाहरण वाक्य रचना काम करेगा, लेकिन यह एक विकल्प है:

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>

नोटिंग के लिए +1 if-then-else, इसके बारे में भी क्या if-else if-else? Davenpcj के उत्तर में मैं test="somexpath"इसे बनाने के लिए 2 वें में रख सकता हूं if-else if-else?
अनाबिनगंज

3
@ अभिषेक हाँ, आप अधिक xsl डाल सकते हैं: जब अन्य शर्तों के साथ और एक बहु-शाखा स्टेटमेंट हो। इसे एक से अधिक की तरह एक से अधिक का चयन करें अगर-तो-और, के साथ xsl: अन्यथा डिफ़ॉल्ट के रूप में:।
davenpcj

यह भयानक है लेकिन क्या होगा अगर मैं जाँच करना चाहता था कि क्या यह मौजूद है या खाली है?
SearchForKnowledge

13

एक विकल्प का उपयोग करने के लिए बेहतर हो सकता है, आपके अभिव्यक्तियों को एक से अधिक बार टाइप (या संभवतः गलत तरीके से) नहीं करना है, और आपको अतिरिक्त विभिन्न व्यवहारों का पालन करने की अनुमति देता है।

मैं बहुत बार उपयोग करता हूं count(/html/body) = 0, क्योंकि नोड की विशिष्ट संख्या सेट की तुलना में अधिक दिलचस्प है। उदाहरण के लिए ... जब अप्रत्याशित रूप से 1 से अधिक नोड होता है जो आपकी अभिव्यक्ति से मेल खाता है।

<xsl:choose>
    <xsl:when test="/html/body">
         <!-- Found the node(s) -->
    </xsl:when>
    <!-- more xsl:when here, if needed -->
    <xsl:otherwise>
         <!-- No node exists -->
    </xsl:otherwise>
</xsl:choose>

जैसा कि ऊपर दिए गए कोड में इंगित किया गया है, अधिक xsl: जब व्यवहार को बदलने और कई स्थितियों को अलग-अलग तरीकों से संभालने के लिए खंड जोड़ा जा सकता है।
davenpcj

count(/html/body) = 0 प्रतिभा! : DI जब (या जो कुछ भी याद आ रहा है) के /html[count(/body)=0]/someNodeचयन के लिए इसका इस्तेमाल करेंsomeNode/body
स्टीफन रोजिन

1
@clickstefan, /html[count(/body)=0]कभी भी कुछ भी नहीं चुनेगा, XML में दो रूट नोड नहीं हो सकते। शायद आपका मतलब था /html[count(body)=0], जो जैसा होगा /html[not(body)], या होगा /html[not(exists(body))]
हाबिल

@Abel हां, / html [काउंट (// बॉडी) = 0] या आपने कैसे कहा, शर्मनाक लेकिन हां मैंने एक उचित उदाहरण नहीं दिया
स्टीफन रोजिन

4

मैं रूबी में काम करता हूं और नोकोगिरी का उपयोग करके मैं तत्व प्राप्त करता हूं और यह देखने के लिए देखता हूं कि क्या परिणाम शून्य है।

require 'nokogiri'

url = "http://somthing.com/resource"

resp = Nokogiri::XML(open(url))

first_name = resp.xpath("/movies/actors/actor[1]/first-name")

puts "first-name not found" if first_name.nil?

3

गणना का उपयोग करके जावा में xpath का उपयोग करते समय एक भिन्नता ():

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.