- PR -

call-templateでのwith paramの指定方法の (xsl) 質問です

1
投稿者投稿内容
student
会議室デビュー日: 2005/12/27
投稿数: 2
投稿日時: 2006-01-01 19:56
xslスタイルシートのcall-template でparamを指定して
呼び出す方法についての質問です。

javascriptで動作する<a>タグの中に<img>タグを埋めこんだ"mylink"テンプレートを作成し
表のセルに call-templateで 呼び出すコードを書いたのですが
imgタグだけでなく、textなどを埋めこんで呼び出せるように変更したいのです。

変更前のxsl(呼び出し部分)
<tr><td style="border-width: 1; border-color: #3300FF; width: 100;">
<xsl:call-template name="mylink"/>
</td>
</tr>


<xsl:template name="mylink">//変更前のmylinkテンプレート
<xsl:element name="a">
<xsl:attribute name="href">
</xsl:attribute>
<xsl:attribute name="ing">
<xsl:value-of select="@no" />
</xsl:attribute>
<xsl:attribute name="onclick">
window.open(this.ing + '.html','newwindow');return false;
</xsl:attribute>

<xsl:element name="img">//埋めこんだimgタグ(注1)
<xsl:attribute name="src">
<xsl:value-of select="concat('image/',iname,'.jpg')" />
</xsl:attribute>
</xsl:element>//imgタグの終了(注2)
</xsl:element>
</xsl:template>

この状態だと、うまく作動するのですが
注1から注2の部分を、paramで指定して呼び出すことで、imgだけでなく
textなども呼び出せるようにmylinkテンプレートを改良したいのです。

変更後のxsl(呼び出し側部分、この場合は上と同じimgを指定して呼び出したいのです)
<tr><td style="border-width: 1; border-color: #3300FF; width: 100;">
<xsl:call-template name="mylink">

<xsl:with-param name="content">//パラメータを指定している部分(注3)
   <xsl:element name="img">
   <xsl:attribute name="src">
   <xsl:value-of select="concat('image/',iname,'.jpg')" />
   </xsl:attribute>
   </xsl:element>
   </xsl:with-param>//パラメーターの指定終了(注4)
  </xsl:call-template>
</td>
</tr>


<xsl:template name="mylink">//変更後のmylinkテンプレート部分
<xsl:param name="content">
<xsl:element name="a">
<xsl:attribute name="href">
</xsl:attribute>
<xsl:attribute name="ing">
<xsl:value-of select="@no" />
</xsl:attribute>
<xsl:attribute name="onclick">
window.open(this.ing + '.html','newwindow');return false;
</xsl:attribute>
<xsl:value-of select="$content">// この部分がわかりません(注5)
</xsl:element>
</xsl:param>
</xsl:template>

色々上記以外にも、注3から注5までの部分を変えて試して見たのですが
エラーになってしまいます。

注3から注4までのparamの指定で、上のように<img>から</img>のような
ひとまとまりのタグを指定することはできないのでしょうか?
それとも注5のように value-ofで、
パラメーターを呼び出すのがこの場合は間違っているのでしょうか?
他にいい方法などがあれば、アドバイスよろしくお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-01-01 21:02
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#value-of
xsl:value-of エレメントをインスタンス化すると、結果ツリー内にテキストノードが生成される。
必須の select アトリビュートは、式である。
この式を評価すると、string 関数の呼び出しを実行したかのように、結果のオブジェクトを文字列に変換する。
param値は 文字列型ではない。<<<<<<<< ● ● ●

http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#copy-of
xsl:copy-of エレメントを使用すると、結果ツリーフラグメントを結果ツリーに挿入できる。
この場合、xsl:value-of を使用する場合のように ([7.6.1 xsl:value-of を用いたテキストの生成] を参照)、最初に文字列に変換する必要はない。

-------------
7.1.1 リテラル結果エレメント
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#literal-result-element
の書き方のほうが行数少なく読みやすいです
student
会議室デビュー日: 2005/12/27
投稿数: 2
投稿日時: 2006-01-02 02:38
MMXさん、アドバイスありがとうございます。

せっかく示していただいた仕様書のほうは、まだまだ理解不足であり
読んでもほとんどわからなかったのですが、
value-ofではなく、複数のタグを含んだ全体をpalamに指定して
呼び出す場合は、copy-ofにすべきということなのだろうと
試してなんとかできました。

おそらく、まだ無駄の多いコードになっているのでしょうし
>7.1.1 リテラル結果エレメント
>http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116->jpn.htm#literal-result-element
>の書き方のほうが行数少なく読みやすいです

この書き方も理解できていないのですが、少しずつ勉強していきますので
今後とも宜しくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)