2010-11-16 7 views
1

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

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

+0

Хороший вопрос, +1. См. Мой ответ для конкретных ответов на все ваши вопросы и указатели на примеры эффективной реализации. –

ответ

3

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

Да.

Эффективный?

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

я создал псевдо динамический 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-документ будет проходить много раз, чтобы найти определенные узлы objecttype.

overcomplicated?

No.

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

Модель в целом хорошо.

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

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

+0

@ Dimitre, спасибо за указатели и ссылки. Я думаю, что я понимаю ключевую концепцию, но вижу, что большинство применений использует поиск атрибутов, в то время как мой основан на nodenames (* 2 уровня глубоких *). Является ли [этот подход] (http://pastebin.com/yA1ryLaQ) улучшением? –

+0

@Gaby: ключевое значение - это просто строка. Он может быть создан из атрибутов, имен узлов ... любых других строк или конкатенаций. – 2010-11-16 13:41:24

+0

@ Dimitre: +1 Очень хорошее объяснение. – 2010-11-16 13:41:43

0

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

Другой альтернативой может быть для вызова функций Java из XSLT (смотрите here) или C# (смотрите here.Это имеет несколько преимуществ

  • Рычаги в functionaity/инструменты, предлагаемые этими языками
  • Одинаковые пучки/файлы перевода могут быть разделены
+0

+1, спасибо за ссылки. Хорошая концепция в первом, но я предпочитаю держать ее как агностик, насколько это возможно, поэтому я избегаю использования переменных напрямую, которые становятся переопределенными. Моя структура немного глубже. –

Смежные вопросы