2010-11-23 11 views
7

XPathには何らかの種類のsplit()関数がありますか?XPathの分割ノード値

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

そして、私はfilenameを取得したい、私はこれをどのように行うことができます。 は、私は、このXMLを持って言いますか?

//path/text() 

ファイル名だけを取得するにはどうすればよいですか? (?私は、concat()機能がある知っているので、多分split()機能あり)

+0

良い質問、1。あなたが持っている良い答えに加えて、私は2つの可能な解決策の答えを見ています。 –

答えて

6

あなたは、XPath-2.0対応APIを使用している場合は、次の2つの方法でこの問題を解決することができます。

置き換える技術

使用してみてください:

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では利用できないので注意してください。 (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 
      ) 
関連する問題