SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

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関連クラスを使用してアプリケーションを作成する方法を理解するための確固たる基盤になるはずです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Thiru Thangarathinam(Thiru Thangarathinam)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1529 2008/08/21 21:21

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー