DataSetの WriteXml メソッドを使用すると、DataSet の内容を XML データとして書き込みます。 一般的なタスクは、XSL 変換 (XSLT) を使用して、その XML を別の形式に変換することです。 ただし、DataSet を XmlDataDocument と同期すると、DataSet の内容を WriteXml を使用して XML データとして最初に書き込む必要なく、XSLT スタイルシートを DataSet の内容に適用できます。
次の例では、テーブルとリレーションシップを DataSet に設定し、 DataSet を XmlDataDocument と同期し、XSLT スタイルシートを使用して DataSet の一部を HTML ファイルとして書き込みます。 XSLT スタイルシートの内容を次に示します。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="CustomerOrders">
<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"/>, <xsl:value-of select="Phone"/><BR/>
</TD></TR>
<xsl:apply-templates select="Orders"/>
</xsl:template>
<xsl:template match="Orders">
<TABLE BORDER="1">
<TR><TD valign="top"><B>Order:</B></TD><TD valign="top"><xsl:value-of select="OrderID"/></TD></TR>
<TR><TD valign="top"><B>Date:</B></TD><TD valign="top"><xsl:value-of select="OrderDate"/></TD></TR>
<TR><TD valign="top"><B>Ship To:</B></TD>
<TD valign="top"><xsl:value-of select="ShipName"/><BR/>
<xsl:value-of select="ShipAddress"/><BR/>
<xsl:value-of select="ShipCity"/>, <xsl:value-of select="ShipRegion"/> <xsl:value-of select="ShipPostalCode"/><BR/>
<xsl:value-of select="ShipCountry"/></TD></TR>
</TABLE>
</xsl:template>
</xsl:stylesheet>
次のコードは 、DataSet を塗りつぶし、XSLT スタイル シートを適用します。
注
リレーションシップを含む DataSet に XSLT スタイル シートを適用する場合は、 入れ子になった 各リレーションシップに対して DataRelation の Nested プロパティを true に設定すると、最適なパフォーマンスが得られます。 これにより、パフォーマンスの高い XPath の位置軸 (スタイル シート ノードのテスト式で先行兄弟や次の兄弟など) を使用して移動するのではなく、自然なトップダウン処理を実装する XSLT スタイル シートを使用して階層を移動し、データを変換することができます。 入れ子になったリレーションの詳細については、「 DataRelation の入れ子」を参照してください。
' Assumes connection is a valid SqlConnection.
Dim dataSet As DataSet = New DataSet("CustomerOrders")
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Customers", connection)
customerAdapter.Fill(dataSet, "Customers")
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM Orders", connection)
orderAdapter.Fill(dataSet, "Orders")
connection.Close()
dataSet.Relations.Add("CustOrders", _
dataSet.Tables("Customers").Columns("CustomerID"), _
dataSet.Tables("Orders").Columns("CustomerID")).Nested = true
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(dataSet)
Dim xslTran As XslTransform = New XslTransform
xslTran.Load("transform.xsl")
Dim writer As XmlTextWriter = New XmlTextWriter( _
"xslt_output.html", System.Text.Encoding.UTF8)
xslTran.Transform(xmlDoc, Nothing, writer)
writer.Close()
// Assumes connection is a valid SqlConnection.
connection.Open();
DataSet custDS = new DataSet("CustomerDataSet");
SqlDataAdapter customerAdapter = new SqlDataAdapter(
"SELECT * FROM Customers", connection);
customerAdapter.Fill(custDS, "Customers");
SqlDataAdapter orderAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", connection);
orderAdapter.Fill(custDS, "Orders");
connection.Close();
custDS.Relations.Add("CustOrders",
custDS.Tables["Customers"].Columns["CustomerID"],
custDS.Tables["Orders"].Columns["CustomerID"]).Nested = true;
XmlDataDocument xmlDoc = new XmlDataDocument(custDS);
XslTransform xslTran = new XslTransform();
xslTran.Load("transform.xsl");
XmlTextWriter writer = new XmlTextWriter("xslt_output.html",
System.Text.Encoding.UTF8);
xslTran.Transform(xmlDoc, null, writer);
writer.Close();