Udostępnij za pośrednictwem


Stosowanie transformacji XSLT do elementu DataSet

Metoda DataSet WriteXml elementu umożliwia zapisanie zawartości elementu DataSet jako danych XML. Typowym zadaniem jest przekształcenie tego kodu XML w inny format przy użyciu przekształceń XSL (XSLT). Jednak synchronizowanie zestawu danych z elementem XmlDataDocument umożliwia zastosowanie arkusza stylów XSLT do zawartości zestawu danych Bez konieczności wcześniejszego zapisywania zawartości elementu DataSet jako danych XML przy użyciu narzędzia WriteXml.

W poniższym przykładzie zestaw danych jest wypełniany tabelami i relacjami, synchronizuje element DataSet z dokumentem XmlDataDocument i zapisuje część elementu DataSet jako plik HTML przy użyciu arkusza stylów XSLT. Poniżej przedstawiono zawartość arkusza stylów 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>  

Poniższy kod wypełnia zestaw danych i stosuje arkusz stylów XSLT.

Uwaga

Jeśli stosujesz arkusz stylów XSLT do zestawu danych zawierającego relacje, uzyskasz najlepszą wydajność, jeśli ustawisz właściwość Zagnieżdżona dla każdej zagnieżdżonej DataRelation relacji na wartość true. Dzięki temu można używać arkuszy stylów XSLT, które implementują naturalne przetwarzanie od góry do przechodzenia do hierarchii i przekształcania danych, w przeciwieństwie do używania wydajnych osi lokalizacji XPath (na przykład poprzednich elementów równorzędnych i następujących elementów równorzędnych w wyrażeniach testowych węzłów arkusza stylów) w celu nawigowania po nich. Aby uzyskać więcej informacji na temat relacji zagnieżdżonych, zobacz Nesting DataRelations (Zagnieżdżanie relacji danych).

' 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();  

Zobacz też