Отображение перечисления XSLT - PullRequest
0 голосов
/ 07 декабря 2018

Использование xsl для преобразования одной xml в другую xml-схему.

как сопоставить перечисление одного xml с другим.

пример: xsd 1:

<xsd:element  name="Hindi">
<xsd:simpleType>
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Chay" />
        <xsd:enumeration value="Roti" />
    </xsd:restriction>
</xsd:simpleType>

xsd 2:

<xsd:element  name="Hindi">
<xsd:simpleType>
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Tea" />
        <xsd:enumeration value="Bread" />
    </xsd:restriction>
</xsd:simpleType>

Как мне сопоставить chay с Tea, используя xsl.

Входной XML:

<Hindi>Chay</Hindi>

Выходной XML:

<Hindi>Tea</Hindi>

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Решено с помощью xsl:when

<English>
    <xsl:choose>
        <xsl:when test="Hindi = 'Chay'">Tea</xsl:when>
        <xsl:when test="Hindi = 'Roti'">Bread</xsl:when>
    </xsl:choose>
<English>   
0 голосов
/ 07 декабря 2018

Я надеюсь, что вы используете только два языка, иначе мой код не будет работать.Я просто запрограммировал это быстро, так что это может быть не самый модный код.Имейте в виду, что записи должны иметь одинаковый порядок.Поэтому, если вы хотите перевести слово на позицию x в перечислении, x должно быть положением слова в другом перечислении.

Переменная словаря:

<xsl:variable name="dict">
    <element name="Hindi">
        <simpleType>
            <restriction base="xsd:string">
                <enumeration value="Inp1" />
                <enumeration value="Inp2" />
            </restriction>
        </simpleType>
    </element>
    <element name="English">
        <simpleType>
            <restriction base="xsd:string">
                <enumeration value="Bread1" />
                <enumeration value="Bread2" />
            </restriction>
        </simpleType>
    </element>
</xsl:variable>

Шаблон соответствия:

<!-- This will match on every node with a specified element/@name in the dictionary -->
<xsl:template match="*[name() = $dict/element/@name]">
    <xsl:variable name="fromLanguage" select="name()"/>
    <xsl:variable name="wordToTranslate" select="."/>
    <!-- My translation requires the same order of enumerations in order to do it correctly -->
    <!-- I am counting the preceding siblings, so we can take the xth element of the other dictionary -->
    <xsl:variable name="precSiblings" select="$dict/element[@name = $fromLanguage]//enumeration[@value = $wordToTranslate][1]/count(preceding-sibling::*)"/>
    <!-- Renaming the language node -->
    <xsl:element name="{$dict/element[@name != $fromLanguage]/@name}">
        <xsl:value-of select="$dict/element[@name != $fromLanguage]//enumeration[$precSiblings + 1]/@value"/>
    </xsl:element>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...