2010-11-23 8 views
7

Existe-t-il une sorte de fonction split() dans XPath? Dire que j'ai ce code XML:Valeur de noeud de partage avec XPath

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

Et je veux récupérer filename, comment puis-je faire cela? Je sais que je peux obtenir la valeur de noeud comme ceci:

//path/text() 

Comment puis-je obtenir seulement le nom de fichier? (? Je sais qu'il ya une fonction concat(), alors peut-être il y a une fonction split())

+0

Bonne question, +1. Outre les bonnes réponses que vous avez, voir ma réponse pour deux autres solutions possibles. –

Répondre

6

Si vous avez un XPath 2.0 API capable, vous pouvez résoudre de deux façons:

remplacer la technique

Essayez d'utiliser:

fn:replace(string,pattern,replace) 

par exemple

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

technique tokenize

Vous pouvez obtenir un certain kilométrage à partir tokenize:

fn:tokenize(string,pattern) 

par exemple (Merci à Martin)

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

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

+3

Oui, 'tokenize (/ root/path, '\\') [last()]' le permet mais notez que les deux remplacer et tokenize sont XPath 2.0 et non disponible dans XPath 1.0 donc vous avez besoin d'une implémentation XPath 2.0 comme Saxon 9 (http://saxon.sourceforge.net/). –

+0

Merci, je ne pouvais pas savoir si la dernière appliquée aux collections générées dynamiquement. –

1

Bien que j'utiliser:

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

il y a aussi de nombreuses autres façons d'obtenir la chaîne désirée:

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

Ou:

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