japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> 会社概要地図
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
コラム コラム一覧へ戻る

japan.internet.com 編集部 japan.internet.com 編集部
米国 Jupitermedia が運営する、
Microsoft のインターネットソリューションで作業する開発者向けの、
フリーのリソースを提供するサイト。


 メール  著者にメールする
 ホーム  http://www.15seconds.com/

最新コラム

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

著者: Thiru Thangarathinam プリンター用 記事を転送
2007年10月2日 11:30 付の記事
□国内internet.com発の記事

はじめに

 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文書がロードされています。

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

パラメータをXSLTスタイルシートに渡す

 パラメータをXSLTスタイルシートに渡す方法は、メソッドや関数に渡す方法と似ています。パラメータをスタイルシートに渡すと、<xsl:stylesheet>要素内の任意の<xsl:param>として定義されているグローバルスコープ変数を初期化することができます。以下のコードでは、パラメータを宣言して使用している部分を太字で示します。

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:param name="BackGroundColor" select="Blue" />
  <xsl:template match="/">
  <HTML>
    <HEAD>
      <TITLE>Passing Parameters to an XSLT Style Sheet</TITLE>
    </HEAD>
    <BODY>
      <H2> Passing Parameters to an XSLT Style Sheet</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:attribute name="bgcolor">
              <xsl:value-of select="$BackGroundColor" />
            </xsl:attribute>
              <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>

 このコードでは、BackGroundColorパラメータの宣言の後で、BackGroundColorパラメータを使ってテーブルの<tr>要素の背景色を指定しています。

<xsl:value-of select="$BackGroundColor" /> 

 この例では、< xsl:param>要素でBackGroundColorを宣言するときに値をハードコーディングしましたが、理想的には、この値を呼び出し側ASP.NETページから渡す必要があります。それには、XsltArgumentListクラスのAddParam()メソッドを使用します。XsltArgumentListクラスは、パラメータをXSLTスタイルシートに渡すメカニズムを提供し、再利用可能かつ管理可能なXSLTスタイルシートを作成できるようにするキークラスです。

 AddParam()メソッドには、修飾名と名前空間URIと値を引き渡します。String、Boolean、Number、Node Fragment、またはNodeSet以外のパラメータ値は、倍精度浮動小数点型か文字列型になります。パラメータをスタイルシートに渡す、呼び出し側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);
    XsltArgumentList argsList = new XsltArgumentList();
    string backGroundColor = "Tan";
    //Add the required parameters to the XsltArgumentList object
    argsList.AddParam("BackGroundColor", "", backGroundColor);
    transform.Transform(xpathDoc, argsList, Response.Output);
  }
}
</script>

 上記のコードは最初のコード例とよく似ていますが、XsltArgumentListオブジェクトが使用されているという点が異なります。具体的には、XsltArgumentListオブジェクトのインスタンスを作成し、そのAddParam()メソッドを呼び出してBackGroundColorパラメータを追加し、最後にXsltArgumentListを引数としてXslCompiledTransformのTransform()メソッドに渡しています。

 このように設定して、ブラウザでこのWebページのURLを指定すると、次の画面が表示されます。すべてのカテゴリレコードの背景色が薄茶色になっていることに注目してください。

XSLTスタイルシートから拡張オブジェクトを呼び出す

 XsltArgumentListクラスでは、パラメータを渡すだけでなく、クラスと名前空間URIを関連付けることで、スタイルシートからクラスのメソッドを直接呼び出すこともできます。スタイルシートからメソッドが呼び出されるオブジェクトのことを拡張オブジェクトと呼びます。この例では、DateTimeConverterという名前の拡張オブジェクトを作成し、ModifiedDate値を適切な形式に書式設定します。この目的のために、ToDateTimeFormat()というメソッドのみを持つDateTimeConverterクラスを作成します。ToDateTimeFormat()は、指定された書式文字列に従って入力データの書式を設定するメソッドです。

using System;

public class DateTimeConverter
{
  public DateTimeConverter()
  {}

  public string ToDateTimeFormat(string data, string format)
  {
    DateTime date = DateTime.Parse(data);
    return date.ToString(format);
  }
} 

 「App_Code」フォルダにDateTimeConverterクラスを置いて、ASP.NETページから簡単に参照できるようにします。XSLTスタイルシートから拡張オブジェクトを呼び出せるようにするには、以下の処理を行います。

  • XSLTファイルの先頭で拡張オブジェク名前空間のエイリアスを宣言する
  • エイリアスを使用して拡張オブジェクトのメソッドを呼び出す
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:DateTimeConverter="urn:DateTimeConverter">
  <xsl:output method="html" />
  <xsl:param name="BackGroundColor" select="Blue" />
  <xsl:template match="/">
  <HTML>
    <HEAD>
      <TITLE>Invoking extension objects from an XSLT Style Sheet
      </TITLE>
    </HEAD>
    <BODY>
      <H2>Invoking extension objects from an XSLT Style Sheet</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:attribute name="bgcolor">
                <xsl:value-of select="$BackGroundColor" />
              </xsl:attribute>
              <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="DateTimeConverter:ToDateTimeFormat
                  (ModifiedDate, 'F')" />
              </xsl:element>
            </xsl:element>
          </xsl:for-each>
        </center>
      </table>
    </BODY>
  </HTML>
  </xsl:template>
