Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Handing dataset type from XML to Xls for Excel
Message
 
To
01/05/2006 18:45:16
General information
Forum:
ASP.NET
Category:
XML
Miscellaneous
Thread ID:
01118226
Message ID:
01118242
Views:
12
This message has been marked as the solution to the initial question of the thread.
Hi Michel,

Since you have the XSD Schema along with the XML document, you can make your Xsl transformation smart enough to infer what is the type of the element it is processing at any given time. This way you can test for each type individually and format the resulting XML document accordingly.

This example shows how these tests can be made for the types xs:decimal and xs:string
<xsl:stylesheet version="1.0"
	xmlns="urn:schemas-microsoft-com:office:spreadsheet"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
	xmlns:msxsl="urn:schemas-microsoft-com:xslt"
	xmlns:user="urn:my-scripts"
	xmlns:o="urn:schemas-microsoft-com:office:office"
	xmlns:x="urn:schemas-microsoft-com:office:excel"
	xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
	xmlns:xs="http://www.w3.org/2001/XMLSchema" >

	<xsl:template match="/">
		<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
		  xmlns:o="urn:schemas-microsoft-com:office:office"
		  xmlns:x="urn:schemas-microsoft-com:office:excel"
		  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
		  xmlns:html="http://www.w3.org/TR/REC-html40">
			<xsl:apply-templates/>
		</Workbook>
	</xsl:template>


	<xsl:template match="/*">
		<Worksheet>
			<xsl:attribute name="ss:Name">
				<xsl:value-of select="local-name(/*/*)"/>
			</xsl:attribute>
			<Table x:FullColumns="1" x:FullRows="1">
				<Row>
					<xsl:for-each select="*[position() = 1]/*">
						<Cell>
							<Data ss:Type="String">
								<xsl:value-of select="local-name()"/>
							</Data>
						</Cell>
					</xsl:for-each>
				</Row>
				<xsl:apply-templates/>
			</Table>
		</Worksheet>
	</xsl:template>


	<xsl:template match="/*/*">
		<Row>
			<xsl:apply-templates/>
		</Row>
	</xsl:template>


	<xsl:template match="/*/*/*">
		<Cell>
			<xsl:choose>
				<xsl:when test="//xs:element[ @name = local-name(current()) ]/@type = 'xs:decimal'">
					<Data ss:Type="Number">
						<xsl:value-of select="."/>
					</Data>
				</xsl:when>
				<xsl:when test="//xs:element[ @name = local-name(current()) ]/@type = 'xs:string'">
					<Data ss:Type="String">
						<xsl:value-of select="."/>
					</Data>
				</xsl:when>
			</xsl:choose>
		</Cell>
	</xsl:template>


</xsl:stylesheet>
-----
Fabio Vazquez
http://www.fabiovazquez.com
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform