xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Сохранение entities при xslt-преобразованиях


Автор Сообщение
Catherine
Новичок

Зарегистрирован: 16.10.2002
Сообщения: 2
Откуда: Новосибирск
[2500] Сб Ноя 02, 2002 00:00
Сохранение entities при xslt-преобразованиях
Помогите, пожалуйста со следующей проблемой: мне нужно трансформировать один XML-документ в другой, добавив в некоторых тегах дополнительные атрибуты. То есть основная задача для начала - добится полного переноса содержимого одного документа в другой. Я пишу XSL, который копирует все элементы, атрибуты, текст, комментарии. Запускаю. Все entities в выходном документе заменяются на их значения, также происходит с символами, которые в изначальном документе выглядят как "&#decimalcode;". Как добится того, чтобы этого не происходило? Чтобы все entities сохранялись. Заранее спасибо за помощь\консультацию.
_________________
Cath
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[2501] Сб Ноя 02, 2002 00:00
Re: Entity
К сожалению, ваша задача средствами XSLT не решается. На этапе, когда начинает работать преобразование, исходное XML-дерево уже загружено, и информация о entities уже потеряна.

Что можно сделать - перед запуском XSLT заменить entities на какую-нибудь последовательность символов, например: &entity; на \|[entity], &#decimalcode; на \|[#decimalcode], а после преобразования выполнить обратную замену.

Если надо, могу поискать Perl regexp для такой замены.
Catherine
Новичок

Зарегистрирован: 16.10.2002
Сообщения: 2
Откуда: Новосибирск
[2502] Сб Ноя 02, 2002 00:00
Re: Entity
спасибо за ответ. Если не затруднит, то буду рада, если найдете код преобразования на Perl.
_________________
Cath
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[2503] Сб Ноя 02, 2002 00:00
Re: Entity
Кода преобразования не нашёл, написал свою версию.

Кодирование entities:

Код:


$ cat codify.pl
while (<>) {
        s/\\/\\\\/g;
        s/\&([^\;]+)\;/\\\|\[$1\]/g;
        print;
}



Восстановление entities:

Код:


$ cat entify.pl
while(<>) {
        s/\\\\|\\\|\[([^\]]+)\]/{
                if (defined $1) { '&' . $1 . ';' }
                else            { '\\' }
        }/ge;
        print;
}



Пример (знака подчёркивания в "&_#23" нет, он вставлен чтобы побороть ошибки форума при обработке спецсимволов):

Код:


$ cat test.txt
test\test
test&test;test
test\&_#23;test
test\|[test]test
$ perl -w codify.pl test.txt >coded.txt
$ cat coded.txt
test\\test
test\|[test]test
test\\\|[#23]test
test\\|[test]test
$ perl -w entify.pl coded.txt >uncoded.txt
$ cat uncoded.txt
test\test
test&test;test
test\&_#23;test
test\|[test]test
$ diff test.txt uncoded.txt
$