C-9 XSL (2)

データ項目をより詳しく設定した

という XML 文書も、XSL を使って HTML へと変換して表示させることが出来ます。

【練習問題】

この XML 文書に次の1行を書き加えて下さい。

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="data.xsl"?>
<メンバーデータ>
  <団体名>青空テニスクラブ</団体名>
  <メンバー>
    <名前>佐藤一郎</名前>
    <出身地>石川県</出身地>
    <電話番号>090-1234-5678</電話番号>
  </メンバー>
  <メンバー>
    <名前>鈴木二郎</名前>
    <出身地>宮崎県</出身地>
    <電話番号>070-8765-4321</電話番号>
  </メンバー>
  <メンバー>
    <名前>宮崎三郎</名前>
    <出身地>福島県</出身地>
    <電話番号>024-681-3579</電話番号>
  </メンバー>
  <メンバー>
    <名前>石川花子</名前>
    <出身地>北海道</出身地>
    <電話番号>0123-45-6789</電話番号>
  </メンバー>
  <メンバー>
    <名前>佐藤四郎</名前>
    <出身地>東京都</出身地>
    <電話番号>03-3333-3333</電話番号>
  </メンバー>
</メンバーデータ>

XSL 文書は、前節のものを少々変更して使います。下線部分を変更して下さい。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <html lang="ja">
    <head>
      <title>メンバーデータ</title>
    </head>
    <body>
      <xsl:apply-templates select="メンバーデータ" />
    </body>
  </html>
</xsl:template>

<xsl:template match="メンバーデータ">
  <xsl:apply-templates select="団体名" />
  <xsl:apply-templates select="メンバー" />
</xsl:template>

<xsl:template match="団体名">
  <h1><xsl:value-of /></h1>
</xsl:template>

<xsl:template match="メンバー">
  <p>
    <xsl:apply-templates select="名前" />
    <xsl:apply-templates select="出身地" />
    <xsl:apply-templates select="電話番号" />
  </p>
</xsl:template>

<xsl:template match="名前">
  <xsl:value-of />
</xsl:template>

<xsl:template match="出身地">
  <xsl:value-of />
</xsl:template>

<xsl:template match="電話番号">
  <xsl:value-of />
</xsl:template>

</xsl:stylesheet>

表示してみましょう。正しく表示されましたか?

項目を分かりやすくする

【練習問題】で作った XSL 文書は、次のように書き換えることによって

ことができます。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <html lang="ja">
    <head>
      <title>メンバーデータ</title>
    </head>
    <body>
      <xsl:apply-templates select="メンバーデータ" />
    </body>
  </html>
</xsl:template>

<xsl:template match="メンバーデータ">
  <xsl:apply-templates select="団体名" />
  <xsl:apply-templates select="メンバー" />
</xsl:template>

<xsl:template match="団体名">
  <h1><xsl:value-of /></h1>
</xsl:template>

<xsl:template match="メンバー">
  <h2>
    <xsl:apply-templates select="名前" />
  </h2>
  <p>
    <xsl:apply-templates select="出身地" />
    <xsl:apply-templates select="電話番号" />
  </p>
</xsl:template>

<xsl:template match="名前">
  <xsl:value-of />
</xsl:template>

<xsl:template match="出身地">
  <xsl:value-of />出身
</xsl:template>

<xsl:template match="電話番号">
  (<xsl:value-of />)
</xsl:template>

</xsl:stylesheet>

表形式で表示する

【練習問題】で作った XSL 文書は、次のように書き換えることによって表形式で表示することが出来ます。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <html lang="ja">
    <head>
      <title>メンバーデータ</title>
    </head>
    <body>
      <xsl:apply-templates select="メンバーデータ" />
    </body>
  </html>
</xsl:template>

<xsl:template match="メンバーデータ">
  <xsl:apply-templates select="団体名" />
  <table border="2">
    <xsl:apply-templates select="メンバー" />
  </table>
</xsl:template>

<xsl:template match="団体名">
  <h1><xsl:value-of /></h1>
</xsl:template>

