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

これらのレート コードがさまざまな場所で xml 全体に表示される可能性があること、および xslt がこのマッピングだけでなく多くのことを行っていることをもう一度念頭に置いて、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 に答える