CodeZine(コードジン)

特集ページ一覧

.NET Framework 2.0におけるXSLTの使い方を理解する

.NET Framework 2.0が提供する豊富なXSLTサポート

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/07/26 14:00

.NET Framework 2.0にはさまざまなXSLT関連クラスが用意されています。ここでは、XMLにXSLTを組み合わせる方法やXSLTスタイルシートから拡張オブジェクトのメソッドを呼び出す方法、XPath式を使用して一連のノードをフィルタリングする方法などを紹介します。

目次

はじめに

 XMLの大きな特長は、データと表現を分離できるという点です。これは特に説明の必要もなく、一般的に言われていることです。しかし、XMLデータとXSLT(XSL Transformations)スタイルシートを組み合わせると、情報を動的に変換し、思いどおりの形式で提示するための強力なツールになります。

 また、あるアプリケーションで作成したXMLドキュメントが、そのXMLデータ構造が違うために他のアプリケーションで処理できないという状況はよくあります。既存のXMLデータ構造を処理可能な構造に変換するには、XSLTを使用する必要があります。Microsoftは効果的なXSLT処理用ビルトインサポートの必要性を認識し、高度に最適化された一連のクラスを.NET Framework 2.0に組み込みました。この記事では、XSLT関連クラスを使用してリッチなASP.NET Webアプリケーションを作成する例を紹介しながら、.NET Framework 2.0が提供する豊富なXSLTサポートについて説明します。

概要

 まず、System.Xml.Xsl名前空間に含まれているXSLT関連のコアクラスを次に示します。

  • XslCompiledTransform
    .NET Framework 2.0でXSLTプロセッサとして動作するコアクラス。XMLデータを、HTML、テキスト、他のXMLなど、他の構造に変換するためのクラスです。
  • XsltArgumentList
    不特定数のパラメータと拡張オブジェクトをXSLスタイルシートに渡せるようにします。
  • XsltCompileException
    XSLスタイルシートでエラーが発生すると、この例外がLoadメソッドによってスローされます。
  • XsltException
    XSLスタイルシートの処理中に例外が発生するとスローされます。

 .NET Framework 2.0では、.NET Framework 1.xのXSLTで使われていたXslTransformクラスはサポートされていません。代わりにlCompiledTransformクラスが使用されています。このXslCompiledTransformでは、パフォーマンスだけでなく、XSLT 1.0仕様に対するサポートも改善されています。.NET Framework 2.0以降では、XSLTはXslCompiledTransformクラスから実行することをお勧めします。XslCompiledTransformクラスの設計はXslTransformクラスと似ているので、既存のコードをXslCompiledTransformクラスに移行することも簡単にできます。

 サンプルコードを見る前に、必要となるXslCompiledTransformクラスの重要なメソッドについて簡単に説明します。

  • Load
    このメソッドには複数のオーバーロードがあり、URLを指定する文字列、XmlReaderオブジェクト、XPathNavigatorオブジェクトなどの多様なリソースからXSLスタイルシートをXslCompiledTransformオブジェクトにロードすることができます。
  • Transform
    Loadメソッドを使用してロードされたスタイルシートを使って、XMLデータを指定フォーマットに変換します。

実装

 XSLTクラスとそのメソッドについては簡単に説明しました。ここで、シンプルなXSLTの例を見てみましょう。この記事の目的は、AdventureWorksデータベースからXMLデータの形式でデータを取得し、そのデータをXSLTを使って変換し、ブラウザでHTMLとしてレンダリングすることです。

シンプルなXSLT

 この例では、カテゴリデータをXMLストリームとして取得して表示用のHTMLに変換するシンプルなASP.NETページを作成します。ASP.NETページを見る前に、まず「Category.xsl」という名前のXSLファイルを見てみましょう。

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:template match="/">
  <HTML>
    <HEAD>
      <TITLE>Simple XSLT Transformation</TITLE>
    </HEAD>
    <BODY>
      <H2>Simple XSLT Transformation</H2>
      <table border="1" cellSpacing="1" cellPadding="1">
        <center>
          <xsl:for-each select="//Categories">
          <!-- Each record on a seperate row -->
            <xsl:element name="tr">
              <xsl:element name="td">
                <xsl:value-of select="ProductSubcategoryID" />
              </xsl:element>
              <xsl:element name="td">
                <xsl:value-of select="Name" />
              </xsl:element>
              <xsl:element name="td">
                <xsl:attribute name="align">center</xsl:attribute>
                <xsl:value-of select="ModifiedDate" />
              </xsl:element>
            </xsl:element>
          </xsl:for-each>
        </center>
      </table>
    </BODY>
  </HTML>
  </xsl:template>
</xsl:stylesheet>

 このXSLファイルには、Categories要素に含まれるすべての要素をループ処理するためのロジックが含まれています。ASP.NETページのコードを以下に示します。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<%@ Import Namespace="System.Xml.XPath" %>
<%@ Import Namespace="System.Web.Configuration" %>

<script runat="server">
void Page_Load(object sender, System.EventArgs e)
{
  string connString = WebConfigurationManager.ConnectionStrings
    ["adventureWorks"].ConnectionString;
  using (SqlConnection connection = new SqlConnection(connString))
  {
    connection.Open();
    SqlCommand command = new SqlCommand
      ("Select * from Production.ProductSubcategory as Categories " +
      " for xml auto,elements", connection);
    XmlReader reader = command.ExecuteXmlReader();
    XPathDocument xpathDoc = new XPathDocument(reader);
    string xslPath = Server.MapPath("App_Data/Category.xsl");
    XslCompiledTransform transform = new XslCompiledTransform();
    transform.Load(xslPath);
    transform.Transform(xpathDoc, null, Response.Output);
  }
}
</script>

 WebフォームのPage_Loadイベントでは、ProductSubcategoryテーブルからXMLの形式でデータを取得し、外部XSLTスタイルシート(Category.xsl)を適用してHTMLを生成します。次に、このHTMLをクライアントブラウザに直接書き込みます。これは、Response.OutputオブジェクトをTransform()メソッドに渡すことによって実行されます。上記の例では、XPathDocumentクラスがハイパフォーマンスのXML文書処理用に最適化されているため、このクラスを使ってXML文書がロードされています。

 ブラウザを使用してページに移動すると、次の画面が表示されます。

 

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

  • Thiru Thangarathinam(Thiru Thangarathinam)

    オブジェクト指向アプリケーション開発方法論を用いたアプリケーションのアーキテクチャ設計、設計、開発、および実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。 ASP.NET、.NET Framework、Visual C#.NET、Visual Basi...

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5