Внешний XML для специфичного для культуры текста / Отображение перевода - PullRequest
1 голос
/ 16 ноября 2010

Мы создаем систему, которая получает данные 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>

это улучшение?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

Краткий вопрос Имеет ли система перевода / культура специфичная кажется логичным?

Да .

Эффективен?

Это может быть эффективным - не совсем ваша реализация.

я создал псевдодинамический xpath

<xsl:template name="translate"> 
 <xsl:variable name="nodename" select="@name" /> 
 <xsl:value-of select=
  "$culture/*[name()=$objecttype]
               /*[name()=$nodename]
                    /@*[name()=concat('culture-',$cultureid)]"

/>

которому я звоню всякий раз, когда хочу получить метка для поля.

Вопрос A : эффективен ли этот xpath или избыточен?

Нет, это неэффективно, потому что весь XML-документ будет многократно просматриваться для поиска узлов определенного типа.

слишком сложно?

номер

Вопрос B : эта модель кажется правильной или я что-то упускаю что окажется препятствием в будущее?

Модель в целом нормальная.

Вопрос C : Есть ли теория / пример аналогичного отображения методы для внешних файлов XML?

Есть много примеров эффективного поиска на основе ключей - даже в SO. Также см. этот .

0 голосов
/ 16 ноября 2010

Вот еще один чистый подход XSLT: http://docstore.mik.ua/orelly/xml/jxslt/ch08_06.htm

Другой альтернативой может быть вызов java-функций из xslt (смотрите здесь ) или C # (смотрите здесь Это имеет несколько преимуществ

  • Использование функциональности / инструментов, предлагаемых этими языками
  • Одинаковыми пакетами / файлами перевода можно поделиться
...