Friday, June 10, 2005

XSL Transformations

XSL Transformations

This is a really good resource for xsl transformations. One of the useful things to me is the section about using xsl:element and xsl:attribute when transforming from xml to xml.

http://www.ibiblio.org/xml/books/bible2/chapters/ch17.html#d1e6328

I had an interesting case where I needed to transform an "extensible" database model into a more usable xml structure.

This is the original output of a SQL Server stored proc using For Xml Auto:

<root>
<transaction transactionid="1">
<vendor vendordescription="DU">
<status statusdescription="Created">
<transactionattribute attributeid="1" attributekey="TestAttribute1"
attributevalue="TestValue1" attributedatatype="String">
<transactionattribute attributeid="2" attributekey="TestAttribute2"
attributevalue="TestValue2" attributedatatype="String">
</transactionattribute>
</transactionattribute>
</status>
</vendor>
</transaction>
</root>

I needed the output to be in a format somewhat like this:

<transactions>
<transaction>
<transactionid>1</transactionid>
<vendorname>DU</vendorname>
<status>Created</status>
<testattribute1>TestValue1</testattribute1>
<testattribute2>TestValue2</testattribute2>
</transaction>
</transactions>

So, to accomplish this I created this xsl transformation script:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:template match="/">
<Transactions>
<Transaction>
<xsl:element name="TransactionID">
<xsl:value-of select="//Transaction/@TransactionID" />
</xsl:element>
<xsl:element name="VendorName">
<xsl:value-of select="//Vendor/@VendorDescription" />
</xsl:element>
<xsl:element name="Status">
<xsl:value-of select="//Status/@StatusDescription" />
</xsl:element>
<xsl:for-each select="//TransactionAttribute">
<xsl:element name="{@AttributeKey}">
<xsl:value-of select="@AttributeValue" />
</xsl:element>
</xsl:for-each>
</Transaction>
</Transactions>
</xsl:template>
</xsl:stylesheet>

No comments: