XSLT基礎編: xsl:copy-ofで元のXMLデータの要素・属性をコピーする

2005年03月06日(日)更新


元のXMLデータ要素の利用

たけち: 今回は、xsl:copy-of要素を勉強しよう。

さらら: xsl:copy-of? なにかをコピーするためのxslt要素なのね、きっと。

たけち: そうそう。xsl:copy-ofは、変換前のXMLデータの要素を、その子要素や属性を含めて、そのまま変換後のXMLデータやHTMLデータなどの要素として出力するときに便利なんだよ。

さらら: へぇ〜。そういうことができるんだ。そうすると、XSLTスタイルシートが簡単に書けそうね。

たけち: そうだね。でも、変換前の要素・属性をそのまま出力するってことは、変換後の要素・属性として意味のあるものが、元のXMLデータに含まれていることが必要だよね。

さらら: あっ、なるほど。そうよね。

たけち: じゃあまず、xsl:copy-ofの書き方をみておこうね。次に載せておくね。

xsl:copy-ofの書き方
■xsl:copy-ofの書き方


サンプルXMLデータ: flowers.xml

さらら: xsl:copy-of要素の書き方は簡単そうね。でも、具体的にはどう使ったらいいのかしら。。

たけち: 一言で言うと、出力したい箇所にxsl:copy-ofを書いて、コピーしたい変換前のXMLデータの要素を指定すればいいんだよ。それを簡単な例で確認してみようね。

さらら: うん。お願いね。

たけち: 今回は、これまでと違った例でやってみるね。

【flights.xml】

【flights.xml】 XMLファイル: フライトスケジュールのデータ

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="flights.xsl"?>
<flights>

<route airline="BOB" from="羽田" to="出雲">

<table border="1" width="300">
<tr><th bgcolor="silver">便名</th>
<th bgcolor="silver">発時刻</th>
<th bgcolor="silver">着時刻</th></tr>
<tr><td>1271</td><td align="right">8:00</td><td align="right">9:30</td></tr>
<tr><td>1273</td><td align="right">10:25</td><td align="right">11:55</td></tr>
<tr><td>1275</td><td align="right">13:15</td><td align="right">14:45</td></tr>
<tr><td>1277</td><td align="right">16:55</td><td align="right">18:25</td></tr>
<tr><td>1279</td><td align="right">18:30</td><td align="right">20:00</td></tr>
</table>

</route>

</flights>

さらら: 万葉集のデータじゃないのね。

たけち: うん。今回の例は、フライトスケジュールの例だよ。

さらら: 羽田から出雲行きね! 便名毎に発時刻と着時刻が載っているのね。

たけち: このXMLデータを良く見てごらん。table要素は、htmlのtable要素と同じように書かれているよね。

さらら: ほんと。。。。あっ、これを変換後のHTMLデータにコピーして、そのまま使おうってことね。

たけち: そうなんだ。次の図のようなイメージだね。

xsl:copy-ofの使用例
■xsl:copy-ofの使用例(XMLデータのtable要素以下をそのままコピー)


xsl:copy-ofを使ったスタイルシート例

さらら: ここでは、丸ごとtable要素をコピーするのね。

たけち: うん。ただ、元のXMLデータに表示用の属性として、bgcolor="silver"なんてのがあるけど、実際にはないほうがいいんだよね。ここでは、サンプルを簡単にするために入れてあるから、注意してね。

さらら: えぇ、わかったわ。

たけち: じゃあ。xsl:copy-ofを使ったスタイルシート例を載せるね。

【flights.xslt】

【flights.xslt】 XSLTファイル: xsl:copy-of要素を含んでいます

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns="http://www.w3.org/1999/xhtml">

<xsl:template match="/">
   <html>
   <head>
   <title>XSLスタイルシートサンプル xsl:copy-of</title>
   </head>

   <head><title>xsl:copy-of使用例: ソースXMLデータのtable要素をコピー</title></head>
   <body>
      <p>■xsl:copy-of使用例: ソースXMLデータのtable要素をコピー</p>
      <xsl:apply-templates />

         <p align="right">以上です。</p>
   </body>
   </html>
</xsl:template>

<xsl:template match="route">
   <p>【航空会社: <xsl:value-of select="@airline" /> 
      <xsl:value-of select="@from" />発、<xsl:value-of select="@to" />着】</p>

   <!-- table要素以下をコピー出力します。 -->
   <xsl:copy-of select="table" />

</xsl:template>

</xsl:stylesheet>


flights.xmlをIEで表示する

さらら: route要素の下の"table"要素をxsl:copy-of要素でまるごとコピーしているのね。

たけち: そうだね。じゃあ、実際にIEで表示してみようね。

さらら: は〜い。

フライトデータのXMLファイル flights.xml(上記説明のXSL適用)

flights.xmlをIEで表示
■flights.xmlをIEで表示

さらら: なるほどね。XMLデータの要素を考えるときに特別な理由がないときは、HTMLなんかと同じにしておくと便利なのね。

たけち: そうだね。じゃあ、今回はここまでね。

さらら: はい。ありがとう! 

→次回はxsl:copyです。・・・ (^ ^;