Применение преобразования XSLT к набору данных
Метод DataSet WriteXml позволяет записывать содержимое набора данных в виде XML-данных. После этого типичной задачей является преобразование этого XML в другой формат с помощью XSLT-преобразования (XSLT). Однако синхронизация набора данных с помощью набора XmlDataDocument данных позволяет применить таблицу стилей XSLT к содержимому набора данных , не записывая содержимое набора данных в виде XML-данных с помощью WriteXml.
В следующем примере набор данных заполняется таблицами и связями, синхронизируется набор данных с XmlDataDocument и записывает часть набора данных в виде HTML-файла с помощью таблицы стилей XSLT. Ниже приведено содержимое таблицы стилей 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>
Следующий код заполняет набор данных и применяет таблицу стилей XSLT.
Примечание.
Если вы применяете таблицу стилей XSLT к набору данных, который содержит отношения, вы обеспечиваете лучшую производительность, если присвойте свойству Nested DataRelation значение true для каждого вложенного отношения. Это позволяет использовать таблицы стилей XSLT, реализующие естественную нисходящую обработку для перемещения по иерархии и преобразования данных, в отличие от ресурсоемких осей расположения XPath (например, предшествующий одноуровневый элемент и следующий элемент того же уровня в тестовых выражениях узла таблицы стилей). Дополнительные сведения о вложенных отношениях см. в разделе "Вложенные данные"
' 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();