Converting XML Elements To Attributes To Use With GridView
When we have to use an XML document with GridView through XMLDataSource,
the document must have data in the
form of attributes. Assume we have a document,
books.xml (shown below), which contains details of books. The document contains
a book elemement for each book with an attribute isbn
and three child elements - title, author and
price.
<?xml version="1.0" encoding="utf-8" standalone ="yes" ?>
<books>
<book isbn="1">
<title>Beginning XML</title>
<author>David Hunter</author>
<price>500</price>
</book>
<book isbn="2">
<title>ASP.NET 3.5 Unleashed</title>
<author>Stephen Walther</author>
<price>799</price>
</book>
<book isbn="3">
<title>Programming C#</title>
<author>Jessy Liberty</author>
<price>450</price>
</book>
</books>
But we cannot use this document with XMLDataSource as-it-is to display data through GridView. This is because GridView expects
data to come in the form of attributes and not elements. So, we have
to convert the data that is in the form of elements to attributes using XSL
(EXtensible Stylesheet Language) and XSLT (XSL transformations).
The following .XSL file (convert.xsl) is used
to convert book element, which contains one attribute and three child elements,
to four attributes.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" method="xml" indent="yes" />
<xsl:template match="books">
<xsl:element name="books">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="book">
<xsl:element name="book">
<!-- place isbn attribute first -->
<xsl:attribute name="isbn">
<xsl:value-of select="@isbn"/>
</xsl:attribute>
<!-- convert elements to attributes -->
<xsl:for-each select="*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each >
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XSL is used to specify how to transform XML document to HTML, XML or text.
In covert.xsl, we specify
the output to be xml. A template is used to convert book element
in source to book element in output, attribute isbn to attribute isbn, but child
elements of book element to attributes. XSL element for-each
is used to take one element at a time and placing it as attribute in the output.
Function name() is used to take name of the current element
and value is taken using "." with value-of element.
If you are new to XSL, click here to learn more about XSL from a wonderful tutorial at
w3schools.com.
Now, create an asp.net page and place GridView and XMLDataSource.
Specify books.xml as the XML file and
convert.xsl
as Transform
file for XMLDataSource. Bind XMLDataSource to GridView to show data in the document as a table.
Following is the code for .aspx file.
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Books</title>
</head>
<body>
<form id="form1" runat="server">
<h2>Books </h2>
<asp:gridview ID="Gridview1" runat="server"
AutoGenerateColumns="True"
DataSourceID="XmlDataSource1">
</asp:gridview>
<asp:XmlDataSource ID="XmlDataSource1" runat="server"
DataFile="books.xml" TransformFile="~/convert.xsl"> </asp:XmlDataSource>
</form>
</body>
</html>
TransformFile attribute of XmlDataSource specifies the XSL file to be used to convert the document. Another useful
attribute of XmlDataSource is
XPath, which allow us to specify the condition to filter content.
Click here to learn more about XPATH.
Have anything to say about this blog, please provide your opinion using
Feedback Form .
Keep Learning,
Srikanth