XML文書の相互取り込み

 あるXML文書の内容を、他のXML文書の中に取り込みたいと思う場合があります。 例えば、

  • XML文書にデフォルトで関連付けるXSLスタイルシートは、 <?xml-stylesheet ...> 擬似命令で1文書につき1ファイルしか指定できないが、 同じ文書を条件によって異なるスタイルシートでレンダリングしたい場合がある。
  • 同じ構成の複数のXML文書(日記、事務記録など) を1つのHTML文書にレンダリングしたい場合がある。
などなどです。 このページの方法はその解決策の1つでしかありませんが、 一応役にはたつと思います。

 ここで載せるサンプルは、 業務システムの臨時処理、トラブルなどを記録する作業ログ、 といった感じのものから項目を抜粋したものです。 まずそのログである、XML文書(uylog.xml)です。

<?xml version="1.0" encoding="euc-jp" ?>

<document>
<title>作業履歴</title>

<entry>
<entry-date>2003/03/06</entry-date>
<system>勤務管理システム</system>
<status>対応完了</status>
<target>PG0032</target>
<description>
記録…(省略されました)
</description>
</entry>

<entry>
<entry-date>2003/03/06</entry-date>
<system>会議室予約システム</system>
<status>対応完了</status>
<target>PG0397</target>
<description>
記録…(省略されました)
</description>
</entry>

</document>

 上のXML文書には、<?xml-stylesheet ...> 擬似命令がありません。 このファイルは直接XSLT変換されるのではなく、他のXML文書に取り込まれるデータになります。 というわけで、その取り込む側のXML文書です。 データの内容をそっくりコピーする、という意味で 「uylog-copy.xml」と名づけました。

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

<document>
<file href="./uylog.xml"/>
</document>

 XSLスタイルシート「uylog-copy.xsl」を指定している以外は、特に何もしていません。 ここのdocumentやfileというタグの名前や、hrefという属性の名前は、 次に挙げるXSLスタイルシートの中のそれと対応づいていれば、どんな名前でも構いません。 このようなファイルを増殖させて、XSLスタイルシートの指定部を変更すれば、 別のシートでレンダリングさせることも簡単にできます。

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

<xsl:output method="html" encoding="Shift_JIS" version="1.0"/>

<xsl:template match="/document">
<html><body>
<xsl:apply-templates select="file"/>
</body></html>
</xsl:template>

<xsl:template match="/document/file">
<xsl:variable name="doc" select='document(@href)' />
<xsl:variable name="xmluri"><xsl:value-of select="@href"/></xsl:variable>

  <table border="1">
  <tr bgcolor="#cccccc"><td>発生日</td><td>システム</td><td>対象処理</td></tr>
  <xsl:for-each select="$doc//document/entry">
    <tr>
    <td><xsl:value-of select="entry-date"/></td>
    <td><xsl:value-of select="system"/></td>
    <td><xsl:value-of select="target"/></td>
    </tr>
  </xsl:for-each>
  </table>
</xsl:template>

</xsl:stylesheet>

 最後に、XSLスタイルシート「uylog-copy.xsl」です。 document関数を使って、 file要素のhref属性として渡されたパスをXMLドキュメントとして取り込んでいます。 file要素に対してapply-templateしているので、 XML文書の方でfileタグを複数並べれば、 複数のXML文書を順番にレンダリングして1つのHTML文書として出力することもできます。

XML Top

(first uploaded 2003/03/07 last updated 2003/03/07, URANO398 - KQ TAURA)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!