我在XML上使用XSL转换。变换的某些部分依赖于current locale。有没有办法从XSL中找到当前的语言环境?
例如,浮点数的用户可见序列化可以在区域设置之间变化(英语中的“1.0”是德语中的“1,0”),并且我的转换需要考虑这些差异。
答案 0 :(得分:2)
将其作为参数传递。
<xsl:param name="CultureInfo" select="'default'" />
在样式表的顶层放置一个XSL参数,并在调用样式表之前从“外部”设置它。
另一种(专有)方式是注册扩展函数并在样式表中询问。
答案 1 :(得分:2)
XSLT 1.0本身不支持本地,但是有一些方法可以使用它们,但是您需要将它作为参数传递给XSLT处理器或依赖扩展。 某些处理器将授予您访问区域设置信息的权限,但没有标准的方法,我们必须了解您的环境以查看是否可行。但是,在XSLT 2.0中,一些日期,时间和数字格式化函数将具有(有时是有限的)对语言环境的支持,并且将由处理器处理,而不是由您处理(这就是为什么有这些函数:)
至于在XSLT 1.0环境中使用某种形式的局部性,部分用作Good Thing(TM),无论XSLT版本如何,我都会为您正在使用的数据类型设置一些基本模板,以及传递本地参数(如前所述)。例如,对于数字,请查找xsl:format-number。
对于其他本地事物,我会创建另一个XML文件,并让参数作为您所关注信息的选择器。 XML可能看起来像;
<locals>
<config id="de">
<currency notation="₠" format-number="###.###,##" />
<text id="welcome">Wilcommen!</text>
</config>
<config id="en">
<currency notation="£" format-number="### ###.##" />
<text id="welcome">Welcome!</text>
</config>
<config id="no">
<currency notation="NOK" format-number="###.###,##" />
<text id="welcome">Velkommen!</text>
</config>
</locals>
从此开始,将其打开;
<xsl:variable name="locale" select="document('locale.xml')/locals/config[@id=$parameter.for.locale]" />
您可以将其用作欢迎文本;
<xsl:value-of select="$locale/text[@id='welcome']" />
对于数字格式化而且它有点复杂,但是首先验证这是正确的路径并且我将扩展,但基本上你应该在语言环境XML文件上创建几个键,并使用键查找值。对于数字等(需要告诉我更多关于你想要支持的内容)我会写几个处理它的模板,然后使用;
<xsl:call-template name="my-template">
<xsl:with-param name="this" select="'some_number'" />
</xsl:call-template>