<xsl:variable>を使い変数を定義できる。しかしXMLでの変数は、他のプログラム言語のように値の変更が簡単にはいかない。むしろ変数値は変更できないもの、と考えた方がいいかも。その変数値を、DOMを使って強引に書き換える。
まず、XSLTから<xsl:variable>のNode、又はNodeリストを取得。取得したNodeのtext値、又はselect属性値を書き換えすればよい。
[サンプルHTML文書を表示](下のフレームに)
HTMLソース
<SCRIPT language="JavaScript"><!--
var xmlobj; //読み込むXML文書
var xslobj; //読み込むXSLTファイル
var pos = 0; //選択されたラジオボタンのindex番号(0から開始)
function init(){ //ページ読み込み時の初期化
xmlobj=new ActiveXObject("MSXML2.DOMDocument");
xmlobj.async=false;
xmlobj.load("../kabu1.xml");
xslobj=new ActiveXObject("MSXML2.DOMDocument");
xslobj.async=false;
xslobj.load("var04.xsl");
var str = "";
str = xmlobj.transformNode(xslobj); //XML文書にXSLTを適用
dv.innerHTML = str; //ページに表示
midasi[0].checked = true; //ラジオボタンにチェックを付ける(デフォルトで"終値")
}
function Change(n){ //「会社名」選択リストで選択された場合
//変数<xsl:varriable>でselect属性のNodeリストを取得
var seNodes = xslobj.selectNodes("//xsl:variable/@select");
//取得したNodeリストの1番目の属性値を書き換える
seNodes.item(0).text = "root/data/kabu[" + n + "]/name";
//選択されたラジオボタンによって、2番目Nodeリストのselect属性値を書き換える
if(pos == 0)seNodes.item(1).text = "root/data/kabu[name=$var1]/end";
else if(pos == 1)seNodes.item(1).text = "root/data/kabu[name=$var1]/total";
else if(pos == 2)seNodes.item(1).text = "root/data/kabu[name=$var1]/name/@code";
dv.innerHTML = xmlobj.transformNode(xslobj); //ページに表示
midasi[pos].checked = true; //選択されたラジオボタンにチェックを付ける
}
function itemChange(i,n){
var varNodes = xslobj.selectNodes("//xsl:variable");//変数<xsl:varriable>のNodeリストを取得(3個あり)
varNodes.item(1).text = i; //2番目の変数値を書き換え
pos = n; //選択されたラジオボタンのindex番号を格納
}
//--></SCRIPT>
</HEAD>
<BODY style="font:12px 'MS 明朝'" onload="init()">
<P>会社名を選択して下さい。右のオプションで指定した項目が表示されます。 </P>
<div id="dv"></div>
XMLソース
<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<title>2004年8月20日の東証株式第一部情報</title>
<info><name>銘柄</name><end>終値(円)</end><total>出来高(千株)</total></info>
<data>
<kabu><name code="6752">松下電器産業</name><end>1436</end><total>3362</total></kabu>
<kabu><name code="6753">シャープ</name><end>1516</end><total>9077</total></kabu>
<kabu><name code="6758">ソニー</name><end>3700</end><total>3840</total></kabu>
<kabu><name code="6764">三洋電機</name><end>386</end><total>9712</total></kabu>
<kabu><name code="6501">日立製作所</name><end>667</end><total>8939</total></kabu>
<kabu><name code="6502">東芝</name><end>406</end><total>16041</total></kabu>
<kabu><name code="6701">NEC</name><end>702</end><total>8493</total></kabu>
<kabu><name code="6702">富士通</name><end>671</end><total>3737</total></kabu>
</data>
</root>
XSLソース
<?xml version="1.0" encoding="Shift_Jis"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Shift_JIS"/>
<xsl:variable name="var1" select="root/data/kabu[1]/name" />
<xsl:variable name="var2">終値(円)</xsl:variable>
<xsl:variable name="var3" select="root/data/kabu[name=$var1]/end" />
<xsl:template match="/">
<xsl:apply-templates select="root/data"/>
</xsl:template>
<xsl:template match="data">
<select name="meigara" onChange="Change(this.value)">
<xsl:for-each select="kabu">
<xsl:element name="option">
<xsl:attribute name="value"><xsl:value-of select="position()"/></xsl:attribute>
<xsl:if test="name=$var1">
<xsl:attribute name="selected">true</xsl:attribute>
</xsl:if>
<xsl:value-of select="name"/>
</xsl:element>
</xsl:for-each>
</select>
<input type="radio" name="midasi" value="終値(円)" onclick="itemChange(this.value,0)">終値</input>
<input type="radio" name="midasi" value="出来高(千株)" onclick="itemChange(this.value,1)">出来高</input>
<input type="radio" name="midasi" value="コード番号" onclick="itemChange(this.value,2)">コード番号</input>
<hr/>
<table border="1" cellpadding="5">
<tr><td>銘柄名</td><td><xsl:value-of select="$var2"/></td></tr>
<tr><td><xsl:value-of select="$var1"/>
</td>
<td style="text-align:right"><xsl:value-of select="$var3"/></td></tr>
</table>(<xsl:value-of select="../title"/>)
</xsl:template>
</xsl:stylesheet>
end(新規:04/11/26) [Home]