Re: [xsl] CSV to XML transformation XSLT to include special characters?

Subject: Re: [xsl] CSV to XML transformation XSLT to include special characters?
From: "Marney Cotterill" <marney@xxxxxxxxxxxxxxxxxxxx>
Date: Thu, 03 Apr 2008 11:04:53 +1000
I found this from David Carlisle at 
http://www.dpawson.co.uk/xsl/sect2/N7150.html

> is any simple method to convert the national
> characters E D \ V and such to a format that the
> XML parser understands?
Most likely you don't need to convert anything, just tell the parser you are using 
Latin1 stick this 

<?xml version="1.0" encoding="iso-8859-1"?>

at the top 

Tried this with no luck - any other ideas?


> Hi Listers,
> 
> I have modified an XSLT orgignally developed by Andrew Welch to transform 
a 
> CSV to an XML for importing data into a dynamic website. I am brand new to 
> XSL and XSLT and have hit a small snag with the transform.
> 
> I've done some testing and I think it comes down to the inclusion of special 
> characters in my CSV, which essentially breaks the transform, giving a blank 
> result - it does not even display the error messege.
> 
> Using XML 1.0 and processing with Kernow.
> 
> XSLT Below:
> 
> <?xml version="1.0"?>
> <!--
> 	A CSV to XML transform
> 	Version 2
> 	Andrew Welch
> 	http://andrewjwelch.com
> 	
> 	Modify or supply the $pathToCSV parameter and run the transform
> 	using "main" as the initial template.
> 	
> 	For bug reports or modification requests contact me at 
> andrew.j.welch@xxxxxxxxx
> -->
>   		
> <xsl:stylesheet version="2.0"
> 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> 	xmlns:xs="http://www.w3.org/2001/XMLSchema";
>   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
> 	xmlns:fn="fn"
> 	exclude-result-prefixes="xs fn">
> 
> <xsl:output indent="yes" encoding="US-ASCII"/>
> 
> <xsl:param name="pathToCSV" select="'file:///c:/fish.csv'"/>
> 
> <xsl:function name="fn:getTokens" as="xs:string+">
> 	<xsl:param name="str" as="xs:string"/>
> 		<xsl:analyze-string select="concat($str, ',')" 
> regex='(("[^"]*")+|[^,]*),'>
> 			<xsl:matching-substring>
> 				<xsl:sequence 
> select='replace(regex-group(1), "^""|""$|("")""", "$1")'/>
> 			</xsl:matching-substring>
> 		</xsl:analyze-string>
> </xsl:function>
> 
> <xsl:template match="/" name="main">
>   <xsl:variable name="csvconverted">
>   <xsl:choose>
>     <xsl:when test="unparsed-text-available($pathToCSV)">
>       <xsl:variable name="csv" select="unparsed-text($pathToCSV)"/>
>       <xsl:variable name="lines" select="tokenize($csv, '&#xD;&#xA;')" 
> as="xs:string+"/>
>       <xsl:variable name="elemNames" select="fn:getTokens($lines[1])" 
> as="xs:string+"/>
>         <root>
>           <xsl:for-each select="$lines[position() > 1]">
>             <row>
>               <xsl:variable name="lineItems" select="fn:getTokens(.)" 
> as="xs:string+"/>
>               <xsl:for-each select="$elemNames">
>                 <xsl:variable name="pos" select="position()"/>
>                 <xsl:element name="{.}">
>                   <xsl:value-of select="$lineItems[$pos]"/>
>                 </xsl:element>
>               </xsl:for-each>
>             </row>
>           </xsl:for-each>
>         </root>
>       </xsl:when>
>     <xsl:otherwise>
>       <xsl:text>Cannot locate : </xsl:text>
>       <xsl:value-of select="$pathToCSV"/>
>     </xsl:otherwise>
>   </xsl:choose>
>   </xsl:variable>
>   <xsl:apply-templates select="$csvconverted/root"/>
> </xsl:template>
> 
>   <xsl:template match="/root">
>     <xmodexport version="4.0" generationdate="2008-03-27 22:52:04.984" 
> portalid="0">
>       <records>
>         <xsl:apply-templates select="row">
>         </xsl:apply-templates>
>       </records>
>     </xmodexport>
>   </xsl:template>
>   <xsl:template match="row">
>     <record id="-1" formid="22" portalid="0" adduser="1" updateuser="1" 
> approved="true" dateadded="2008-04-18 00:00:00.000" datemodified="2006-
04-
> 18 00:00:00.000" displaydate="2006-04-17 00:00:00.000" expirydate="9999-
12-
> 31 23:59:59.000">
>       <InstanceData>
>         <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
>         <instance>
>           <xsl:copy-of select="./*"></xsl:copy-of>
>         </instance>
>         <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
>       </InstanceData>
>     </record>
>   </xsl:template>
>   </xsl:stylesheet>
> 
> An excerpt from my CSV:
> 
> 
classdate,classname,classtime,classcode,classcost,xmodid,guestlink,classdesc
> ription
> 3/03/2008,Sydney eats presentsV,6.30pm - 8.30pm,ALI,$75,Ashley 
> Hughes,Ashley Hughes from Alio ,"Ashleyms time at Londonms River CafH and 
his 
> travels throughout Italy have given him a simple, flexible cooking style typical 
of 
> Italian cuisine.  At this hands-on dinner class hemll show you how he 
combines 
> premium produce with simple fresh flavours to produce delicious Italian food."
> 
> The "H" in CafH is a special character. When I delete and replace with a 
> normal"e" the stylesheet runs perfectly.
> 
> Is there a way to include these special charters into the XSLT?
> 
> Thanks, 
> Marney



-- 

Current Thread