複数XML文書の利用 3

document()関数を利用し、3つのXML文書の全内容を1つの変数に格納する。この変数から必要なデータを取り出す。

[サンプルXML文書を表示](下のフレームに)

XMLソース(document03.xml)

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="document03.xsl"?>
<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>
<end>以上です(2004/9/2)</end>
</root>

XMLソース(../kabu2.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="6503">三菱電機</name><end>530</end><total>2951</total></kabu>
<kabu><name code="7751">キヤノン</name><end>5130</end><total>1820</total></kabu>
<kabu><name code="7752">リコー</name><end>2095</end><total>1239</total></kabu>
<kabu><name code="6971">京セラ</name><end>7760</end><total>368</total></kabu>
<kabu><name code="6724">セイコーエプソン</name><end>4400</end><total>546</total></kabu>
<kabu><name code="6773">パイオニア</name><end>2350</end><total>436</total></kabu>
</data>
<end>以上です(2004/9/2)</end>
</root>

XMLソース(../kabu3.xml)

<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<title>銘柄企業情報</title>
<info>2004/8/20現在</info>
<data>
<name code="6752" 業種分類="電気機器">松下電器産業
<本社>大阪府門真市大字門真1006</本社><代表者>中村邦夫</代表者>
<設立日>1935年12月15日</設立日><従業員数>51340人</従業員数>
<決算>3月末日</決算><中間配当>9月</中間配当><単元株数>1000株</単元株数>
<特色>総合家電首位。デジタル家電・半導体主力に業績回復途上。04年度から松下電工を連結子会社に</特色>
</name>

・・・・(省略)・・・・
<name code="6773" 業種分類="電気機器">パイオニア
<本社>東京都目黒区目黒1-4-1</本社><代表者>伊藤周男</代表者>
<設立日>1947年5月8日</設立日><従業員数>5321人</従業員数>
<決算>3月末日</決算><中間配当>9月</中間配当><単元株数>100株</単元株数>
<特色>カー音響・ナビ、記録型DVD、プラズマが大黒柱。光ディスク関連の特許収入も収益源</特色>
</name>
</data>
<etc>データは「Yahoo!ファイナンス(http://quote.yahoo.co.jp/)」より(04/8/22)</etc>
</root>

XSLソース(document03.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="contents" select="/root |
document('../kabu2.xml')/root | document('../kabu3.xml')/root" />


<xsl:template match="/">
<center><H3><xsl:value-of select="root/title"/></H3></center>
<xsl:apply-templates select="root/data"/>
</xsl:template>

<xsl:template match="data">
●本社に"東京都"を含まないデータを抽出する
<table border="1">
<tr style="color:green"><td>会社名</td><td>コード番号</td><td>本社所在地</td>
<td>終値(円)</td><td>出来高(千株)</td></tr>
<xsl:for-each select="$contents/data/name">
<xsl:if test="not(contains(本社,'東京都'))">
<xsl:variable name="code" select="@code" />
<tr>
<td><xsl:value-of select="text()"/></td>
<td style="text-align:center"><xsl:value-of select="$code"/></td>
<td style="font-weight:bold"><xsl:value-of select="本社"/></td>
<xsl:for-each select="$contents/data/kabu">
<xsl:if test="name/@code=$code">
<td style="text-align:right"><xsl:value-of select="end"/></td>
<td style="text-align:right"><xsl:value-of select="total"/></td>
</xsl:if>
</xsl:for-each>
</tr>
</xsl:if>
</xsl:for-each>
</table>
<br/><br/>
●終値が2000円以上のデータを抽出し、終値の降順で一覧表示
<table border="1">
<tr style="color:blue"><td>会社名</td><td>終値(円)</td><td>代表者</td>
<td>設立日</td><td>従業員数</td></tr>
<xsl:for-each select="$contents/data/kabu">
<xsl:sort select="end" data-type="number" order="descending"/>
<xsl:if test="end &gt;= 2000">
<xsl:variable name="code" select="name/@code" />
<tr>
<td><xsl:value-of select="name"/></td>
<td style="text-align:right;font-weight:bold"><xsl:value-of select="end"/></td>
<xsl:for-each select="$contents/data/name">
<xsl:if test="@code=$code">
<td><xsl:value-of select="代表者"/></td>
<td><xsl:value-of select="設立日"/></td>
<td><xsl:value-of select="従業員数"/></td>
</xsl:if>
</xsl:for-each>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

end(04/9/2)