Regex делает то, что ожидается, но терпит неудачу во время XSLT-преобразования

Я сделал регулярное выражение для разделения определенной строки во время преобразования XML с использованием XSLT 2.0:

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

Это регулярное выражение применяется к некоторым строкам, которые имеют ту же форму, что и ниже:

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

Он извлекает все, что начинается с @VAL, до следующего @VAL (см. здесь объяснения о конструкция ?=). Итак, для этого примера результат регулярного выражения предоставляет следующие три строки:

  • @VAL@TEST1@1111@'Ceci est un texte'
  • @VAL@TEST2@2222@'Это текст'
  • @VAL@TEST3@3333@'Encore du texte'

К сожалению, даже если он хорошо работает с этим онлайн-тестером регулярных выражений, при выполнении преобразования возникает следующая ошибка:

XTDE1140: Ошибка в регулярном выражении: net.sf.saxon.trans.DynamicError: Ошибка в символе 11 в регулярном выражении "(@VAL)(.+?(?=@VAL|$))": ожидается ()) Не удалось скомпилировать таблицу стилей. Обнаружена 1 ошибка

Так в чем проблема с этим регулярным выражением? Я не понимаю, почему закрывающая скобка ожидается на символе 11.

Любая помощь приветствуется.

PS: я использую процессор saxon8 XSLT.


person Vincent    schedule 26.06.2013    source источник


Ответы (2)


Спасибо за дополнительное объяснение. Без просмотра с нулевой шириной я думаю, что есть два способа решить эту проблему:

(a) токенизировать, используя «@VAL» в качестве разделителя, и смириться с тем фактом, что вам придется добавлять «@VAL» обратно в начало каждого токена.

(b) сначала замените «@VAL», скажем, «§@VAL», а затем разметьте «§» в качестве разделителя.

person Michael Kay    schedule 26.06.2013
comment
Мне интересно, почему я не подумал о таком простом решении. Спасибо, теперь я использую решение (b). - person Vincent; 26.06.2013

Язык регулярных выражений XSD/XPath не допускает использование конструкции "(?=".

Честно говоря, не разбираясь, я не помню, что это значит, и поэтому я не знаю точно, чего вы пытаетесь достичь. Если вы объясните проблему, а не свою неудачную попытку решения, у вас больше шансов получить полезный ответ.

person Michael Kay    schedule 26.06.2013
comment
Спасибо за ваш ответ, я отредактировал вопрос, чтобы объяснить, чего я пытаюсь достичь. - person Vincent; 26.06.2013