Разделить значение узла с помощью XPath

есть ли какой-то split() функции в XPath? Скажем, у меня есть этот XML:

<root>
   <path>C:folderfilename</path>
</root>

и я хочу получить filename, как я могу это сделать? Я знаю, что могу получить значение узла следующим образом:

//path/text()

как я могу получить только имя файла? (Я знаю, что есть concat() функция, так что, возможно, есть

2 ответов


если у вас есть API с поддержкой xpath-2.0, вы можете решить это двумя способами:

заменить технику

попробуйте использовать:

fn:replace(string,pattern,replace)

например

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

техника разметки

вы можете получить некоторый пробег от tokenize:

fn:tokenize(string,pattern)

например (Спасибо Мартину)

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

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


в то время как я бы использовал:

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
           )