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

ссылка на другой документ


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

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2945] Пн Янв 20, 2003 00:00
ссылка на другой документ
Всем привет!

Я тут слегка запутался... А проблема, вроде бы простая. Есть два конфигурационных файла: menu.xml и actions.xml.
В первом определена структура меню приложения, в таком духе:

<MENU name="mnuHelp" title="Help">
 <MENU-ITEM name="itemHelpHome" action="HelpHome" title="Home".../>
</menu>

Во втором - "команды", более абстрактно:

<ACTION id="HelpHome"... />

Как сделать так, чтобы атрибут "action" из первого документа ссылался на элемент с тем же id из второго документа?  Через XLink или можно как-то проще? (PS: для обоих документов имеются DTD).  
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[2946] Пн Янв 20, 2003 00:00
Re: ссылка на другой документ
В XML поддерживаются ID/IDREF-ссылки внутри документа, для ссылок между документами надо использовать надстройки, например, XLink.

Можно ещё объединить все документы в один примерно таким способом:

Код:


<!DOCTYPE root [
ENTITY menu SYSTEM "menu.xml"
ENTITY actions SYSTEM "actions.xml"
]>
<root>
?menu;
?actions;
</root>


(Знак "?" - на самом деле амперсанд).
kite
Новичок

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2947] Вт Янв 21, 2003 00:00
Re: ссылка на другой документ
Спасибо, я понял.
Интересно, а кроме XLink какие другие надстройки можно было бы для этого использовать?
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2948] Вт Янв 21, 2003 00:00
Re: ссылка на другой документ
Заданный вопрос относится к супер-интересным, но, вероятно, пока еще нерешенным.

1. Часть постановки с длинным списком дебатов см., например, здесь (Nov, 2001) http://weblogs.userland.com/eclectic/stories/storyReader$291

2. пока такие межсвязи, имхо, обычно (раз)решают "на уровне приложения" - прямым кодом (напр., XSLT) или, скажем, отдельным словарем связей или синонимов; однако в чисто вашей проблеме последний, вероятно, оказался бы неким вырожденным и потому ненужным, типа списка:

[
file menu "menu.xml"
file command "command.xml"
menu..action SYN command..action
..] etc.
kite
Новичок

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2949] Вт Янв 21, 2003 00:00
Re: ссылка на другой документ
Ну да, в голову приходили мысли насчет XSLT: можно было бы взять actions.xml и с помощью двух разных стилей сгенерировать на его основе menu.xml и, скажем, toolbar.xml. Сделать это достаточно один раз при инсталляции приложения. Пожалуй, для такой скромной задачи как конфигурация программы это стрельба из пушки по воробьям. Хотя, позволяет попутно решить проблему локализации -- исходя из установок локала, xsl будет делать заголовки меню на нужном языке.
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[2950] Вт Янв 21, 2003 00:00
Re: ссылка на другой документ

Цитата:

а кроме XLink какие другие надстройки можно было бы для этого использовать?



Например, Hytime Links, которые были в эпоху SGML; было ещё что-то. На сегодня, для создания ссылок в XML, XLInk - лучший выбор.

В данном примере, XSLT - это тоже неплохо.
kite
Новичок

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2951] Ср Янв 22, 2003 00:00
Re: ссылка на другой документ
Я как раз сижу, пробую вариант с XSLT -- ничего, вроде получается.

Правда, пока не удается придумать изящное решение для локализации. А именно: каким способом xsl может узнавать, для какого локала ему генерировать заголовки. Не делать же для каждого языка свой XSL. Наверное, надо из программы добавлять в XSL новый узел, например, такой:

<xsl:variable name="LOCALE">ru_RU</xsl:variable>,

а потом использовать переменную $LOCALE в инструкциях обработки? Не подскажете, есть способы для передачи параметров XSL-файлу (вроде, где-то попадалась инструкция xsl:param)?
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2952] Ср Янв 22, 2003 00:00
Re: ссылка на другой документ

Инструкция-то такая (xsl:param) действительно имеется, но с т.з. XSLT она "вроде обычной переменной" - т.е. XSLT (как язык) может ее значение лишь обрабатывать, а как оно самое туда кладется - иногда вопрос, с которым вам придется чуть-чуть самому разобраться (передача данных "извне внутрь" xsl:param - дело вашего процессора, т.е. procerssor-dependent).

Но, поскольку вы уже умеете, как вы говорите, "из программы добавлять в XSL новый узел..", то эквивалентно для вас не должно быть проблем и "модифицировать старый" (узел xsl:param). К примеру, для msxml это делается через vbscript/jscript; для процессоров с командной строки - по соглашению о передаче параметров, для других сред - еще как-то по-ихнему...
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[2953] Ср Янв 22, 2003 00:00
Re: ссылка на другой документ
По поводу многоязычности в XSLT: посмотри на http://xmlhack.ru/articles/02/11/09/langsubst.html.
kite
Новичок

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2954] Ср Янв 22, 2003 00:00
Re: ссылка на другой документ

Цитата:

передача данных "извне внутрь" xsl:param - дело вашего процессора, т.е. procerssor-dependent).



Ясно.
Наверное, все-таки правильнее с т.зр. "document-driven" идеологии не вмешиваться в содержание документа. Пускай лучше приложение при первом старте генерирует XML-документ с установками, среди которых может быть: <locale>ru_RU</locale>, а XSLT потом к нему обращается.
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2955] Ср Янв 22, 2003 00:00
Re: ссылка на другой документ
это уж как виднее: на самом деле ведь "подстановка xslt-параметров" - дело run-time, к примеру, для msxml формально она в любом случае выполняется уже "в памяти", через DOM-дерево узлов, без какого-либо влияния на исходный XSLT-документ;

И как лучше - через файлы или напрямую через память - все индивидуально, no recipe  Wink
kite
Новичок

Зарегистрирован: 20.01.2003
Сообщения: 6
Откуда: Москва
[2956] Чт Янв 23, 2003 00:00
Re: ссылка на другой документ
Получилось! Всем, кто откликнулся, огромное спасибо.

Схема такая: XSLT берет actions.xml и делает menu.xml. При этом используется конфигурационный файл, где прописано, среди прочего:

<PARAM name="language">ru</PARAM> или другой нужный язык.

В отдельном каталоге лежат файлы под названием ru.xml, en.xml и под., которые выглядят примерно так:
       <RES id="File">Файл</RES>
       <RES id="Window">Окно</RES>
Атрибуты id совпадают с id "команд" из файла actions.xml.

Таким образом, решается вопрос с локализацией. Приложение отдыхает!