?
Solved

Different XML Formats?

Posted on 2003-11-24
4
Medium Priority
?
700 Views
Last Modified: 2013-11-19
I have a standard XML file as follows:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="DataContent.xsl"?>
<DataContent>
  <person>
    <name>Sam the Clam</name>
    <detail>Sea Dweller</detail>
    <age>39</age>
  </person>
  <person>
    <name>Fred the Fish</name>
    <detail>Sea Dweller</detail>
    <age>18</age>
  </person>
</DataContent>

and if I use the following XSL file:

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">
  <html>
  <body>
    <h2>Data Content Display</h2>
    <table border="0" cellspacing="2">
    <tr bgcolor="gray">
      <th align="left" width="100">Name</th>
      <th align="left" width="150">Detail</th>      
        <th align="left" width="50">Age</th>
    </tr>
    <xsl:for-each select="DataContent/person">
    <tr>
      <td><xsl:value-of select="name"/></td>
      <td><xsl:value-of select="detail"/></td>      
        <td><xsl:value-of select="age"/></td>
    </tr>
    </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template></xsl:stylesheet>

I can create an ASP page as follows:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
  sourceFile = Server.MapPath("DataContent.xml")
  styleFile = Server.MapPath("DataContent.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)
%>


However, if I use ADO to create my XML:

objRS.save strPath adPersistXML

then the XML looks different like this example from the Northwind database:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
      xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
      xmlns:rs='urn:schemas-microsoft-com:rowset'
      xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
      <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
            <s:AttributeType name='CompanyName' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:write='true' rs:basetable='Customers'
                   rs:basecolumn='CompanyName'>
                  <s:datatype dt:type='string' dt:maxLength='40'/>
            </s:AttributeType>
            <s:AttributeType name='ContactName' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:write='true' rs:basetable='Customers'
                   rs:basecolumn='ContactName'>
                  <s:datatype dt:type='string' dt:maxLength='30'/>
            </s:AttributeType>
            <s:AttributeType name='Phone' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:write='true' rs:basetable='Customers'
                   rs:basecolumn='Phone'>
                  <s:datatype dt:type='string' dt:maxLength='24'/>
            </s:AttributeType>
            <s:extends type='rs:rowbase'/>
      </s:ElementType>
</s:Schema>
<rs:data>
      <z:row CompanyName='Alfreds Futterkiste' ContactName='Maria Anders' Phone='030-0074321'/>
      <z:row CompanyName='Ana Trujillo Emparedados y helados' ContactName='Ana Trujillo' Phone='(5) 555-4729'/>
      <z:row CompanyName='Antonio Moreno Taquería' ContactName='Antonio Moreno' Phone='(5) 555-3932'/>
      <z:row CompanyName='Around the Horn' ContactName='Thomas Hardy' Phone='(171) 555-7788'/>
      <z:row CompanyName='Berglunds snabbköp' ContactName='Christina Berglund' Phone='0921-12 34 65'/>

</rs:data>
</xml>

So now for the question: how do I work with this second XML format to accomplish the same thing? For your answer, please keep in mind that I am very new to XML/XSL and will need a little hand holding.

Thanks,

Fritz the Blank
0
Comment
Question by:fritz_the_blank
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 75

Assisted Solution

by:Anthony Perkins
Anthony Perkins earned 400 total points
ID: 9811332
There are some very capable people in this Topic Area, so no doubt they will give you the best solution, but in any case just so that I understand, there are a couple of solutions:

1. You want an XSLT to transform the first XML document, qhich will be subsequently transformed again by the XSLT listed above.

2. (Recommended) You want to use the XML generated from the recordset and transform it into the same HTML result as currently generated by the current XML/XSLT listed above.  And in consequence bypass the XML/XSLT listed.

Anthony
0
 
LVL 46

Author Comment

by:fritz_the_blank
ID: 9811389
Let's go with (2)

I tried modifying my xsl file to match the field names, but it always returned an empty table--no errors but no data...

FtB
0
 
LVL 9

Accepted Solution

by:
sparkplug earned 1600 total points
ID: 9811471
Hi,

To change your XSLT, first we need to add the namespaces defined in the XML to the XSLT file. The namespaces define the prefixes used such as s: and z:.

So the first line of the XSLT should look like:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" exclude-result-prefixes="s rs z">


Next we need to change the for-each loop so that it selects the correct nodes. We need to select each <z:row> element, therefore we change:

<xsl:for-each select="DataContent/person">

to

<xsl:for-each select="xml/rs:data/z:row">


Now for the table cells; Instead of:

<tr>
     <td><xsl:value-of select="name"/></td>
     <td><xsl:value-of select="detail"/></td>      
     <td><xsl:value-of select="age"/></td>
</tr>

we need to select each of the attributes of the <z:row> element:

<tr>
     <td><xsl:value-of select="@CompanyName"/></td>
     <td><xsl:value-of select="@ContactName"/></td>      
     <td><xsl:value-of select="@Phone"/></td>
</tr>


Note the use of @ to select attributes.

We also need to change the headers for each of the columns. The full XSLT is as follows:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" exclude-result-prefixes="s rs z">
      <xsl:template match="/">
            <html>
                  <body>
                        <h2>Data Content Display</h2>
                        <table border="0" cellspacing="2">
                              <tr bgcolor="gray">
                                    <th align="left" width="100">Company Name</th>
                                    <th align="left" width="150">Contact Name</th>
                                    <th align="left" width="50">Phone</th>
                              </tr>
                              <xsl:for-each select="xml/rs:data/z:row">
                                    <tr>
                                          <td>
                                                <xsl:value-of select="@CompanyName"/>
                                          </td>
                                          <td>
                                                <xsl:value-of select="@ContactName"/>
                                          </td>
                                          <td>
                                                <xsl:value-of select="@Phone"/>
                                          </td>
                                    </tr>
                              </xsl:for-each>
                        </table>
                  </body>
            </html>
      </xsl:template>
</xsl:stylesheet>


I see also that you are using "Microsoft.XMLDOM" in you ASP code. This refers to an old version of the XML parser. I recommend that you change this to "MSXML2.DOMDocument" as this will offer far better performance.

e.g. set source = Server.CreateObject("MSXML2.DOMDocument")


Hope this helps.

>S'Plug<



0
 
LVL 46

Author Comment

by:fritz_the_blank
ID: 9811534
Thank you to both!!!

I am going to study this carefully to see what I can learn.

Once I have a working example, I find that following tutorials and the like is a whole lot easier.


FtB
0

Featured Post

[Webinar] Lessons on Recovering from Petya

Skyport is working hard to help customers recover from recent attacks, like the Petya worm. This work has brought to light some important lessons. New malware attacks like this can take down your entire environment. Learn from others mistakes on how to prevent Petya like worms.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
Introduction Knockoutjs (Knockout) is a JavaScript framework (Model View ViewModel or MVVM framework).   The main ideology behind Knockout is to control from JavaScript how a page looks whilst creating an engaging user experience in the least …
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
The viewer will learn how to count occurrences of each item in an array.

719 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question