- PR -

XSLで変数を代入する方法

投稿者投稿内容
gappy
会議室デビュー日: 2001/10/30
投稿数: 7
お住まい・勤務地: 東京都中央区
投稿日時: 2001-10-31 00:28
 初めて投稿します。
XSLにおいて、変数の代入がうまくいかずに悩んでいます。
具体的には以下のような場合です。主な処理だけ書きます。

<xsl:param name="n1" select="''"/>

<xsl:if test="〜">
<xsl:variable name="n1" select="'あ'"/>
<xsl:value-of select="$n1">       ・・・@
</xsl:if>
<xsl:value-of select="$n1">       ・・・A

このように@とAで「n1」を表示させたところ、@では「あ」が表示される
のに対し、Aでは何も表示されません。
 <xsl:if>や<xsl:when>の下で変数を代入すると、代入された変数は、<xsl:if>
や<xsl:when>の中でしか有効でないのでしょうか。
 <xsl:if>や<xsl:when>の中で代入した変数を<xsl:if>や<xsl:when>の外で
も使用したい場合にはどのようにすればよいのでしょうか。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-10-31 10:38
ローカル変数は宣言をしたブロック内だけで有効です。
評価をした結果をより上位の変数にバインドするようにしてはどうでしょう。

<xsl:variable name="x">
if文で評価した結果をここに書く
</xsl:variable>
変数xを利用
gappy
会議室デビュー日: 2001/10/30
投稿数: 7
お住まい・勤務地: 東京都中央区
投稿日時: 2001-10-31 13:19
mikiさん、アドバイスありがとうございます。早速試してみたところ、

<xsl:variable name="n1">
<xsl:if test="〜">
<xsl:value-of name="n1" select="'あ'"/>
</xsl:if>
</xsl:variable>
<xsl:value-of select="n1"/>

で、表示に成功しました。ありがとうございます。
 (ただ、以下のような場合はエラーになってしまいます。)←誤記述です。
エラーにはならず、下の文章のようになります。

(本来は<xsl:choose>での処理かもしれませんが、ここでは、<xsl:if>を使用しています。)

<xsl:variable name="n1">
<xsl:if test="〜"> ・・・@
<xsl:value-of name="n1" select="'あ'"/> ・・・A
</xsl:if>
<xsl:if test="…"> ・・・B
<xsl:value-of name="n1" select="'い'"/>
</xsl:if>
</xsl:variable>
<xsl:value-of select="n1"/>

@が真のときは「あ」が表示されるものの、Bが真の際には何も表示されません。
このような場合は、上記のような処理とはまた別に処理を考えないとならないの
でしょうか。

また、Aにおいて、指定したい変数が2つある場合、

<xsl:if test="〜">
<xsl:value-of name="n1" select="'あ'"/>
<xsl:value-of name="n2" select="'え'"/>
</xsl:if>

のような場合に2変数とも、より上位の変数として扱いたい場合の手段も模索中です
ので、何かアドバイスがありましたらお願い致します。


[ メッセージ編集済み 編集者: gappy 編集日時 2001-10-31 17:34 ]

[ メッセージ編集済み 編集者: gappy 編集日時 2001-11-01 09:49 ]

[ メッセージ編集済み 編集者: gappy 編集日時 2001-11-01 09:56 ]
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-10-31 14:39
前半のエラーについてはわかりませんが、後半の「2変数ともより上位の変数として扱いたい場合の手段」についてはXPathで切り出せるかもしれません。

<xsl:variable name="x">
<first><xsl:value-of select="value1"/></first>
<second><xsl:value-of select="value2"/></second>
</xsl:variable>

<xsl:value-of select="$x/first"/>

でも、これをmsxml3.0で試したら$xの参照でエラーになってしまいました。
saxonを使うと意図したように動いたのになぁ。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2001-11-01 09:23
<xsl:value-of select="$x/first"/>
XSLT1.1(2.0)の書き方では? MSXMLでは 1.0 の書き方のハズです。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
version="1.0">
拡張関数の名前空間接頭辞を導入して、
<xsl:value-of select="msxsl:node-set($x)/first"/>

node-set関数が明示的に必要では
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-11-01 09:47
>XSLT1.1(2.0)の書き方では? MSXMLでは 1.0 の書き方のハズです。
MMXさん、ありがとうございます。
ご指摘の通り、サポートしているXSLTのバージョンを確認していませんでした。
基本的なミスですね。
gappy
会議室デビュー日: 2001/10/30
投稿数: 7
お住まい・勤務地: 東京都中央区
投稿日時: 2001-11-01 11:40
 mikiさん、MMXさん、色々とアドバイスをありがとうございました。
恥ずかしながら、一つ目がうまくいかなかった理由が判明しました。

<xsl:variable name="d1">
 <xsl:if test="〜">
  <xsl:value-of name="d1" select="あ"/>・・・@
 </xsl:if>
</xsl:variable>

 とすべきところを、@の部分が「variable」になっており、うまくいかなかったようです。
気づいた時は、穴に入りたい気分でした。

 それと、二つ目についてですが、今回やりたい処理では、場合分けが非常にたくさん存在するので、冗長にはなってしまうものの、

<xsl:variable name="d1">
 <xsl:if test="〜">
  <xsl:value-of name="d1" select="あ"/>
 </xsl:if>
 <xsl:if test="…">
  <xsl:value-of name="d1" select="い"/>
 </xsl:if>
   ・
   ・
</xsl:variable>
<xsl:value-of select="$d1">

<xsl:variable name="d2">
 <xsl:if test="〜">
  <xsl:value-of name="d2" select="あ"/>
 </xsl:if>
 <xsl:if test="…">
  <xsl:value-of name="d2" select="い"/>
 </xsl:if>
   ・
   ・
</xsl:variable>
<xsl:value-of select="$d2">

のように、2回に分けて処理を行うことで、とりあえずは回避しています。
 ですが、これだとすごく無駄が多いので、アドバイスを考慮してもう一度考え直してみたいと思います。

[ メッセージ編集済み 編集者: gappy 編集日時 2001-11-01 11:43 ]

[ メッセージ編集済み 編集者: gappy 編集日時 2001-11-01 11:45 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2001-11-01 15:31
<xsl:value-of name="d1" select="あ"/>
name は不要な属性で無視されます、要削除

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