2010-11-23 7 views
7

XPath에 어떤 종류의 split() 함수가 있습니까? 나는이 작업을 수행 할 수있는 방법,XPath로 분할 노드 값

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

내가 filename을 검색 할 : 내가이 XML을 말해봐? 나는 노드 값을 다음과 같이 얻을 수 있다는 것을 알고있다 :

//path/text() 

어떻게 파일 이름을 얻을 수 있습니까? (? 내가하는 concat() 기능이 알 수 있도록 어쩌면 split() 기능이있다)

+0

좋은 질문, +1. 당신이 가진 좋은 대답 이외에, 가능한 다른 두 가지 해결책에 대한 나의 대답을보십시오. –

답변

6

당신이 XPath는-2.0 수있는 API가있는 경우, 당신은 두 가지 방법으로이 문제를 해결 할 수 있습니다

대체 기술

사용해보십시오 :

fn:replace(string,pattern,replace) 

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

당신은 토큰 화에서 약간의 마일리지를받을 수 있습니다

토큰 화 기술 :

fn:tokenize(string,pattern) 

예를 들어, (마틴 덕분에)

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

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

+3

예, tokenize (/ root/path, '\\') [last()]'는 replace와 tokenize가 모두 XPath 2.0이고 XPath 1.0에서는 사용할 수 없으므로 Saxon 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 
      )