Een XSLT-transformatie toepassen op een dataset
Met de WriteXml-methode van de DataSet methode kunt u de inhoud van een DataSet schrijven als XML-gegevens. Een veelvoorkomende taak is om die XML vervolgens te transformeren naar een andere indeling met behulp van XSL-transformaties (XSLT). Als u echter een DataSet synchroniseert met een XmlDataDocument sjabloon, kunt u een XSLT-opmaakmodel toepassen op de inhoud van een DataSet zonder dat u eerst de inhoud van de DataSet als XML-gegevens hoeft te schrijven met WriteXml.
In het volgende voorbeeld wordt een DataSet gevuld met tabellen en relaties, wordt de DataSet gesynchroniseerd met een XmlDataDocument en wordt een deel van de DataSet als een HTML-bestand geschreven met behulp van een XSLT-opmaakmodel. Hieronder ziet u de inhoud van het XSLT-opmaakmodel:
<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>
Met de volgende code wordt de DataSet ingevuld en wordt het XSLT-opmaakmodel toegepast.
Notitie
Als u een XSLT-opmaakmodel toepast op een DataSet die relaties bevat, kunt u het beste presteren als u de geneste eigenschap van de DataRelation waarde instelt op Waar voor elke geneste relatie. Op deze manier kunt u XSLT-opmaakmodellen gebruiken die natuurlijke top-downverwerking implementeren om door de hiƫrarchie te navigeren en de gegevens te transformeren, in tegenstelling tot het gebruik van prestatieintensieve XPath-locatieassen (bijvoorbeeld de testexpressies voor voorafgaande en hetzelfde niveau in het opmaakmodelknooppunt) om ernaar te navigeren. Zie Nesting DataRelations voor meer informatie over geneste relaties.
' 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();