2009-09-10 4 views
19

को महत्व देता है किसी को भी कृपया एक XPath अभिव्यक्ति प्रारूप है कि एक तत्व के कुछ योग्यता बच्चे नोड्स के concatenated मूल्यों से युक्त एक स्ट्रिंग मान देता है सुझाव दे सकते हैं, लेकिन अनदेखी दूसरों:XPath योग्यता चाइल्ड नोड की स्ट्रिंग संयोजन वापस जाने के लिए

<div> 
    This text node should be returned. 
    <em>And the value of this element.</em> 
    And this. 
    <p>But this paragraph element should be ignored.</p> 
</div> 

लौटाया मूल्य एक स्ट्रिंग होना चाहिए:

This text node should be returned. And the value of this element. And this. 

क्या यह एक XPath अभिव्यक्ति में संभव है?

धन्यवाद।

उत्तर

16

की परवाह किए बिना पाठ निकालने के लिए XPath 1.0 में:

आप

/div//text()[not(parent::p)] 

उपयोग कर सकते हैं वांछित पाठ नोड्स पर कब्जा करने की। सहभागिता स्वयं XPath 1.0 में नहीं की जा सकती है, मैं इसे होस्ट एप्लिकेशन में करने की सलाह देता हूं।

+3

धन्यवाद - आप बिल्कुल सही हैं।मैंने बस XPath संदर्भ पढ़ा और पाया कि सभी स्ट्रिंग फ़ंक्शंस नोड-सेट में पहले नोड पर निहित रूप से काम करते हैं, इसलिए परिणामस्वरूप चयन और संयम को गठबंधन करने का कोई तरीका नहीं है। –

+1

एक्सपैथ 2.0 में यह आसानी से किया जाता है - मेरा जवाब देखें :) –

+0

लवली और सुरुचिपूर्ण। आप पर अच्छा! – Aaron

5

यह देखो कि काम करता है:

संदर्भ /div/ के रूप में उपयोग करते हुए:

text() | em/text() 

या संदर्भ के उपयोग के बिना:

/div/text() | /div/em/text() 

आप पहले दो तार concat चाहते हैं, उपयोग यह:

concat(/div/text(), /div/em/text()) 
+1

धन्यवाद। यह सही दिशा में एक अच्छा कदम है। लेकिन मैं नहीं देख सकता कि परिणामों को कैसे जोड़ना है। जब मैं इसे स्ट्रिंग() फ़ंक्शन पर कॉल में लपेटता हूं, तो यह केवल पहले चयनित नोड का मान देता है। –

+0

हां, और, जैसा कि आप देख सकते थे, मेरा समाधान "सही" समाधान के समान होता है .. ¬¬ आप (...) नोड्स को संगत कर सकते हैं, लेकिन, आप तीसरे "टेक्स्ट" को नहीं देख पाएंगे। इसे आज़माएं: concat (/ div/text(),/div/em/text()) – eLZahR

6
/div//text() 

डबल स्लैश बलों मध्यवर्ती नोड्स

+0

यह संबंधित और जानकार है। धन्यवाद। – Aaron

+0

@Aaron आपका स्वागत है – Dewfy

26

XPath 2.0 में:

string-join(/*/node()[not(self::p)], '')

+10

+1 परंपरागत रूप से, मैं आपको XPath 2.0 उत्तरों छोड़ देता हूं। ;-) – Tomalak

+0

लेकिन नेस्टेड फ़ंक्शन स्ट्रिंग-जॉइन() जैसे स्ट्रिंग-जॉइन (सामान्यीकृत-स्पेस (// a [@ class = "title"] // text()) में समर्थित नहीं है) – SIslam

+0

@SIslam, यह नहीं है एक "नेस्टेड फ़ंक्शन" समस्या है, लेकिन बस 'सामान्यीकृत-स्थान()' एक तर्क लेता है - एक अनुक्रम नहीं। आप इसके बजाय इस अभिव्यक्ति का उपयोग कर सकते हैं: 'स्ट्रिंग-जॉइन (// a [@ class =' ​​title ']/normalize-space()) '। बेशक, आपको 'स्ट्रिंग-जॉइन() ' –

-2

आप यदि आप चाहते हैं इस

<xsl:variable name="newstring"> 
    <xsl:for-each select="/div//text()"> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 
    </xsl:variable> 
+1

के कॉल पर दूसरा तर्क जोड़ना प्रासंगिक नहीं है। पोस्टर ने XQuery के बारे में पूछा। – Alberto

0

की तरह एक के लिए-प्रत्येक लूप के रूप में अच्छी तरह से इस्तेमाल करते हैं और एक चर में मूल्यों को इकट्ठा कर सकता है पी को छोड़कर सभी बच्चे, आप निम्नलिखित कोशिश कर सकते हैं ...

string-join(//*[name() != 'p']/text(), "") 

जो रिटर्न ...

This text node should be returned. 
And the value of this element. 
And this. 
संबंधित मुद्दे