Как заключить текстовые шаблоны в элементы XML, кроме случаев, когда они уже находятся внутри определенного элемента XML? - PullRequest
0 голосов
/ 21 июля 2009

У меня есть несколько тысяч XML-файлов, сгенерированных из файлов свойств Java, подготовленных для перевода в формате TTX. Они содержат довольно много переменных, которые мне нужно защитить от переводчиков, так как они часто ломают такие вещи. Переменные имеют форму чисел или иногда текст между парой фигурных скобок, например. {0}, {это}.

Мне нужно окружить эти переменные элементом xml, если они еще не являются атрибутом и если они еще не являются частью внутреннего текста элемента ut , например:

<ut DisplayText="{0}">&lt;{0}&gt;</ut>

Мой вклад выглядит так:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> {2}.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

Правильный вывод должен быть таким:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

Мой первоначальный подход состоял в том, чтобы использовать регулярное выражение для сопоставления термина в фигурных скобках и просто построить вокруг него элементы xml с заменой шаблона. Этот подход терпит неудачу, когда шаблон присутствует, как в первом кодовом блоке выше.

Предыдущие шаблоны поиска и замены (в блокноте ++):

Найти

({[A-Za-z0-9]*})

Заменить

<ut DisplayText="\1">\1</ut>

Начинает казаться, что регулярное выражение не является подходящим инструментом для работы, поэтому я хотел бы высказать несколько предложений о лучших подходах, различных инструментах или даже просто более полное регулярное выражение, которое может позволить мне быстро и повторяемость.

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

{o,choice|1#1  error|1&lt;{0,number,integer} errors}

Где «ошибка» и «ошибки» могут быть переведены и не должны быть защищены. Самое простое решение, которое у нас есть на данный момент, - запустить приведенное выше регулярное выражение, исправить несколько нечетных ошибок, которые он создает, и затем выполнить еще пару обычных операций поиска и замены для более сложных элементов. Его можно абстрагировать как регулярное выражение, но сейчас нет особого смысла в этом.

Я ценю указатели на xslt и другие редакторы с лучшей поддержкой регулярных выражений, в дополнение к предложенным улучшенным выражениям. Я буду играть с некоторыми из опций, когда позволит время.

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Дайте мне знать, если мое предположение неверно, но из вашего примера кажется, что вы хотите изменить текст, который находится в {}, а не в элементе . Мне кажется, это простое использование XSLT. Просто выведите элементы UT такими, какие они есть, и обработайте любой текст между ними.

0 голосов
/ 23 мая 2012

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

0 голосов
/ 22 июля 2009

Почему бы не попробовать использовать выражение

(? <=.) {[A-Za-z0-9] +} (? =. $) </p>

Это позволит найти {с 1 или более буквами или цифрами и}, когда за этим шаблоном следует тэг, а за любым количеством пробелов И следует любое количество пробелов и разрыв строки.

...