When you think ASP, think...
Recent Articles
All Articles
ASP.NET Articles
ASPFAQs.com
Message Board
Related Web Technologies
User Tips!
Coding Tips

Sections:
Sample Chapters
Commonly Asked Message Board Questions
JavaScript Tutorials
MSDN Communities Hub
Official Docs
Security
Stump the SQL Guru!
XML Info
Information:
Feedback
Author an Article
ASP ASP.NET ASP FAQs Message Board Feedback
Print this page.
Published: Monday, October 16, 2000

XML and XSL with ASP, Part 2

By Gurpreet Kanwar


  • Read Part 1

  • In Part 1 we looked at the advantages and disadvantages of XML. In this part we'll roll up our sleeves and get down to creating (and displaying) some XML documents using ASP code!

    - continued -

    XML with ASP
    The following example illustrates how to create an XML tree (in memory) and then persist is to disk (using the save method).

    <%
      Dim xmldoc
      Set xmldoc = Server.CreateObject("Microsoft.XMLDOM")
    
      ' Check to see if a document has data. If it does, don't build it
      If (xmldoc.childNodes.length = 0) Then
        ' Build the XML document
        Set root = xmldoc.createNode("element", "Hi-Tech", "")
        xmldoc.appendChild (root)
    
        Set onode = xmldoc.createNode("element", "Employee", "")
        onode.Text = "Gurpreet Singh"
    
        xmldoc.documentElement.appendChild (onode)
        Set inode = xmldoc.createNode("element", "Address", "")
    
        onode.appendChild (inode)
    
        Set child = xmldoc.createNode("element", "Address1", "")
        child.Text = "Nepean Ont"
    
        inode.appendChild (child)
    
        Set child = xmldoc.createNode("element", "Address2", "")
        child.Text = "Canada"
        inode.appendChild (child)
      End If
    
      xmldoc.save (Server.Mappath("savedI2.xml"))
    %>
    

    Here we have created an XMLDOM Object. We then create a Root node and its child node using the createNode function. Finally we append the nodes after assigning the text property to nodes. In the end we save the in-memory XML tree to a file.

    We can also build an XML file from the results of a database query. The following example illustrates how to accomplish this. (For this example I used the pubs database, which comes along with SQL Server.)

    <%
      'Open database connection
      Set conn = Server.CreateObject("ADODB.Connection")
      dsn = "DSN=pubs;UID=sa;PWD="
      conn.Open dsn
    
      'Create XMLDOM Object
      Dim xmldoc
      Set xmldoc = Server.CreateObject("Microsoft.XMLDOM")
    
      If (xmldoc.childNodes.length = 0) Then
        ' Build the XML document
        Set root = xmldoc.createNode("element", "Hi-Tech", "")
    
        xmldoc.appendChild (root)
    
        ' Queries the database for customer data
        Sql = "select au_lname,au_fname,au_id from authors"
        Set rs = conn.Execute(Sql)
      
        rs.MoveFirst
    
        'Loop through the recordset
        Do While Not rs.EOF
          Set onode = xmldoc.createNode("element", "Employee", "")
          xmldoc.documentElement.appendChild (onode)
       
          Set inode = xmldoc.createNode("element", "Name", "")
          inode.Text = rs.fields(0) & " " & rs.fields(1)
          onode.appendChild (inode)
    
          'Grab another recordset based on the authorID
          Sql = "select title_id,royaltyper from titleauthor " & _
                "where au_id = '" &  rs.fields(2) & "'"
    
          Set rs2 = conn.Execute(Sql)
    
          If Not (rs2.EOF = True And rs2.bof = True) Then
            Set inode = xmldoc.createNode("element", "Titles", "")
            onode.appendChild (inode)
            Set child = xmldoc.createNode("element", "TitleId", "")
            child.Text = rs2.fields(0)
            inode.appendChild (child)
            Set child = xmldoc.createNode("element", "royalty", "")
            child.Text = rs2.fields(1)
            inode.appendChild (child)
    
            rs2.Close
            Set rs2 = Nothing
          End If
       
          rs.movenext
        Loop
    
        Set rs = Nothing
      End If
    
      'Save the XML doc
      xmldoc.save server.mappath("saved.xml")
    
    
      '------ DISPLAY THE XML DATA ------------
      ' Linking XML and XSL together
      sourceFile = Server.MapPath("saved.xml")
      styleFile = Server.MapPath("saved.xsl")
      
      set source = Server.CreateObject("Microsoft.XMLDOM")
      source.async = false
      source.load(sourceFile)
      set style = Server.CreateObject("Microsoft.XMLDOM")
      style.async = false
      style.load(styleFile)
      Response.Write source.transformNode(style)
    %>
    

    In the above example we first make the connection to our SQL Server database using Connection Object of ADO. Next, we create the recordset, populating it with the names of our authors in the authors table. We populate a second recordset based on the current authors ID. Eventually, all of this data is incorporated into the XML Tree using the createNode function and finally appending the nodes. Finally, the XML data is displayed using an XSL stylesheet. Remember that XML is designed to not store information on how the data should be displayed. Rather, XML is used only as a holding place for data. To turn an XML document into a nice-looking HTML document, you need to use XSL.

    Converting XML to HTML
    We can maintain XML data on the server and format it into HTML using XSL and then send it to the client. We can do so using any server-side techniques, such as an ASP page. To use XSL, you need to first create an XSL document. This document is a glorified stylesheet, explaining how to display the various XML tags. For example, we could have the following XSL stylesheet:

    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
      <xsl:template match="/">
      <HTML>
      <STYLE>
        .fr1  { width: 30em; }
        BODY       { margin:0px; width: 30em;
                     font-family: Arial, Helvetica, sans-serif; font-size: smaller;}
        P          { margin-top: .5em; margin-bottom: .25em; }
        HR         { color: #888888; }
        .H1        { color: #660033; font-weight: bold; vertical-align: top; }
        .Param     { font-size: smaller; vertical-align: top; }
        .tagline   { font-style: italic; font-size: smaller; text-align: right; }
        .body      { text-align: justify; background-color: #FFFFDD; }
        .dingbat   { font-family: WingDings; font-style: normal; font-size: xx-small; }
        .person    { font-weight: bold; }
        .label     { font-weight: bold; }
        .self      { font-style: italic; font-size: smaller;}
        #menu      { border: 2px solid black; padding: 1em; background-color: #888833; }
        .menutext  { color: #FFFFDD; font-family: Times, serif; font-style: italic;
                     vertical-align: top; text-align:center; }
        .menuhead  { color: #FFFFDD; font-family: Times, serif; font-weight: bold;
                     vertical-align: top; text-align:center; margin-bottom: .5em; }
      </STYLE>  
    
        <xsl:for-each select="Hi-Tech/Employee">
            <TABLE>
        <TR><TD Class="H1"><xsl:value-of select="Name" /></TD> </TR>
        <TR>
        <xsl:for-each select="Titles">
        <TR><TD><xsl:entity-ref name="nbsp"/></TD>
              <TD Class="H1"><xsl:value-of select="TitleId" /></TD>
              <TD Class="H1"><xsl:value-of select="royalty" /></TD>
        </TR>
        </xsl:for-each></TR>
            </TABLE>
       </xsl:for-each>
      </HTML>
      </xsl:template>
    </xsl:stylesheet>
    

    This XSL stylesheet can then be loaded and applied using the transformNode method. (For an example of this, see the previous code example, where, at the end, we displayed the XML data from an ADO recordset using an XSL stylesheet. Also, for more information on XSL, be sure to check out: Using XSL Stylesheets to Translate XML into HTML!)

    Well, I hope this article has answered some of your questions on XML. Hopefully you've learned some of the advantages and disadvantages of XML, when it should be used, and how it can be used... for more great information on XML, check out the XML Article Index.

    Happy Programming!

  • By Gurpreet Kanwar


  • ASP.NET [1.x] [2.0] | ASPMessageboard.com | ASPFAQs.com | Advertise | Feedback | Author an Article