2013-08-09 3 views
1

Конструкция для удаления ведущих нулей отлично работала в Altova XML Spy. С саксонская-HE 9,4 Java получил исключение:Почему XSLT lookahead шаблон не работает в Saxon-HE 9.4 java

Ошибка при XSL: стоимость из линии 6 на колонке 59 question.xslt: FORX0002: Ошибка при 4 символа в регулярном выражении «^ 0 + (?! $) ": ожидается())

Код:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <result> 
      <xsl:value-of select="replace('00012','^0+(?!$)','')"/> 
     </result> 
    </xsl:template> 
</xsl:stylesheet> 

у меня есть обходной путь, вопрос теоретический. Возможно, должны использоваться специальные символы?

ответ

2

Saxon строго придерживается синтаксиса регулярных выражений, определенных в спецификации XPath. Некоторые другие двигатели могут быть более либеральными и разрешать все, что разрешено библиотекой регулярных выражений, которые они используют. Синтаксис (?! $) Не допускается в спецификации XPath.

В Perl, (?! $) Это отрицательное утверждение с нулевой шириной, которое соответствует всем, кроме конца строки. Наверное, это то, что вы имели в виду. Так

replace('00012','^0+(?!$)','') 

бы удалить любую последовательность нулей в начале строки при условии, что это также не в конце строки. Например, это изменило бы 0012 на 12, оставив 000 как 000. Это кажется странным странным требованием: обычно я бы просто использовал строку (xs: integer (.)), Чтобы удалить все несущественные нули, но это не имеет свойство оставить «000» нетронутым. Если это действительно то, что вам нужно сделать, то, возможно, добавление «Z» в конце строки, а затем замена ($ x, '^ 0 + [^ Z]', '') соответствовало бы потребности.

+0

Спасибо за ответ. Такой паттен работал на Java. Я надеялся, что если Саксон использовал класс Java «java.util.regex.Pattern» для оценки, он должен работать. Но теперь ясно, что все работало без исключения, как указано в спецификации XPath. Упоминается в вопросе шаблона только образец. Некоторые примечания о примере ниже. Образец удаляет ведущие нули, преобразует «0012 в« 12 »и« 000 »в« 0 ». Обработанный узел имеет тип« xs: string », а для пустых строк выражение« string (xs: integer (.)) »Вызывает Если добавить «0» к началу строки, все должны работать нормально. Я использовал другие способы обхода, если шаблон не является проблемой. – pasha701

Смежные вопросы