通过XSLT映射XML值

时间:2012-08-06 15:23:53

标签: xml xslt map

查看了所有xslt映射问题,但似乎无法找到以下具体案例的帮助:

我有一个xml文件,例如具有以下值

<rate>
<code>AB</code>
<code>CD</code>
<code>EF</code>
</rate>

这些代码出现在我的xml中,我通过xslt输出。 但是,每当xslt输出这些特定代码时,它需要首先将它们映射到新值 例如,映射如下:

Code AB -> YZ
Code CD -> WX
Code EF -> QR

请有人告诉我是否以及如何在整个xslt中执行此映射时再次考虑到这些速率代码可以在各个位置出现在整个xml中,并且xslt不仅仅是这个映射

由于

1 个答案:

答案 0 :(得分:0)

使用push-style,基于模板的处理,您应该能够编写模板来进行映射,例如

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

而不是为您需要映射的每个值编写模板。