Tuesday, March 11, 2014

XSLT: Structuring Data in Attributes or in Child Elements

We are free to select tags to our liking, so are to build an XML structure, whether it is element-based, where there is almost no attributes in the XML tree (see the following exmample) or attribute-based (converted by XSLT code to be shown below).

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
 <cd>
  <title>Empire Burlesque</title>
  <artist>Bob Dylan</artist>
  <country>USA</country>
  <company>Columbia</company>
  <price>10.90</price>
  <year>1985</year>
 </cd>
 <cd>
  <title>Hide your heart</title>
  <artist>Bonnie Tyler</artist>
  <country>UK</country>
  <company>CBS Records</company>
  <price>9.90</price>
  <year>1988</year>
 </cd>
 <cd>
  <title>Greatest Hits</title>
  <artist>Dolly Parton</artist>
  <country>USA</country>
  <company>RCA</company>
  <price>9.90</price>
  <year>1982</year>
 </cd>
 <cd>
  <title>Still got the blues</title>
  <artist>Gary Moore</artist>
  <country>UK</country>
  <company>Virgin records</company>
  <price>10.20</price>
  <year>1990</year>
 </cd>
 <cd>
  <title>Eros</title>
  <artist>Eros Ramazzotti</artist>
  <country>EU</country>
  <company>BMG</company>
  <price>9.90</price>
  <year>1997</year>
 </cd>
 <cd>
  <title>One night only</title>
  <artist>Bee Gees</artist>
  <country>UK</country>
  <company>Polydor</company>
  <price>10.90</price>
  <year>1998</year>
 </cd>
 <cd>
  <title>Sylvias Mother</title>
  <artist>Dr.Hook</artist>
  <country>UK</country>
  <company>CBS</company>
  <price>8.10</price>
  <year>1973</year>
 </cd>
 <cd>
  <title>Maggie May</title>
  <artist>Rod Stewart</artist>
  <country>UK</country>
  <company>Pickwick</company>
  <price>8.50</price>
  <year>1990</year>
 </cd>
 <cd>
  <title>Romanza</title>
  <artist>Andrea Bocelli</artist>
  <country>EU</country>
  <company>Polydor</company>
  <price>10.80</price>
  <year>1996</year>
 </cd>
 <cd>
  <title>When a man loves a woman</title>
  <artist>Percy Sledge</artist>
  <country>USA</country>
  <company>Atlantic</company>
  <price>8.70</price>
  <year>1987</year>
 </cd>
 <cd>
  <title>Black angel</title>
  <artist>Savage Rose</artist>
  <country>EU</country>
  <company>Mega</company>
  <price>10.90</price>
  <year>1995</year>
 </cd>
 <cd>
  <title>1999 Grammy Nominees</title>
  <artist>Many</artist>
  <country>USA</country>
  <company>Grammy</company>
  <price>10.20</price>
  <year>1999</year>
 </cd>
 <cd>
  <title>For the good times</title>
  <artist>Kenny Rogers</artist>
  <country>UK</country>
  <company>Mucik Master</company>
  <price>8.70</price>
  <year>1995</year>
 </cd>
 <cd>
  <title>Big Willie style</title>
  <artist>Will Smith</artist>
  <country>USA</country>
  <company>Columbia</company>
  <price>9.90</price>
  <year>1997</year>
 </cd>
 <cd>
  <title>Tupelo Honey</title>
  <artist>Van Morrison</artist>
  <country>UK</country>
  <company>Polydor</company>
  <price>8.20</price>
  <year>1971</year>
 </cd>
 <cd>
  <title>Soulsville</title>
  <artist>Jorn Hoel</artist>
  <country>Norway</country>
  <company>WEA</company>
  <price>7.90</price>
  <year>1996</year>
 </cd>
 <cd>
  <title>The very best of</title>
  <artist>Cat Stevens</artist>
  <country>UK</country>
  <company>Island</company>
  <price>8.90</price>
  <year>1990</year>
 </cd>
 <cd>
  <title>Stop</title>
  <artist>Sam Brown</artist>
  <country>UK</country>
  <company>A and M</company>
  <price>8.90</price>
  <year>1988</year>
 </cd>
 <cd>
  <title>Bridge of Spies</title>
  <artist>T`Pau</artist>
  <country>UK</country>
  <company>Siren</company>
  <price>7.90</price>
  <year>1987</year>
 </cd>
 <cd>
  <title>Private Dancer</title>
  <artist>Tina Turner</artist>
  <country>UK</country>
  <company>Capitol</company>
  <price>8.90</price>
  <year>1983</year>
 </cd>
 <cd>
  <title>Midt om natten</title>
  <artist>Kim Larsen</artist>
  <country>EU</country>
  <company>Medley</company>
  <price>7.80</price>
  <year>1983</year>
 </cd>
 <cd>
  <title>Pavarotti Gala Concert</title>
  <artist>Luciano Pavarotti</artist>
  <country>UK</country>
  <company>DECCA</company>
  <price>9.90</price>
  <year>1991</year>
 </cd>
 <cd>
  <title>The dock of the bay</title>
  <artist>Otis Redding</artist>
  <country>USA</country>
  <company>Atlantic</company>
  <price>7.90</price>
  <year>1987</year>
 </cd>
 <cd>
  <title>Picture book</title>
  <artist>Simply Red</artist>
  <country>EU</country>
  <company>Elektra</company>
  <price>7.20</price>
  <year>1985</year>
 </cd>
 <cd>
  <title>Red</title>
  <artist>The Communards</artist>
  <country>UK</country>
  <company>London</company>
  <price>7.80</price>
  <year>1987</year>
 </cd>
 <cd>
  <title>Unchain my heart</title>
  <artist>Joe Cocker</artist>
  <country>USA</country>
  <company>EMI</company>
  <price>8.20</price>
  <year>1987</year>
 </cd>
</catalog>

With the help of XSLT, we can easily transform element-based data into attribute-based data. Several points to notice in the XSLT code:

  • child selector child::
  • element name name()
  • element text text()
  • dynamic attribute name {name()}
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <catalog>
        <xsl:for-each select="catalog/cd">
            <cd>
                <xsl:for-each select="child::*">
                    <xsl:attribute name="{name(.)}">
                        <xsl:value-of select="text()"/>
                    </xsl:attribute>
                </xsl:for-each>
            </cd>
        </xsl:for-each>
        </catalog>
    </xsl:template>
</xsl:stylesheet>

Result: the attribute-based data.

<catalog>
    <cd title="Empire Burlesque" artist="Bob Dylan" country="USA" company="Columbia" price="10.90" year="1985" />
    <cd title="Hide your heart" artist="Bonnie Tyler" country="UK" company="CBS Records" price="9.90" year="1988" />
    <cd title="Greatest Hits" artist="Dolly Parton" country="USA" company="RCA" price="9.90" year="1982" />
    <cd title="Still got the blues" artist="Gary Moore" country="UK" company="Virgin records" price="10.20" year="1990" />
    <cd title="Eros" artist="Eros Ramazzotti" country="EU" company="BMG" price="9.90" year="1997" />
    <cd title="One night only" artist="Bee Gees" country="UK" company="Polydor" price="10.90" year="1998" />
    <cd title="Sylvias Mother" artist="Dr.Hook" country="UK" company="CBS" price="8.10" year="1973" />
    <cd title="Maggie May" artist="Rod Stewart" country="UK" company="Pickwick" price="8.50" year="1990" />
    <cd title="Romanza" artist="Andrea Bocelli" country="EU" company="Polydor" price="10.80" year="1996" />
    <cd title="When a man loves a woman" artist="Percy Sledge" country="USA" company="Atlantic" price="8.70" year="1987" />
    <cd title="Black angel" artist="Savage Rose" country="EU" company="Mega" price="10.90" year="1995" />
    <cd title="1999 Grammy Nominees" artist="Many" country="USA" company="Grammy" price="10.20" year="1999" />
    <cd title="For the good times" artist="Kenny Rogers" country="UK" company="Mucik Master" price="8.70" year="1995" />
    <cd title="Big Willie style" artist="Will Smith" country="USA" company="Columbia" price="9.90" year="1997" />
    <cd title="Tupelo Honey" artist="Van Morrison" country="UK" company="Polydor" price="8.20" year="1971" />
    <cd title="Soulsville" artist="Jorn Hoel" country="Norway" company="WEA" price="7.90" year="1996" />
    <cd title="The very best of" artist="Cat Stevens" country="UK" company="Island" price="8.90" year="1990" />
    <cd title="Stop" artist="Sam Brown" country="UK" company="A and M" price="8.90" year="1988" />
    <cd title="Bridge of Spies" artist="T`Pau" country="UK" company="Siren" price="7.90" year="1987" />
    <cd title="Private Dancer" artist="Tina Turner" country="UK" company="Capitol" price="8.90" year="1983" />
    <cd title="Midt om natten" artist="Kim Larsen" country="EU" company="Medley" price="7.80" year="1983" />
    <cd title="Pavarotti Gala Concert" artist="Luciano Pavarotti" country="UK" company="DECCA" price="9.90" year="1991" />
    <cd title="The dock of the bay" artist="Otis Redding" country="USA" company="Atlantic" price="7.90" year="1987" />
    <cd title="Picture book" artist="Simply Red" country="EU" company="Elektra" price="7.20" year="1985" />
    <cd title="Red" artist="The Communards" country="UK" company="London" price="7.80" year="1987" />
    <cd title="Unchain my heart" artist="Joe Cocker" country="USA" company="EMI" price="8.20" year="1987" />
</catalog>

No comments:

Post a Comment

Myriad

Visitors