Конвертировать локаль в язык / страну, используя XSL - PullRequest
2 голосов
/ 15 сентября 2009

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

Мой ввод выглядит так:

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 16 сентября 2009

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

<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>
1 голос
/ 15 сентября 2009

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

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

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

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

0 голосов
/ 15 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...