0

Using ColdFusion to transform XML with XSLT

coldfusion

Recently, I've been working with XSLT to transform XML documents for a new project (more on the project later). I thought this would be a good item to write about. It's pretty easy to do, so let's just jump right in.

For this example I'll use the RSS 2.0 format. First we have to create the XML that we're going to transform. You could read in an XML file using any normal method (cffile, cfhttp, etc.). I'll just create my own using cfxml. I used the RSS 2.0 example from Wikipedia.

<cfxml variable="myRSS">
<rss version="2.0">
   <channel>
      <title>Liftoff News</title>
      <link>http://liftoff.msfc.nasa.gov/</link>
      <description>Liftoff to Space Exploration.</description>
      <language>en-us</language>
      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
      <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs>
      <generator>Weblog Editor 2.0</generator>
      <managingEditor>editor@example.com</managingEditor>
      <webMaster>webmaster@example.com</webMaster>

      <item>
         <title>Star City</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
         <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.</description>
         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>
      </item>

      <item>
         <title>Space Exploration</title>
         <link>http://liftoff.msfc.nasa.gov/</link>
         <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.</description>
         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>
      </item>

      <item>
         <title>The Engine That Does More</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>
         <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.</description>
         <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>
      </item>

      <item>
         <title>Astronauts' Dirty Laundry</title>
         <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
         <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.</description>
         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
         <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
         </item>
      </channel>
</rss>
</cfxml>

Next we have to create the XSTL that will be used to transform the RSS feed. I used the XSLT reference guide from zvon.org as my main reference while putting together this XSTL. Check it out if you need help with XSLT. Like the XML above, you could read in the XSLT many different ways. I'll just create it via cfsavecontent. If you're running 7.0+ you can use cfxml. For some reason, it didn't work in 6.0.

<cfsavecontent variable="myXSL">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xhtml" indent="yes" omit-xml-declaration="yes" />
   <xsl:template match="/rss/channel">
      <xsl:element name="h1">
         <xsl:element name="a">
            <xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute>
            <xsl:value-of select="title" />
         </xsl:element>
      </xsl:element>

      <xsl:for-each select="item">
         <xsl:element name="h2">
            <xsl:element name="a">
               <xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute>
               <xsl:value-of select="title" />
            </xsl:element>
         </xsl:element>

         <xsl:element name="p">
            <xsl:value-of select="description" />
         </xsl:element>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>
</cfsavecontent>

So we have the XML (RSS) and our XSLT. All we have to do now is use ColdFusion's XMLTransform() function and output our results.

<cfset myOutput = xmlTransform(myRSS, myXSL) />
<cfoutput>#myOutput#</cfoutput>

That's really all there is to it. Pretty easy, right. This is just a basic example. Just imagine what else you could do with it.

I want to end this by saying that you don't need CF to use XSL transformations. You can use XSL stylesheets directly in your XML documents. Check out some of these resources.

It should be said that this is my first go at XSLT, so if any of you have suggestions, please share.

Fro

tags:
ColdFusion
 
Fro,
Thanks for the post, it's always good to look at something new. But I think I'm missing something here, what is the advantage of formatting XML with XSL vs a normal Style Sheet?

Ryan
 
posted 1224 days ago
Add Comment Reply to: this comment OR this thread
 
fro said:
 
Ryan,

The real power comes from the manipulation that you can do, more so than just changing the appearance. As you can see in the example above, I took the content from the XML and simply put it where I wanted to within new elements (tags). This is pretty basic stuff. From what I've been reading XSLT can do so much more. You can use conditional logic, math functions, string manipulation, etc. I've only touched the surface as to what XSLT can do with this post. I plan to post more on the subject as I get more deeply involved with the project that I'm working on.

;)

Fro
 
posted 1224 days ago
Add Comment Reply to: this comment OR this thread
 
Scott said:
 
Hey Fro

Thanks for this tutorial :D
 
posted 505 days ago
Add Comment Reply to: this comment OR this thread
 

Search