1. ホーム
  2. xslt

xslのテンプレートの "mode "の例を教えてください。

2023-12-05 15:23:08

質問

<xsl:template name="temp_name" mode="mode">

の意味は何ですか? mode ? 私は多くのリソースを検索しましたが、私はそれのための例を見つけることができませんでした。だから、誰かが例で説明することができますか?

どのように解決するのですか?

テンプレートに名前とモードの両方を与えるのはあまり意味がありません。 .

name 属性はテンプレートを完全に識別し、同じ名前で異なるモードを持つ2つのテンプレートを存在させることはできません。

mode 属性は、同じノードを異なるモードを使って複数回処理することを可能にします。 .

以下は短い例です。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="num[position() mod 3 = 1]">
  <tr>
    <xsl:apply-templates mode="copy" select=
     ". | following-sibling::*[not(position() >2)]"/>
  </tr>
 </xsl:template>

 <xsl:template match="*" mode="copy">
  <td><xsl:value-of select="."/></td>
 </xsl:template>

 <xsl:template match="num"/>
</xsl:stylesheet>

この変換が次のXML文書に適用された場合 :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

その結果、数字が3つで表示されます。 tr (行) に表示され、それぞれが3つの列を含んでいます。 (で表示されます(最後の行は例外です)。

<tr>
   <td>01</td>
   <td>02</td>
   <td>03</td>
</tr>
<tr>
   <td>04</td>
   <td>05</td>
   <td>06</td>
</tr>
<tr>
   <td>07</td>
   <td>08</td>
   <td>09</td>
</tr>
<tr>
   <td>10</td>
</tr>

この変換では、任意の num という形で表現できない位置を持つ要素は 3*k +1 (ここで k は整数) の場合、空のボディを持つテンプレートにマッチしてしまい、処理されません。

しかし、我々はすべての num 要素を処理したい。このため、xslt命令を使って処理しています。

<xsl:apply-templates mode="copy" select=
 ". | following-sibling::*[not(position() >2)]"/>

これは次のような意味です: "選択されたノードに通常適用されるはずのテンプレートを適用せず(no modeの場合)、テンプレートに含まれる copy モードであるテンプレートを適用します。

このように、選択された num 要素を無視するのではなく、それらを copy モード を生成しており td の行を作成しています。

テンプレートルールの

<xsl:template match="num"/>

は xslt 組み込みのテンプレート(デフォルトの処理)を上書きするために必要で、そうしないと num として表現できない位置のノード 3*k +1 として表現できないノードが出力されます。

つまり、これらのノードは両方のテンプレートで処理され :

<xsl:template match="num"/>

<xsl:apply-templates mode="copy" select=
 ". | following-sibling::*[not(position() >2)]"/>

となり、望みの結果が得られます。

これらのテンプレートがどのように適用されるかを見るために、優れた XSLT デバッガでステップスルーすることは有益でしょう。 .