|
Subject: Re: [xsl] XML to XML transformation From: "Simon Kelly" <kelly@xxxxxxxxxx> Date: Tue, 15 Apr 2003 09:50:27 +0200 |
Cheers for that Mike, it will be most useful.
Here is the more complex structure I want to create (data from source in the
[]).
<!-- <mdatas>
<label>[from external reference]</label>
<starttime>[ROWSET/first-child()/TIMESTAMP</starttime>
<endtime>[ROWSET/last-child()/TIMESTAMP</endtime>
[for-each-child() of ROWSET]
<mdata>
[if first-child()]
<timestamp>[TIMESTAMP]</timestamp>
[end-if]
[for-each-child() && not(first-child())]
<svalue>
<label>[local-name()]</label>
<value>[text()]</value>
</svalue>
[end-for]
</mdata>
[end-for]
</mdatas> -->
Since my last post I have created a xsl to do this (I think, as I can'T get
it to run yet from other bugs) but I'm not sure if I am using xsl correctly
to produce a Document rather than text. It looks ok to me, but does seem a
little shoddy, but here it is:
"<xsl:stylesheet version="1.0"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"
"<xsl:output method="text"/>"
"<xsl:template match="/">"
" <slowcontrol>"
" <xsl:apply-templates />"
" </slowcontrol>"
"</xsl:template>"
"<xsl:template match="ROWSET">"
" <measuringdatasequence>"
" <label>fp1v1</label>"
" <xsl:for-each select="ROW">"
" <xsl:choose>"
" <xsl:when test="position() = 1">"
" <starttime><xsl:value-of select="./TIMESTAMP/text()"
/></starttime>"
" </xsl:when>"
" <xsl:when test="position() = last()">"
" <endtime><xsl:value-of select="./TIMESTAMP/text()" /></endtime>"
" </xsl:when>"
" <xsl:otherwise />"
" </xsl:choose>"
" </xsl:for-each>"
" <xsl:apply-templates />"
" </measuringdatasequence>"
"</xsl:template>"
"<xsl:template match="ROW">"
" <measuringdata>"
" <xsl:for-each select="*">"
" <xsl:choose>"
" <xsl:when test="string(local-name())=string('TIMESTAMP')">"
" <timestamp><xsl:value-of select="./text()" /></timestamp>"
" </xsl:when>"
" <xsl:otherwise>"
" <sensorvalue>"
" <label><xsl:value-of select="local-name()" /></label>"
" <value><xsl:value-of select="./text()" /></value>"
" </sensorvalue>"
" </xsl:otherwise>"
" </xsl:choose>"
" </xsl:for-each>"
"</xsl:template>"
"</xsl:stylesheet>"
Any help would be most appriciated.
Kind regards
Simon
----- Original Message -----
From: "Mike Brown" <mike@xxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Monday, April 14, 2003 9:29 PM
Subject: Re: [xsl] XML to XML transformation
> Simon Kelly wrote:
> > I have been looking throught the xslt-cookbook to try to work out the
best
> > was of turning an flat XML document, in to quite a deep complex
document.
> > But I am having a couple of problems working out what it the best way of
> > doing this in xsl.
> >
> > The flat structure is an output from a relational db, using ROWSET, ROW
then
> > $column-name as the child node identifiers.
>
> You mean you have something like this?
>
> <DATA>
> <ROWSET>
> <ROW>
> <Id>123</Id>
> <GivenName>Jane</GivenName>
> <FamilyName>Doe</FamilyName>
> </ROW>
> ...
> </ROWSET>
> ...
> </DATA>
>
> What's your definition of deep and complex, i.e. what is an example of the
> XML you want in your output, given the above input?
>
> > However, I will be keeping none of the node names in the new structure,
> > and I want xsl to create a new document and not a string output.
> > I am using the javax.xml.transform.Transformer.
>
> In XSLT, you create a new document in the form of an XPath node tree that
is
> similar to a DOM Document object. Typically, this "result tree" is
serialized
> as an encoded string after construction, but different XSLT processors
offer
> alternative types of output, including DOM Document objects. Processors
that
> implement JAXP may support the DOMResult class, which you can create an
> instance of to be the destination for the result tree. You pass this
instance
> as the second argument to the Transformer's transform() method. Read more
about
> DOMResult in the javax.xml.transform docs. Your XSLT processor probably
comes
> with examples demonstrating its usage.
>
> When constructing the new result tree, you are free to create any nodes
you
> want, and to traverse any part of the source tree, starting at the root
node.
> Your new elements and attributes can be given any names you want; there's
no
> obligation to copy the input, or to even base anything on the input at
all.
>
> > I also need the transform to be very quick, as the relational document
size
> > can be in excess of 4MB.
>
> This will be more of a problem. Very large input files are difficult to
> process because some nuances of XSLT require that the document be cached
and
> operated on with the entire document being in memory at once. There are
> various ideas for working around this, including using a SAX parser to
break
> the document into chunks that the XSLT processor can handle more quickly
(and
> then you have to collect and reassemble the output yourself),
vendor-specific
> extension functions such as saxon:preview (but only in limited
situations),
> and using SAX-based transformation approaches such as STX. See also
> http://www.biglist.com/lists/xsl-list/archives/200301/msg00804.html
>
> Mike
>
> --
> Mike J. Brown | http://skew.org/~mike/resume/
> Denver, CO, USA | http://skew.org/xml/
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] XML to XML transformation, Mike Brown | Thread | [xsl] xml to xml transformation, Steven Curry |
| RE: [xsl] why doesn't 'self::NODE' , Michael Kay | Date | RE: [xsl] why doesn't 'self::NODE' , Michael Kay |
| Month |