複数XML文書の利用:document()関数

■XSLファイル内で複数XML文書の利用・・・document(引数)関数

・XSLT組み込み関数で、引数で指定した別のXML文書を読み込み参照する。
・引数がURIとなる文字列の場合、そのURIを読み込み参照する(引用符("や')で囲う)。引数にnode又はnode-setを指定した場合、その値がURIとみなされ参照される。
・戻り値はそのXML文書に含まれるノードセット。

■(注意) document()関数を使う場合、コンテキストノードの位置に注意すること。

<xsl:for-each select="kabu">   ・・・(a)
  ・・・
<td><xsl:value-of select="document(../@補足)/root/data/company[@name=$company_name]/本社所在地"/></td>   ・・・(b)
</xsl:for-each>

(a)でのコンテキストノードはdocument01.xml文書の「root/data/kabu」。繰り返し処理内の(b)ではコンテキストノードがdocument01x.xml文書内に移動する。繰り返し処理で(a)に戻ると"kabu"が見つからないことになる。そこで再度、コンテキストノードをdocument01.xmlに戻し処理を続行する必要がある。だから(a)は、<xsl:for-each select="kabu">ではなく
 <xsl:for-each select="document('document01.xml')/root/data/kabu">
としなければならない。

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

document01.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="document01.xsl"?>
<root>
<title>2003年11月05日の東証株式第一部情報</title>
<info><name>銘柄</name><end>終値(円)</end><total>出来高(千株)</total></info>
<data 補足="document01x.xml">
<kabu><name code="6752">松下</name><end>1529</end><total>12302</total></kabu>
<kabu><name code="6753">シャープ</name><end>1786</end><total>3964</total></kabu>
<kabu><name code="6758">ソニー</name><end>4030</end><total>8220</total></kabu>
<kabu><name code="6764">三洋</name><end>516</end><total>7551</total></kabu>
<kabu><name code="6501">日立</name><end>692</end><total>21896</total></kabu>
<kabu><name code="6502">東芝</name><end>440</end><total>17832</total></kabu>
<kabu><name code="6701">NEC</name><end>1027</end><total>19229</total></kabu>
<kabu><name code="6702">富士通</name><end>708</end><total>16634</total></kabu> </data>
</root>

document01x.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<title>企業情報</title>
<info>2004/7/27現在</info>
<data>
<company name="松下" code="6752">
<本社所在地>大阪府門真市大字門真1006</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="シャープ" code="6753">
<本社所在地>大阪市阿倍野区長池町22-22</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="ソニー" code="6758">
<本社所在地>東京都品川区北品川6-7-35</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>100株</単元株数></company>
<company name="三洋" code="6764">
<本社所在地>大阪府守口市京阪本通2-5-5</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="日立" code="6501">
<本社所在地>東京都千代田区神田駿河台4-6</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="東芝" code="6502">
<本社所在地>東京都港区芝浦1-1-1</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="NEC" code="6701">
<本社所在地>東京都港区芝5-7-1</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
<company name="富士通" code="6702">
<本社所在地>東京都港区東新橋1-5-2</本社所在地><決算>3月末日</決算>
<中間配当>9月</中間配当><単元株数>1000株</単元株数></company>
</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:template match="/">
<center><H3><xsl:value-of select="root/title"/></H3></center>
<xsl:apply-templates select="root/data"/>
</xsl:template>

<xsl:template match="data">
<xsl:value-of select="kabu/name"/>・・・
<xsl:value-of select="../info/end"/><xsl:value-of select="kabu/end"/>、
<xsl:value-of select="local-name(document('document01x.xml')/root/data/company/本社所在地)"/>:
<xsl:value-of select="document(@補足)/root/data/company/本社所在地"/><!--引数がnode-->
<hr/>
<table border="1">
<tr style="color:red">
<th><xsl:value-of select="../info/name"/></th>
<th>コード番号</th>
<th><xsl:value-of select="local-name(document('document01x.xml')/root/data/company/本社所在地)"/></th>
<th><xsl:value-of select="local-name(document(@補足)/root/data/company/単元株数)"/></th>
</tr>
<xsl:for-each select="document('document01.xml')/root/data/kabu"><!--■(注意) 参照-->
<xsl:variable name="company_name" select="name" />
<tr>
<th><xsl:value-of select="$company_name"/></th>
<td style="text-align: center"><xsl:value-of select="name/@code"/></td>
<td><xsl:value-of select="document(../@補足)/root/data/company[@name=$company_name]/本社所在地"/></td>
<td><xsl:value-of select="document(../@補足)/root/data/company[@name=$company_name]/単元株数"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

end(04/7/30)