使用xslt将国家/地区代码转换为countryname

时间:2018-05-07 23:06:44

标签: xml xslt xslt-2.0

我试图从CountryCode的位置获取CountryName的值。例如,在XML文件中,

<CountryCode>USA</CountryCode>

XSLT代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Party">
    <xsl:copy-of select="node()|@*"/>
</xsl:template>
<xsl:template match="CountryCode">
    <xsl:copy>
        <xsl:variable name="CountryCode" select="upper-case(.)=('HK','USA','SG')"/> // list of country codes
        <xsl:variable name="CountryName" as="element()*"> // list of countryname
            <Name>HongKong</Name>
            <Name>United States of America</Name>
            <Name>Singapore</Name>
        </xsl:variable>
        <xsl:value-of select="$CountryName[($CountryCode)]"/> // get the position or index of the variable countryname to variable countrycode
    </xsl:copy>
</xsl:template>

但是,我获得了CountryName的所有价值。像这样,

<CountryCode>Philippines United States of America Singapore</CountryCode>

而不是<CountryCode>United States of America</CountryCode>

我的代码中是否缺少某些内容?或者我是以错误的方式做到的?

提前致谢。

XSLT2.0

2 个答案:

答案 0 :(得分:2)

如果您的国家/地区代码是ISO 3166代码,并且您可以使用XSLT 3.0处理器,那么您只需执行

<xsl:template match="CountryCode">
  <xsl:copy>{json-doc('http://country.io/names.json')(.)}</xsl:copy>
</xsl:template>

如果你没有使用ISO 3166代码,或者你没有使用XSLT 3.0,那么也许你可以被说服改变......

答案 1 :(得分:0)

由于您使用的是XSLT 2.0,因此可以使用index-of函数从CountryCode变量中获取$CountryCode的索引,然后使用索引的值来获取CountryName 1}}来自$CountryName

请尝试修改与<CountryCode>匹配的模板,如下所示。

<xsl:template match="CountryCode">
    <!-- Store input in a variable -->
    <xsl:variable name="InputCode" select="." />
    <xsl:copy>
        <!-- Removed the upper-case function and retained the sequence -->
        <xsl:variable name="CountryCode" select="('HK','USA','SG')"/>

        <xsl:variable name="CountryName" as="element()*">
            <Name>HongKong</Name>
            <Name>United States of America</Name>
            <Name>Singapore</Name>
        </xsl:variable>

        <!-- Added the index-of function to get the index of the input country
             code from the sequence and then extract the country name from the
             other sequence -->
        <xsl:value-of select="$CountryName[index-of($CountryCode, upper-case($InputCode))]"/>
    </xsl:copy>
</xsl:template>

输入

<CountryCode>USA</CountryCode>

上面的模板将输出为

<CountryCode>United States of America</CountryCode>