C# Programming

Image

XMLをXSLTで変換

開発環境: Visual Studio 2005

1.目次

1.目次
2.目的
3.参考書
4.XMLでの日本語の扱い上の注意
5.データベース → データセット → XML+XSLT → HTML
6.C#で、XMLからHTMLへXSLTで変換する。

2.目的

Visual Studio 2005 Beta 1 Refresh with Team System に基づく情報で、自分のためのメモです。

3.参考書

(1)W3C Technical Report
(2)XML Japanese Profile
(3)XSL Transformations (XSLT) Version 1.0
(4)XML Path Language (XPath) Version 1.0
4.XMLでの日本語の扱い上の注意

XMLでの日本のエンコーディングでは、UTF-8、UTF-16が『強く推奨』されています。
Shift-JIS、EUC、ISO-2022-JPは、UTF-8、UTF-16への移行が「強く推奨」されています。
参考文献(2)。

5.データベース → データセット → XML+XSLT → HTML

ここでは、データベース → データセット → XML+XSLT → HTMLの一連の作業を行ってみます。

一応、以下で扱うファイルを用意しておきます。

Customers.xml

Customers.xslt

(1)データベース → データセット

SQLサーバーのサンプルデータベースをデータセットに読み込み、データセットからXMLに変換する。DataSet のWriteXml(), WriteXmlSchema でデータ、およびスキーマをXMLファイルに変換することができる。実際に Northwind のCustomers テーブルをデータセットに読み込み、そこからXMLファイルを生成すると次のようなXMLファイルが生成されます。

NorthwindのCustomersテーブルのデータセット
<?xml version="1.0" standalone="yes"?>
<NorthwindDataSet1 xmlns="http://tempuri.org/NorthwindDataSet1.xsd">
	<Customers>
		<CustomerID>ALFKI</CustomerID>
		<CompanyName>Alfreds Futterkiste</CompanyName>
		<ContactName>Maria Anders</ContactName>
		<ContactTitle>Sales Representative</ContactTitle>
		<Address>Obere Str. 57</Address>
		<City>Berlin</City>
		<PostalCode>12209</PostalCode>
		<Country>Germany</Country>
		<Phone>030-0074321</Phone>
		<Fax>030-0076545</Fax>
	</Customers>
	<Customers>
		<CustomerID>ANATR</CustomerID>
		...
	</Customers>
</NorthwindDataSet1>

Visual Studio 2005 Beta-1では、XML、XSLTを扱う機能が追加されている。

先ほど作成したCustomers.xml を Visual Studio 2005 Beta-1で開くと次のようになります。また、インテリセンスが効いて、手での修正も楽になっています。
Image

(2) XSLTを作成する。

ここでは、Customers.xml を HTMLに変換するためのXSLTを作成します。XSLTやXPATHについては、それだけで本がかけるほどの内容なので、参考文献をあさってください。

Customers.xml を HTMLに変換するためのXSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="NorthwindDataSet1">
	<HTML>
	<STYLE>
		BODY {font-family:verdana;font-size:9pt}
		TD {font-size:8pt}
	</STYLE>
	<BODY>
	<TABLE BORDER="1">
		<xsl:apply-templates select="Customers"/>
	</TABLE>
	</BODY>
	</HTML>
</xsl:template>

<xsl:template match="Customers">
	<TR>
		<TD>
			<xsl:value-of select="ContactName"/>
			
</TD> <TD> <xsl:value-of select="Phone"/>
</TD> </TR> </xsl:template> </xsl:stylesheet>

(3) Customers.xml のStylesheetプロパティで、Customers.xslt を指定する

プログラムからではなく、xml と xslt を結びつけることにより、XSLT を行うようにします。

注意
DataSet から自動生成されるXML の xmlns="http://tempuri.org/NorthwindDataSet1.xsd" があるとうまくXSLTしてくれないので、削除します。

これについては、次のBlogに情報があります。

http://msmvps.com/williamryan/archive/2004/11/14/19157.aspx

この情報にしたがって、次のようなプリフィックス付で試してみましたが、Visual Studio 2005 Beta-1 のXSLTがうまくこの名前空間を扱えないようです。

xmlns:xsd="http://tempuri.org/NorthwindDataSet1.xsd"
<xsl:apply-templates select="xsd:......"/>

Image

(4)XMLをXSLTでHTMLに変換する

ツールバーのShow XSL Output、またはメインメニュー→XML→Show XML Outputを選択します。

XMLメニューでは、Create Schema(XMLからスキーマを自動生成)、Reformat Selection(XMLファイルの選択部分を整形)、Show XSL Output(XMLにXSLTを適用する)の3つが用意されています。

Image

これで、Customers.htm が生成されて、下図のように表形式で表示することができます。

Image

6.C#で、XMLからHTMLへXSLTで変換する

XMLをXSLTで変換するには、.Net Framework 1.1 までは、次のように行います。

.Net Framework 1.1
XslTransform xslt = new XslTransform();

// Load Style Sheet
xslt.Load("test.xsl");

// Load Xml Document
XPathDocument xpathDocument = new XPathDocument("test.xml");

// Write HTML file in UTF8 encoding
// XmlTextWriter does not support disable-output-encoding in xsl, so here we use StreamWriter
StreamWriter writer = new StreamWriter("test.html", false, System.Text.Encoding.UTF8);
xslt.Transform(xpathDocument, null, writer, null);

.Net Framework 2.0 からは、次のように変わります。

.Net Framework 2.0
private void Transform()
{
	// Create the XsltCommand object.
	XsltCommand xslt = new XsltCommand();
	xslt.OnMessageEvent += new QueryEventHandler(MessageCallBack);

	// Compile the stylesheet.
	xslt.Compile( XSLTのファイル名 );

	// Transform the file.
	xslt.Execute( XMLファイル名, 変換後のファイル名);
}

// Display any event messages.
public static void MessageCallBack(object sender, QueryEventArgs e)
{
	Console.WriteLine("Message received: {0}", e.Message);
}