XPath

2010-11-23 19 views
7

के साथ स्प्लिट नोड मान क्या XPath में split() फ़ंक्शन का कोई प्रकार है? मैं इस एक्सएमएल है कहते हैं:XPath

<root> 
    <path>C:\folder\filename</path> 
</root> 

और मैं filename प्राप्त करना चाहते हैं, कैसे मैं यह कर सकता है? मुझे पता है कि मैं इस तरह नोड मान प्राप्त कर सकता हूं:

//path/text() 

मैं केवल फ़ाइल नाम कैसे प्राप्त कर सकता हूं? (? मैं जानता हूँ कि, एक concat() समारोह है तो हो सकता है कि वहाँ एक split() समारोह है)

+0

अच्छा सवाल है, +1। आपके द्वारा प्राप्त किए गए अच्छे उत्तरों के अलावा, दो अन्य संभावित समाधानों के लिए मेरा उत्तर देखें। –

उत्तर

6

आप एक xpath-2.0 सक्षम एपीआई है, तो आप दो तरीकों से हल कर सकते हैं:

की जगह तकनीक

उपयोग करके देखें:

fn:replace(string,pattern,replace) 

जैसे

fn:replace(//path/text(),".*/","") 

tokenize तकनीक

आप tokenize से कुछ लाभ मिल सकता है:

fn:tokenize(string,pattern) 

उदा (मार्टिन करने के लिए धन्यवाद)

tokenize(/root/path, '\\')[last()] 

http://www.w3schools.com/Xpath/xpath_functions.asp#string

+3

हां, 'टोकनिज (/ रूट/पथ, '\\') [अंतिम()] 'यह अनुमति देता है लेकिन ध्यान दें कि प्रतिस्थापन और टोकनिज दोनों XPath 2.0 हैं और XPath 1.0 में उपलब्ध नहीं हैं, इसलिए आपको सैक्सन 9 जैसे XPath 2.0 कार्यान्वयन की आवश्यकता है (http://saxon.sourceforge.net/)। –

+0

धन्यवाद, मैं काम नहीं कर सका कि आखिरकार गतिशील रूप से जेनरेट किए गए संग्रह पर लागू किया गया था या नहीं। –

1

मैं का प्रयोग करेंगे जबकि:

tokenize(/*/*, '\\')[last()] 

वहाँ भी वांछित स्ट्रिंग प्राप्त करने के लिए कई अन्य तरीके हैं:

codepoints-to-string 
    (reverse 
     (string-to-codepoints 
     (substring-before 
      (codepoints-to-string 
       (reverse 
        (string-to-codepoints(/*/*) 
       ) 
      ), 
       '\' 
      ) 
     ) 
     ) 
    ) 

या:

substring(/*/*, 
      index-of(string-to-codepoints(/*/*), 
      string-to-codepoints('\') 
      ) 
      [last()] 
      + 1 
      )