</xsl:stylesheet>

 ご覧のように、スタイルシートへの修正は最小限に抑えられています。xsl:stylesheet要素には、xmlns:DateTimeConverter="urn:DateTimeConverter"属性が追加されています。これは、拡張オブジェクトの名前空間URIを関連付けるために必要です。この関連付けは、次のコード行で行われます。

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:DateTimeConverter="urn:DateTimeConverter">

 オブジェクトと名前空間URIを関連付けた後は、拡張オブジェクトのメソッドを、それがスタイルシートの一部であるかのように簡単に呼び出すことができます。

 次のコード行が、拡張オブジェクトのメソッド呼び出しに当たります。

<xsl:value-of 
    select="DateTimeConverter:ToDateTimeFormat
    (ModifiedDate, 'F')" />

 上記の行では、DateTimeConverterクラスのToDateTimeFormat()メソッドを呼び出して、ModifiedDateと必要な日付書式文字列を渡しています。

 スタイルシートの変更部分を確認したところで、次は、拡張オブジェクトをスタイルシートに渡して拡張オブジェクトのメソッドを呼び出せるようにする部分のコードを見てみましょう。

<%@ 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);
    XsltArgumentList argsList = new XsltArgumentList();
    string backGroundColor = "Tan";
    //Add the required parameters to the XsltArgumentList object
    argsList.AddParam("BackGroundColor", "", backGroundColor);
    //Create and add the extension object to the XsltArgumentList
    DateTimeConverter converter = new DateTimeConverter();
    argsList.AddExtensionObject("urn:DateTimeConverter", 
                                converter);
    transform.Transform(xpathDoc, argsList, Response.Output);
  }
}
</script>

 重要なコード行を順番に見ていきます。

 次のコードでは、BGColorクラスのインスタンスを作成します。

DateTimeConverter converter = new DateTimeConverter(); 

 オブジェクトのインスタンスを作成したら、次はそのインスタンスをXsltArgumentListオブジェクトに追加します。

argsList.AddExtensionObject("urn:DateTimeConverter",converter);

 最後に、次のコード行でインスタンスと残りのパラメータをスタイルシートに渡します。

transform.Transform(xpathDoc,argsList,Response.Output);

 上記のコードを実行すると、以下の画面が表示されます。

 この画面からわかるように、ModifiedDate値は適切に書式設定されています。

まとめ

 この記事では、以下の点について説明しました。

  • XSLTスタイルシートを使用してXML文書を変換する方法。
  • XsltArgumentListクラスを使用してパラメータをXSLTスタイルシートに指定する方法。
  • XSLTスタイルシートから拡張オブジェクトのメソッドを呼び出す方法。
  • XPath式を使用して一連のノードをフィルタリングする方法。

 ここで作成したアプリケーションの機能は非常にシンプルですが、これは.NET Framework 2.0でXSLT関連クラスを使用してアプリケーションを作成する方法を理解するための確固たる基盤になるはずです。

著者紹介

Thiru Thangarathinam(Thiru Thangarathinam)
オブジェクト指向アプリケーション開発方法論を用いたアプリケーションのアーキテクチャ設計、設計、開発、および実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。
ASP.NET、.NET Framework、Visual C#.NET、Visual Basic.NET、ADO.NET、XML Webサービス、および.NET Remotingのエキスパートであり、MCAD(.NETトラック)、MCSD、およびMCP資格を保有。
多くの書籍や記事を執筆。メールの宛先はthiruthangarathinam@yahoo.com

過去コラム集
プロセス指向のソフトウェア開発
ASP.NETにおけるHTTPデータの取得とキャッシュ
ASP.NET 2.0のHTTPハンドラ(*.ashx)をデバッグする
COM相互運用機能の利用 - パート2
COM相互運用機能の利用
Visual Studio 2005のフォームにおけるBindingNavigatorの拡張
NAntによるバックアップの自動化
サービスコンポーネントのさまざまな配置方法
コードアクセスセキュリティの仕組みと設定方法
.NET Remotingの追跡サービスと独自の追跡ハンドラの実装
海外のインターネットコム アメリカ韓国ドイツトルコ
関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルTシャツ ニタコエ
Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
space.gif space.gif