XSLT枚举映射

时间:2018-12-07 07:07:48

标签: xml xslt xsd

使用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>

如何使用xsl将chayTea映射。

输入xml:

<Hindi>Chay</Hindi>

输出xml:

<Hindi>Tea</Hindi>

2 个答案:

答案 0 :(得分:1)

我希望您仅使用两种语言,否则我的代码将无法工作。我只是快速编写了代码,因此它可能不是最出色的代码。请记住,条目必须具有相同的顺序。因此,如果您要翻译枚举中位置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>

答案 1 :(得分:0)

使用xsl:when

解决了此问题
<English>
    <xsl:choose>
        <xsl:when test="Hindi = 'Chay'">Tea</xsl:when>
        <xsl:when test="Hindi = 'Roti'">Bread</xsl:when>
    </xsl:choose>
<English>