1

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

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

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

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

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

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

谢谢

4

1 回答 1

0

使用推送式、基于模板的处理,您应该能够编写模板来进行映射,例如

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

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

于 2012-08-06T16:00:13.987 回答