使用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将chay
与Tea
映射。
输入xml:
<Hindi>Chay</Hindi>
输出xml:
<Hindi>Tea</Hindi>
答案 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>