連載

.NETで簡単XML

第6回 .NETプログラムでXSLTスクリプトを使う

株式会社ピーデー 川俣 晶
2003/07/08

■XSLTミニ入門その1 要素に対応する出力

 まず、Visual Studio .NET 2003を使わないシンプルな世界でXSLTを利用してみよう。以下のサンプルはInternet Explorer 6で利用されることを前提としたものである。例示されたXML文書をInternet Explorer 6で開くと、XSLTスクリプトが動作して結果を表示するようになっている。

 まず最初のサンプルは、指定された要素の内容をHTML文書として出力するものである。

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="sample01.xslt" type="text/xsl"?>
<database>
  <person>
    <name>伊能忠敬</name>
    <birth>1745</birth>
  </person>
  <person>
    <name>間宮林蔵</name>
    <birth>1775</birth>
  </person>
</database>
Internet Explorer 6で開くXML文書(sample01.xml)
今回紹介するXML文書とXSLTスクリプトのサンプルはこちらからダウンロードできる。
 
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" />

  <xsl:template match="name">
    <p>指定された人名は<xsl:apply-templates />です。</p>
  </xsl:template>

  <xsl:template match="/">
    <html>
      <head>
        <title>人名の表示</title>
      </head>
      <body>
        <h1>人名の表示</h1>
        <xsl:apply-templates select="/database/person/name" />
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>
指定された要素の内容をHTML文書として出力するXSLTスクリプト(sample01.xslt)

 XML文書sample01.xmlをInternet Explorerで開くと以下のようになる。

Internet Explorer 6でsample01.xmlを開いたところ
XSLTスクリプトsample01.xsltによって出力されたHTML文書が表示される。

 それでは、どうしてこのような結果が得られるのか。その内容を説明しよう。

 まず重要なのは、あるXML文書を表示する際に使用されるXSLTスクリプトを指定する方法である。これは、XML文書に含まれる<?xml-stylesheet href="sample01.xslt" type="text/xsl"?>という部分が相当する。ここは、この連載の主題とは関係ない部分なので、詳しく解説はしない。ここでは、「href=」に続く部分の引用符内に、XSLTスクリプトのURLを書き込むと思ってもらえれば問題ないだろう。

 次はいよいよ本題となるXSLTスクリプトを説明する。まず、XSLTスクリプトもXML文書の一種であることを確認しよう。XSLTスクリプトはXML文書が守るべきあらゆるルールに従う必要がある。そのため、先頭にも正しいXML宣言が付加されている。XSLTもXMLで作られた言語である以上、固有の名前空間URIを持っている。それが、http://www.w3.org/1999/XSL/Transformである。この名前空間URIは、xslという接頭辞に割り当てて使うことが多い。XSLTスクリプトは、xsl:stylesheet要素を文書要素として使う。この要素には、version="1.0"という属性を付けておく。

 次に、xsl:output要素が記述されているが、これは出力の形式を指定するものである。method属性の値が「html」ならHTMLに、「xml」ならXMLとなる。

 さて、次からが最も本質的な変換本体についての説明である。

 続く部分には、xsl:template要素が2つ書かれている。この要素は変換ルールを記述する。変換ルールを発動する条件は、match属性に書かれたXPath式で指定される。そして、出力される内容は、この要素の内容で示される。最初のxsl:template要素の場合、条件はnameという要素が発見された場合であり、出力される内容は、

<p>指定された人名は<xsl:apply-templates />です。</p>

という部分で示されるものである。この中で、テキストはそのまま出力される。<p>のようなXSLTの名前空間に属さない要素はそのまま出力される。xsl:apply-templates要素は、そのテンプレート(xsl:template要素)が対象としたノードの子らにさらにテンプレートを適用することを意味している。この場合、name要素の子には人名が書かれたテキストがあるはずである。テキストはそのまま出力するという暗黙のデフォルト・ルールがあるので、人名はそのまま出力される。つまり、

<p>指定された人名は<xsl:apply-templates />です。</p>

という部分は、人名が「間宮林蔵」なら、

<p>指定された人名は間宮林蔵です。</p>

という出力になるわけである。

 2番目のxsl:template要素も、同じようなものであるが、match属性の値として書かれたXPath式が“/”であることに注目していただきたい。これはルート・ノードを示すXPath式であるが、それだけでなく、XSLTでは必ず最初に処理されるテンプレートであるという役割を持っている。つまり、このスクリプトを実行する際、最初に処理されるのはこのテンプレートである。

 次に、

<xsl:apply-templates select="/database/person/name" />

という部分に注目していただきたい。前に出たxsl:apply-templates要素は、そのノードの子ノードにテンプレートを適用させる機能を持っていたが、これはちょっと違う。select属性が付いたxsl:apply-templates要素は、この属性で指定されたXPath式が示すノードに対して、テンプレートを適用させるのである。ここでは/database/person/nameというXPath式に該当する要素に対して、テンプレートが適用される。実際に適用されるテンプレートは、最初のname要素に対するテンプレートである。このXPath式に対応する要素は2つあるので、name要素に対するテンプレートは2回処理され、結果として、2つの人名が出力されているというわけである。

 ここで注意してほしいことは、すべてのノードが無条件にテンプレート適用の対象になっていないということである。例えば、このXML文書には2つのbirth要素が含まれているが、それに対してテンプレートの適用ができるかチェックされることはない。それは、xsl:apply-templates要素のselect属性で、対象を明示的に指定したことによる必然的な結果なのである。


 INDEX
  .NETで簡単XML
  第6回 .NETプログラムでXSLTスクリプトを使う
    1.XSLTとは何か
  2.XSLTミニ入門その1 要素に対応する出力
    3.XSLTミニ入門その2、3 属性に対応する出力/XPath式の値を出力
    4.プログラムでXSLTを処理/プログラム内のデータを変換
    5.XPathDocumentで処理を高速化/XSLTにプログラムを埋め込む
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間