使用推送式、基于模板的处理,您应该能够编写模板来进行映射,例如
<xsl:template match="rate/code[. = 'AB']">
<xsl:copy>
<xsl:text>YZ</xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="rate/code[. = 'CD']">
<xsl:copy>
<xsl:text>WX</xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="rate/code[. = 'EF']">
<xsl:copy>
<xsl:text>QR</xsl:text>
</xsl:copy>
</xsl:template>
然后如果你确保你apply-templates
为任何rate
父元素做,例如一个特定的模板作为
<xsl:template match="rate[code]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
或者如果您不想更改任何内容,那么身份转换模板就足以完成这项工作,例如
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
我还会考虑在自己的文件中定义映射并从该文件中提取值,至少使用 XSLT 2.0 你可以这样做,例如
<xsl:param name="mapping-url" select="'mapping.xml'"/>
<xsl:variable name="mapping-doc" select="document($mapping-url)"/>
然后文件定义例如
<mapping>
<map in="AB" out="YZ"/>
<map in="CD" out="WX"/>
<map in="EF" out="QR"/>
</mapping>
然后你可以使用例如
<xsl:key name="mk" match="mapping/map" use="@in"/>
<xsl:template match="rate/code[key('mk', ., $mapping-doc)]">
<xsl:copy>
<xsl:value-of select="key('mk', ., $mapping-doc)/@out"/>
</xsl:copy>
</xsl:template>
而不是为您需要映射的每个值编写模板。