使用XSL将语言环境转换为语言/国家/地区

时间:2009-09-15 18:37:47

标签: xml xslt internationalization

我需要找出将语言环境字符串转换为人性化名称的最佳方法。我可以编写一个大的<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 个答案:

答案 0 :(得分: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处理器需要忽略xsl:stylesheet元素中不属于XSLT命名空间的任何元素,因此可以在那里包含映射。您可以以document('')的形式访问XSLT文档。

所以带有映射的自包含样式表可能如下所示:

<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 :(得分:1)

有趣的问题!

中间XML映射文件怎么样?:

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

使用XSL从中创建<xsl:choose>块并在输入文件上运行结果。

答案 2 :(得分:0)

可能有更好的方法,但您可以在单独的XML文档中使用格式良好的国家/地区查找,然后将该信息引用并输出到您的输出中。

这至少可以保留大选择声明,并为您提供未来的扩展选项。