海鸥航迹

学习之笔记,好文之收集。

导航

对DataSet应用XSLT转换

.NET Framework Developer's Guide  

Applying an XSLT Transform to a DataSet

The WriteXml method of the DataSet enables you to write the contents of a DataSet as XML data. A common task is to then transform that XML to another format using XSL Transformations (XSLT). However, synchronizing a DataSet with an XmlDataDocument enables you to apply an XSLT stylesheet to the contents of a DataSet without having to first write the contents of the DataSet as XML data using WriteXml.

The following example populates a DataSet with tables and relationships, synchronizes the DataSet with an XmlDataDocument, and writes a portion of the DataSet as an HTML file using an XSLT stylesheet. Following are the contents of the XSLT stylesheet.

<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>


The following code is the code to fill the DataSet and apply the XSLT style sheet.

Note   If the DataSet that you are applying an XSLT style sheet to contains relations, you will achieve best performance if you set the Nested property of the DataRelation to true for each nested relation. This allows you to use XSLT style sheets that implement natural top-down processing to navigate the hierarchy and transform the data, as opposed to using performance-intensive XPath location axes (for example, preceding-sibling and following-sibling in style sheet node test expressions) to navigate the data hierarchy. For more information on nested relations, see Nested DataRelations.
[Visual Basic]
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Imports System.Xml.Xsl

Public Class Sample
  
Public Shared Sub Main()
    
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI")
    nwindConn.Open()

    
Dim myDataSet As DataSet = New DataSet("CustomerOrders")

    
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", nwindConn)
    custDA.Fill(myDataSet, 
"Customers")

    
Dim ordersDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", nwindConn)
    ordersDA.Fill(myDataSet, 
"Orders")

    nwindConn.Close()

    myDataSet.Relations.Add(
"CustOrders", _
                            myDataSet.Tables(
"Customers").Columns("CustomerID"), _
                            myDataSet.Tables(
"Orders").Columns("CustomerID")).Nested = true

    
Dim xmlDoc As XmlDataDocument = New XmlDataDocument(myDataSet) 
      
    
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()
  
End Sub

End Class



[C#]
using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
using System.Xml.Xsl;

public class Sample
{
  
public static void Main()
  
{
    SqlConnection nwindConn 
= new SqlConnection("Data Source=localhost;Initial Catalog=northwind;Integrated Security=SSPI;");
    nwindConn.Open();

    DataSet custDS 
= new DataSet("CustomerDataSet");

    SqlDataAdapter custDA 
= new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
    custDA.Fill(custDS, 
"Customers");

    SqlDataAdapter ordersDA 
= new SqlDataAdapter("SELECT * FROM Orders", nwindConn);
    ordersDA.Fill(custDS, 
"Orders");

    nwindConn.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();
  }

}

posted on 2004-08-25 08:50  海天一鸥  阅读(1018)  评论(0编辑  收藏  举报