[vox-tech] complex XML to CSV via XSLT

Harold Lee harold at hotelling.net
Wed Jul 14 15:52:47 PDT 2010


I don't think it'll work to have several result-document instructions,
that'll probably overwrite the file or fail instead of appending.

So what you'd need is to match the pedon_collection, put the
result-document instruction at that level and then apply templates to
each pedon/vegitation/vegitation_record from there.

Maybe this (untested)?

        <xsl:template match="pedon_collection">
                <xsl:result-document href="vegetation.csv" format="csv">
                <xsl:apply-templates select="pedon/vegetation/*" />
                </xsl:result-document>
        </xsl:template>


On Wed, Jul 14, 2010 at 2:10 PM, Dylan Beaudette
<debeaudette at ucdavis.edu> wrote:
> Thanks!
>
> That seemed to do the trick. However, I have a new problem.
>
> The following works when I have a simple XML document with only 1 'pedon'
> per 'pedon_collection'
>
>        <xsl:template match="pedon_collection/pedon/vegetation">
>                <xsl:result-document href="vegetation.csv" format="csv">
>                <xsl:apply-templates select="*" />
>                </xsl:result-document>
>        </xsl:template>
>
>        <xsl:template match="vegetation_record">
>                <xsl:apply-templates />
>                <xsl:if test="following-sibling::*">
>                <xsl:value-of select="$break" />
>                </xsl:if>
>        </xsl:template>
>
>        <xsl:template match="vegetation_record/*">
>                <!-- remove normalize-space() if you want keep white-space at it is -->
>                <xsl:value-of select="concat($quote, normalize-space(.), $quote)" />
>                <xsl:if test="following-sibling::*">
>                <xsl:value-of select="$delim" />
>                </xsl:if>
>        </xsl:template>
>
> How can I apply these rules to _each_ 'pedon' in a 'pedon_collection', such
> the results are appended to the same file?
>
> Thanks!
> Dylan
>
>
>
> On Wednesday 14 July 2010, Harold Lee wrote:
>> If you want one XSLT program to output multiple files, then use the
>> result-document instruction/element:
>>
>> http://www.w3.org/TR/xslt20/#element-result-document
>>
>> It allows you to specify all of the formatting options available via
>> xsl:output, so you can output text - i.e. CSV - this way.
>>
>> Harold
>>
>> On Wed, Jul 14, 2010 at 11:40 AM, Dylan Beaudette
>>
>> <debeaudette at ucdavis.edu> wrote:
>> > Hi,
>> >
>> > I have an XML file generated via PHP, and containing the contents of
>> > several linked tables from a relational database. I would like to
>> > generalize some sample XSLT documents to convert the entire file into a
>> > sequence of CSV files. The XML file will essentially be exploded back
>> > into a set of CSV files, one for each of the original tables. The idea
>> > would be to create a couple XSLT files for converting the XML format into
>> > several possible output formats.
>> >
>> > Attached is the XML file, as well as two XSLT files. I suppose that I
>> > could loop over the tables of interest, and apply separate XSLT files to
>> > the original XML-- saving to different output files each time. It would
>> > be more convenient to have all of that logic embedded in the XSLT file--
>> > if possible.
>> >
>> > Any ideas?
>> >
>> > Cheers,
>> > Dylan
>> >
>> >
>> > --
>> > Dylan Beaudette
>> > Soil Resource Laboratory
>> > http://casoilresource.lawr.ucdavis.edu/
>> > University of California at Davis
>> > 530.754.7341
>> >
>> > _______________________________________________
>> > vox-tech mailing list
>> > vox-tech at lists.lugod.org
>> > http://lists.lugod.org/mailman/listinfo/vox-tech
>
>
>
> --
> Dylan Beaudette
> Soil Resource Laboratory
> http://casoilresource.lawr.ucdavis.edu/
> University of California at Davis
> 530.754.7341
>


More information about the vox-tech mailing list