Condividi tramite


Applicazione di una trasformazione XSLT a un set di dati

Il metodo WriteXml di DataSet consente di scrivere il contenuto di un DataSet come dati XML. Un'attività comune consiste nel trasformare il codice XML in un altro formato usando le trasformazioni XSL (XSLT). Tuttavia, la sincronizzazione di un DataSet oggetto con XmlDataDocument consente di applicare un foglio di stile XSLT al contenuto di un DataSet oggetto senza dover prima scrivere il contenuto di DataSet come dati XML utilizzando WriteXml.

Nell'esempio seguente viene popolato un DataSet oggetto con tabelle e relazioni, viene sincronizzato DataSet con xmlDataDocument e viene usata una parte di DataSet come file HTML utilizzando un foglio di stile XSLT. Di seguito sono riportati i contenuti del foglio di stile 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>

Il codice seguente riempie DataSet e applica il foglio di stile XSLT.

Annotazioni

Se applichi un foglio di stile XSLT a un DataSet che contiene relazioni, ottieni prestazioni ottimali impostando la proprietà Nested di DataRelation su true per ogni relazione nidificata. In questo modo è possibile usare fogli di stile XSLT che implementano l'elaborazione naturale dall'alto verso il basso per spostarsi nella gerarchia e trasformare i dati, anziché usare assi di posizione XPath ad alto consumo di risorse (ad esempio, precedente e successivo nello stesso livello nelle espressioni di test del nodo del foglio di stile) per navigare. Per ulteriori informazioni sulle relazioni nidificate, vedere Annidamento di DataRelations.

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

Vedere anche