Преобразование кода страны в название страны с использованием xslt - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить значение CountryName на основе позиции CountryCode. Например, в 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 голосов
/ 08 мая 2018

Если ваши коды стран являются кодами 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, возможно, вас убедят изменить ...

0 голосов
/ 08 мая 2018

Поскольку вы используете XSLT 2.0, вы можете использовать функцию index-of, чтобы получить индекс CountryCode из переменной $CountryCode, а затем использовать значение индекса, чтобы получить CountryName из $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>
...