任何非单词字符最后一次出现之前的子串 xslt 2.0 3.0

substring-before the last occurrence of any non-word character xslt 2.0 3.0

与此问题类似,但在 XSLT 2.0 或 3.0 中,我想在最后一个非单词字符(如正则表达式 \W)处打断

Finding the last occurrence of a string xslt 1.0

输入为REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX

期望的输出是:

REMOVE-THIS-IS-A-TEST-LINE,XXX,
      

这一次适用于一个分隔符,但我至少需要在逗号、空格和破折号处打断。

substring('REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX',1,index-of(string-to-codepoints('REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX'),string-to-codepoints(' '))[last()])

我在 saxon 9.9EE 和天线罩上使用氧气。

你可以根据tokenize()拆分字符串,然后使用[]索引或subsequence(),然后join()将它重新组合在一起,但最简洁的方法可能是使用正则表达式在字符串领域完成这一切...

这个 XPath,基于 , 个分隔符,

replace('REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX', '(.*,).+', '')

或者这个XPath,基于\W non-word-character,

replace('REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX', '(.*\W).+', '')

将return

REMOVE-THIS-IS-A-TEST-LINE,XXX,

根据要求。

我愿意

replace('REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX', '(\W)\w*$', '')

但是,这涉及到back-tracking,所以如果在长线上完成可能会很昂贵。为了避免回溯,尝试

string-join(
   analyze-string(
      'REMOVE-THIS-IS-A-TEST-LINE,XXX,XXXXX', '\W')
      /*[not(position()=last())])