Мы создаем систему, которая получает данные XML из базы данных, использует XSLT для преобразования их в XHTML и одновременно использует внешний файл XML для извлечения меток, специфичных для данной культуры ( переводы для наших меток ).
Короткий вопрос
Система перевода / культуры кажется логичной? Эффективно?
Любые альтернативные концепции приветствуются ( в данном конкретном контексте )
Подробный вопрос
XML-данные
<page id="55" objecttype="ChristianOrthodoxMonument">
<field name="uniquename">some unique name here</field>
.. multiple field elements here ..
</page>
XML-культурные метки
<ChristianOrthodoxMonument>
<uniquename culture-1="Ονομασία" culture-2="Unique name" />
<birthdate culture-1="Ημ/νία γέννησης" culture-2="Date of birth" />
</ChristianOrthodoxMonument>
теперь в XSLT я передаю параметр cultureid
, который будет использоваться для отображения на метки.
XSLT ( пример фрагмента )
<xsl:param name="cultureid" select="1" />
<xsl:variable name="objecttype" select="/page/@objecttype" />
и для сопоставления с внешним файлом, включенным в
<xsl:variable name="culture" select="document('cultural-labels.xml')" />
я создал псевдодинамический xpath
<xsl:template name="translate">
<xsl:variable name="nodename" select="@name" />
<xsl:value-of select="$culture/*[name()=$objecttype]/*[name()=$nodename]/@*[name()=concat('culture-',$cultureid)]" />
</xsl:template>
, который я вызываю всякий раз, когда хочу получить метку для поля.
Вопрос A: Эффективен ли этот xpath или избыточен? слишком сложно?
Вопрос B: Эта модель кажется верной или я упускаю что-то важное, что в будущем станет препятствием?
Вопрос C: Существует ли какая-либо теория / пример о методах сопоставления внешних файлов XML?
2-е обновление с использованием составного ключа
ключ
<xsl:key name="find-node" match="*" use="concat(name(..),'!',name())" />
поиск
<xsl:template name="lookup-label">
<xsl:param name="objecttype" />
<xsl:variable name="nodename" select="@name" />
<xsl:for-each select="$culture">
<xsl:value-of select="key('find-node',concat($objecttype,'!',$nodename))/@*[name()=$culturefield]" />
</xsl:for-each>
</xsl:template>
это улучшение?