正则表达式做了预期但在XSLT转换期间失败了

时间:2013-06-26 09:13:40

标签: regex xslt xslt-2.0 saxon regex-lookarounds

我使用XSLT 2.0在XML转换期间使用正则表达式来拆分特定字符串:

(@VAL)((.+?)(?=@VAL|$))

此正则表达式应用于某些字符串,其形式如下:

@VAL@TEST1@1111@'Ceci est un texte'@VAL@TEST2@2222@'This is a text'@VAL@TEST3@3333@'Encore du texte'

它提取以@VAL开头的所有内容,直到下一个@VAL(有关?=构造的解释,请参阅there)。因此,对于此示例,正则表达式的结果提供了以下三个字符串:

  • @ VAL @ TEST1 @ 1111 @'Ceci est un texte'
  • @ VAL @ TEST2 @ 2222 @'这是一个文字'
  • @ VAL @ TEST3 @ 3333 @'Encore du texte'

不幸的是,即使它适用于this online regex tester,我在执行转换时也会遇到此错误:

  

XTDE1140:正则表达式出错:net.sf.saxon.trans.DynamicError:字符出错     正则表达式中的11“(@VAL)(。+?(?= @ VAL | $))”:expected())   无法编译样式表。检测到1个错误

那么这个正则表达式的问题是什么?我不明白为什么在第11个字符处需要一个右括号。

欢迎任何帮助。

PS:我使用的是saxon8 XSLT处理器

2 个答案:

答案 0 :(得分:0)

XSD / XPath正则表达式语言不允许构造“(?=”。

老实说,如果不抬头,我不记得它意味着什么,因此我不确切地知道你想要实现什么。如果您解释问题,而不是尝试解决方案失败,那么您更有可能得到有用的答案。

答案 1 :(得分:0)

感谢您的额外解释。如果没有零宽度前瞻,我认为有两种方法可以解决这个问题:

(a)使用“@VAL”作为分隔符进行标记,并且必须将“@VAL”添加回每个标记的前面。

(b)首先用“§@ VAL”替换“@VAL”,然后将“§”标记为分隔符。