2010-11-23 79 views
7

XPath中是否有某种split()函数? 说我有这样的XML:使用XPath分割节点值

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

我想要检索filename,我该怎么办呢?我知道我可以得到像这样的节点值:

//path/text() 

我怎样才能得到文件名? (?我知道有一个concat()功能,所以也许有一个split()功能)

+0

好问题,+1。除了你已经得到了很好的答案之外,请参阅我的答案以获取其他两种可能的解 – 2010-11-23 17:00:02

回答

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/)。 – 2010-11-23 11:37:05

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 
      )