| Subject: Re: [xsl] csv to xml converter bug From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx> Date: Wed, 11 Jul 2007 13:10:44 +0100 | 
On 7/10/07, Michael Kay <mike@xxxxxxxxxxxx> wrote: > Haven't worked out the detail, but it seems to me that if you add a trailing > comma at the end of the string, you can then do > > <xsl:analyze-string select="concat($in, ',')" regex='("[^"]*"|[^,]*),'> > <xsl:matching-substring> > <token><xsl:value-of select="regex-group(1)"/></token> > </xsl:matching-substring> > </xsl:analyze-string>
Hmm, seems to work.
> Doesn't strip the quotes off, but that part's easy.
It is, especially as Abel wrote it for me :)
I'll try it out and then write it up, thanks!
I had to modify it to cope with nested quotes, such as "foo, ""bar""" - this is what I came up with:
<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>I think its a neat use of regex-group to capture both sides of the pipe (quoted and unquoted values) but not the trailing comma. Any comments welcome.
I've posted the complete transform here: http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html
cheers andrew -- http://andrewjwelch.com
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] csv to xml converter bug, Andrew Welch | Thread | Re: [xsl] csv to xml converter bug, iwanttokeepanon | 
| Re: [xsl] the document() in IE, Abel Braaksma | Date | Re: [xsl] the document() in IE, David Carlisle | 
| Month |