web-dev-qa-db-ja.com

xslのテンプレートの「モード」の例を教えてください。

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

modeの意味は何ですか?多くのリソースを検索しましたが、その例は見つかりませんでした。だから誰も例を使って説明できますか?

69
Venkat

テンプレートに名前とモードの両方を指定しても意味がありません

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つの列を含む3つのtr(行)に数字が表示されることです(最後の行の例外を除く):

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

この変換では、位置が3*k +1(ここでnumは整数)で表現できないk要素は、空のボディを持つテンプレートと一致するため、isn処理されません。

ただし、行のセルを形成するすべてのnum要素を処理します。この目的のために、xslt命令を使用して処理します。

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

つまり、「通常は適用される(モードなしで)選択されたノードテンプレートには適用せず、copyモードにあるテンプレートを適用します」

したがって、選択したnum要素を無視しませんが、copyモードで処理していますで、行のtdを作成しています。

テンプレートルール:

<xsl:template match="num"/>

位置が3*k +1として表現できないnumノードの文字列値を出力するxslt組み込みテンプレート(デフォルトの処理)をオーバーライドする必要があります。

つまり、これらのノードは両方のテンプレートによって処理されます

<xsl:template match="num"/>

そして

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

したがって、必要な結果が得られます。

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

84
<xsl:apply-templates select="phone" />
<xsl:apply-templates select="phone" mode="accountNumber"/>
<xsl:template match="phone">
      <TD>A</TD>
</xsl:template>
<xsl:template match="phone" mode="accountNumber">
      <TD>B</TD>
</xsl:template>

ここに簡単な例をリンクしてください: https://msdn.Microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

6
Andrew Xie