Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用XSL将区域设置转换为语言/国家/地区_Xml_Xslt_Internationalization - Fatal编程技术网

Xml 使用XSL将区域设置转换为语言/国家/地区

Xml 使用XSL将区域设置转换为语言/国家/地区,xml,xslt,internationalization,Xml,Xslt,Internationalization,我需要找出将区域设置字符串转换为人类友好名称的最佳方法。我可以编写一个大型的,只需为我想要转换的每个地区添加一个条件,但我认为可能有一种更有效或更聪明的方法 我的输入如下所示: <content name="locale" value="en_US" /> <content name="locale" value="ja_JP" /> <content name="language" value="English" /> <content name="

我需要找出将区域设置字符串转换为人类友好名称的最佳方法。我可以编写一个大型的
,只需为我想要转换的每个地区添加一个条件,但我认为可能有一种更有效或更聪明的方法

我的输入如下所示:

<content name="locale" value="en_US" />
<content name="locale" value="ja_JP" />
<content name="language" value="English" />
<content name="language" value="Japanese" />
<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>
<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>

相应的输出可能如下所示:

<content name="locale" value="en_US" />
<content name="locale" value="ja_JP" />
<content name="language" value="English" />
<content name="language" value="Japanese" />
<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>
<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>

就我而言,我现在不关心国家,只关心语言。我也不必检查所有可能的区域设置,目前只有10个左右,但将来可能会有更多的区域设置,这就是为什么我要寻找最不严格的转换方式。

有趣的问题

中间XML映射文件怎么样

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


使用XSL从中创建
块,并在输入文件上运行结果。

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


这至少可以阻止大choose语句,并为您提供未来的扩展选项。

您可以将映射存储在另一个XML文件中,并使用样式表中的函数访问它。假设您有一个类似于his中建议的映射文件,您可以这样做:

<content name="locale" value="en_US" />
<content name="locale" value="ja_JP" />
<content name="language" value="English" />
<content name="language" value="Japanese" />
<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>
<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>

好问题!我自己也有一些想法……是否可以将映射存储在外部文档而不是外部文档中?我正在使用的应用程序不允许我引用外部文件——所有的XML处理都是在内部完成的,基本上我只能编写
s。您的应用程序使用哪个XSLT处理器?它支持XSLT版本1还是版本2?可以使用XML将映射存储在变量中,但如果希望使用XPath访问值,则需要一个XSLT 2处理器或一个支持
节点集
扩展函数的XSLT 1处理器(许多处理器确实支持它):我正在试着理解约束。因此可以在
xsl:stylesheet
元素中添加
xsl:template
元素,但不能添加其他顶级元素,对吗?
document()
功能可用吗?只要
document(“”)
起作用并使您能够访问样式表本身,您就可以在第二个解决方案中使用这种方法,但只需将映射塞进某个模板中的
xsl:variable
元素中即可。额外的内容不一定是顶级元素,它可以是样式表中的任何位置。XSLT处理器是专有的,它支持XSLT版本1以及大部分(如果不是全部的话)EXSLT扩展。我可以使用“节点集”,所以我将尝试该路线,看看会发生什么。我使用的是一个搜索引擎,它的大部分XSLT处理都是一个黑盒子。