<xsl:template match="メンバー">
  <tr>
    <td><xsl:apply-templates select="名前" /></td>
    <td><xsl:apply-templates select="出身地" /></td>
    <td><xsl:apply-templates select="電話番号" /></td>
  </tr>
</xsl:template>

<xsl:template match="名前">
  <xsl:value-of />
</xsl:template>

<xsl:template match="出身地">
  <xsl:value-of />
</xsl:template>

<xsl:template match="電話番号">
  <xsl:value-of />
</xsl:template>

</xsl:stylesheet>

XSL 文書を簡略化する

【練習問題】で作った XSL 文書は、次のように簡略化することが出来ます。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <html lang="ja">
    <head>
      <title>メンバーデータ</title>
    </head>
    <body>
      <xsl:apply-templates select="メンバーデータ" />
    </body>
  </html>
</xsl:template>

<xsl:template match="メンバーデータ">
  <xsl:apply-templates select="団体名" />
  <xsl:apply-templates select="メンバー" />
</xsl:template>

<xsl:template match="団体名">
  <h1><xsl:value-of /></h1>
</xsl:template>

<xsl:template match="メンバー">
  <p>
    <xsl:value-of select="名前" />
    <xsl:value-of select="出身地" />
    <xsl:value-of select="電話番号" />
  </p>
</xsl:template>

</xsl:stylesheet>

value-of の後に select="○○" と書くと、<xsl:template match="○○"> で始まるまとまりがなくとも、○○ という要素の内容をそこに当てはめてくれます。

XSL 文書を更に簡略化する

上の XSL 文書は、更に次のように簡略化することが出来ます。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
  <html lang="ja">
    <head>
      <title>メンバーデータ</title>
    </head>
    <body>
      <xsl:apply-templates select="メンバーデータ" />
    </body>
  </html>
</xsl:template>

<xsl:template match="メンバーデータ">
  <xsl:apply-templates select="団体名" />
  <xsl:for-each select="メンバー">
    <p>
      <xsl:value-of select="名前" />
      <xsl:value-of select="出身地" />
      <xsl:value-of select="電話番号" />
    </p>
  </xsl:for-each>
</xsl:template>

<xsl:template match="団体名">
  <h1><xsl:value-of /></h1>
</xsl:template>

</xsl:stylesheet>

XSL対応 XML文書をプログラムで出力する

このように対応する XSL 文書がある XML 文書は、今までのプログラム (で呼び出していた usexml ユニットの MakeRoot 手続き) に次のように書き加えることで、最初から「XSL対応 XML文書」として出力することが出来ます。

unit usexml;

interface

uses MSXML2_TLB;// MSXMLのバージョンが2.0の場合は、MSXML_TLB

procedure MakeRoot(TagName: String);
function AddChild(ParentElement: IXMLDOMElement; TagName: String; Text: String = '') : Integer;

var
  XMLDocument : IXMLDOMDocument; // 文書全体を示す変数
  PI: IXMLDOMProcessingInstruction; // XML の最初の1行を示す変数
  XSL: IXMLDOMProcessinginstruction; // XSL を指定する変数
  Root: IXMLDOMElement; // 文書の節を示す変数 (文書の根として用いる)
  Elements: Array of IXMLDOMElement; // 文書の節を示す動的配列変数

implementation

// XML 文書を作成する
procedure MakeRoot(TagName: String);
begin
  XMLDocument := CoDOMDocument.Create(); // 文書全体を管理するメモリを確保
  PI := XMLDocument.createProcessingInstruction('xml', 'version=''1.0'' encoding=''Shift_JIS''');
  XMLDocument.AppendChild(PI); // XML の最初の1行を追加する (必須)
  XSL := XMLDocument.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="data.xsl"');
  XMLDocument.AppendChild(XSL); // XSL 指定を追加する
  Root := XMLDocument.CreateElement(TagName); // Root という節を作り
  XMLDocument.AppendChild(Root); // 文書の根として登録する
end;

ここまで見てきて分かるように、XML 文書はデータの構造化・階層化がしやすく、XML 文書の中身を人間がそのまま見ても内容を理解しやすく、また XSL を用いて簡単に HTML 文書のように表示することが出来ます。