2010-11-23 11 views
7

¿Hay algún tipo de función de split() en XPath? Decir que tengo este XML:Valor de nodo dividido con XPath

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

Y quiero recuperar filename, ¿cómo puedo hacer esto? Sé que puedo obtener el valor del nodo así:

//path/text() 

¿Cómo puedo obtener solo el nombre del archivo? (? Sé que es una función concat(), así que tal vez es una función split())

+0

Buena pregunta, 1. Además de las buenas respuestas que tiene, vea mi respuesta para otras dos posibles soluciones. –

Respuesta

6

Si usted tiene un-2,0 XPath API capaz, puede resolver de dos maneras:

reemplazar técnica

Trate de usar:

fn:replace(string,pattern,replace) 

por ejemplo,

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

técnica tokenize

Usted puede obtener algún provecho de tokenize:

fn:tokenize(string,pattern) 

por ejemplo, (Gracias a Martin)

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

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

+3

Sí, 'tokenize (/ root/path, '\\') [last()]' permite eso, pero tenga en cuenta que tanto replace como tokenize son XPath 2.0 y no están disponibles en XPath 1.0, por lo que necesita una implementación de XPath 2.0 como Saxon 9 (http://saxon.sourceforge.net/). –

+0

Gracias, no pude determinar si se aplicó por última vez a colecciones generadas dinámicamente. –

1

Mientras yo usaría:

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

también hay muchas otras maneras de obtener la secuencia deseada:

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

O:

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