Мы создаем систему, которая получает XML-данные из базы данных, использует XSLT для преобразования ее в XHTML и в то же время использует внешний XML-файл для извлечения ярлыков, специфичных для культуры (переводы для наших этикеток).Внешний 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?
второе обновлениес композитным использования ключа
ключа
<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>
- это улучшение?
Хороший вопрос, +1. См. Мой ответ для конкретных ответов на все ваши вопросы и указатели на примеры эффективной реализации. –