An XSLT style sheet can be applied to translate data from one XML grammar to another. Suppose that you receive stock quotes marked up in the following format:
<?xml version="1.0"?>
<investments>
<item type="stock" exch="nyse" symbol="ZCXM" company="zacx corp"
price="28.875"/>
<item type="stock" exch="nasdaq" symbol="ZFFX" company="zaffymat inc"
price="92.250"/>
<item type="stock" exch="nasdaq" symbol="ZYSZ" company="zysmergy inc"
price="20.313"/>
</investments>
You want to add this information to your portfolio of the following format.
<?xml version="1.0"?>
<portfolio>
<stock exchange="nyse">
<name>zacx corp</name>
<symbol>ZCXM</symbol>
<price>28.875</price>
</stock>
<stock exchange="nasdaq">
<name>zaffymat inc</name>
<symbol>ZFFX</symbol>
<price>92.250</price>
</stock>
<stock exchange="nasdaq">
<name>zysmergy inc</name>
<symbol>ZYSZ</symbol>
<price>20.313</price>
</stock>
</portfolio>
This amounts to translating from one XML schema to another. You can use XSLT to transform the <investments>
data into the <portfolio>
grammar. When you do this, your templates will contain output elements such as <stock>
, instead of HTML elements. The following XSLT style sheet is an example.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<portfolio>
<xsl:for-each select="investments/item[@type='stock']">
<stock>
<xsl:attribute name="exchange">
<xsl:value-of select="@exch"/>
</xsl:attribute>
<name><xsl:value-of select="@company"/></name>
<symbol><xsl:value-of select="@symbol"/></symbol>
<price><xsl:value-of select="@price"/></price>
</stock>
</xsl:for-each>
</portfolio>
</xsl:template>
</xsl:stylesheet>
The translation can be performed in reverse with a similar style sheet, converting <portfolio>
data to the <investments>
grammar.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<investments>
<xsl:for-each select="portfolio/stock">
<item type="stock">
<xsl:attribute name="exch"><xsl:value-of select="@exchange"/></xsl:attribute>
<xsl:attribute name="symbol"><xsl:value-of select="symbol"/></xsl:attribute>
<xsl:attribute name="company"><xsl:value-of select="name"/></xsl:attribute>
<xsl:attribute name="price"><xsl:value-of select="price"/></xsl:attribute>
</item>
</xsl:for-each>
</investments>
</xsl:template>
</xsl:stylesheet>
Note that <xsl:attribute>
is used not only to copy an attribute value to a new attribute, but also to convert element content to attribute values.