我需要找出将语言环境字符串转换为人性化名称的最佳方法。我可以编写一个大的<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个左右,但未来可能会有更多,这就是为什么我正在寻找处理转换的最不严格的方式。
答案 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文档中使用格式良好的国家/地区查找,然后将该信息引用并输出到您的输出中。
这至少可以保留大选择声明,并为您提供未来的扩展选项。