2009-09-15 5 views
2

Мне нужно выяснить, как лучше всего преобразовать языковые строки в удобное для пользователя имя. Я мог бы написать большой <xsl:choose> и просто добавить условие для каждой из локаций, которые хочу преобразовать, но я думаю, что, вероятно, более эффективный или умный способ.Преобразование языкового стандарта на язык/страну с помощью XSL

Мой вход выглядит следующим образом:

<content name="locale" value="en_US" /> 
<content name="locale" value="ja_JP" /> 

И соответствующий выход может выглядеть следующим образом:

<content name="language" value="English" /> 
<content name="language" value="Japanese" /> 

В моем случае я не заботиться о стране прямо сейчас, только язык. Мне также не нужно проверять все возможные локали, всего 10 или около того в настоящее время, но в будущем может быть больше, поэтому я ищу наименее жесткий способ обработки конверсии.

+0

Большой вопрос! Дает мне несколько идей ... – Brabster

ответ

2

Вы можете сохранить сопоставление в другом XML-файле и получить к нему доступ с помощью функции document() из вашей таблицы стилей. Если у вас есть файл сопоставления, как один из них предложил Chris McCall в его answer, вы могли бы сделать это следующим образом:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="mapping" 
       select="document('mapping.xml')"/> 

    <xsl:template match="content[@name='locale']"> 
    <xsl:variable name="locale" select="@value"/> 
    <content name="language"> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="$mapping//content-map[@locale=$locale]/@language"/> 
     </xsl:attribute> 
    </content> 
    </xsl:template> 

</xsl:stylesheet> 

Если вы хотите действительно компактное решение, которое вы можете даже включить отображение внутри самой таблицы стилей , Поскольку XSLT-процессоры должны игнорировать любые элементы, не принадлежащие XSLT-пространству имен в элементе xsl:stylesheet, вы можете включить туда отображение. Вы можете получить доступ к самому документу XSLT как document('').

Так самодостаточным таблицы стилей с отображением может выглядеть следующим образом:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:map="https://stackoverflow.com/questions/1428947#" 
       exclude-result-prefixes="map" 
       > 

    <map:mapping> 
    <map:content-map locale="en_US" language="English"/> 
    <map:content-map locale="ja_JP" language="Japanese"/> 
    </map:mapping> 

    <xsl:variable name="mapping" 
       select="document('')//map:mapping"/> 

    <xsl:template match="content[@name='locale']"> 
    <xsl:variable name="locale" select="@value"/> 
    <content name="language"> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="$mapping//map:content-map[@locale=$locale]/@language"/> 
     </xsl:attribute> 
    </content> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Возможно ли сохранить сопоставление в , а не в внешнем документе? Приложение, в котором я работаю, не позволяет мне ссылаться на внешние файлы - вся обработка XML выполняется внутри, и я могу писать только '' s, в основном. –

+0

Какой XSLT-процессор является вашим приложением? Поддерживает ли он поддержку XSLT версии 1 или версии 2? Можно сохранить отображение в переменной с помощью XML, но если вы хотите получить доступ к значению с помощью XPath, вам нужно иметь либо процессор XSLT 2, либо процессор XSLT 1, который поддерживает функцию расширения набора узлов (многие процессоры поддерживают его): http://www.xml.com/pub/a/2003/07/16/nodeset.html –

+0

Я пытаюсь понять ограничения. Таким образом, вы можете добавлять элементы 'xsl: template' внутри элемента' xsl: stylesheet', но вы не можете добавлять другие элементы верхнего уровня, не так ли? Доступна ли функция 'document()'? До тех пор, пока 'document ('')' работает и получает доступ к самой таблице стилей, вы можете использовать этот подход во втором решении, но просто привяжите отображение внутри элемента 'xsl: variable' в пределах некоторого шаблона. Дополнительный контент необязательно должен быть элементом верхнего уровня, он может быть где угодно внутри таблицы стилей. –

1

Интересный вопрос!

Как насчет промежуточного отображения XML файла ?:

<content-maps> 
<content-map locale="en_US" language="English"/> 
<content-map locale="ja_JP" language="Japanese"/> 
</content-maps> 

Использования XSL для создания ваших <xsl:choose> блока от этого и запустить результаты по сравнению с вашим входным файлом.

0

Вероятно, есть лучший способ, но вы можете иметь красиво отформатированный поиск по странам в отдельном документе XML, а затем ссылаться на эту информацию и публиковать эту информацию.

Это, по крайней мере, должно держать большой выбор заявления в страхе и дать вам варианты будущего расширения.

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