Subject: Re: [xsl] Can't get output from xml -> text transformation From: Josh Canfield <joshcanfield@xxxxxxxxx> Date: Wed, 11 Aug 2004 12:07:40 -0700 |
Hmm... actually after closing the featuredGame element the provided XSL does work, although there was a lot of unwanted space. The built-in template rules allow for processing nodes deep within the tree without having to account for every parent node in the tree. It's only when you catch a node in a template match that you have to worrry about deeper nodes getting processed. It seems like what you are describing is the behavior of xsl:value-of, which is often confused for xsl:copy-of > It seems that what you are expecting to happen is for every node (every child of > a child of a child etc...) to be processed according to document order and when > there is not matching template it will simply move to the next child or > grandchild until it finds a match. This is exactly what happens... except that there is always a matching template because of the built-in template rules... See http://www.w3.org/TR/xslt#built-in-rule Josh On Wed, 11 Aug 2004 12:25:06 -0600, M. David Peterson <m.david@xxxxxxxxxx> wrote: > Hi Todd, > > Understanding what nodes are being processed and matched to a template will help > in your understanding of whats happening. <xsl:apply-templates /> is the same > thing as <xsl:apply-templates select="*"/> which will select all the children of > the current context (root) and seek out a template to match them to (in your > case there are no matching templates to the children of context - one node by > the name of "allGamesDownloadable" - and as such the "value" of each child node > is simply sent to the output "as is" until there are no more children left to > process. The "blank" lines you are seeing are most likely the newline > characters that exist as child "text" nodes of "allGamesDownloadable" in your > source XML. > > It seems that what you are expecting to happen is for every node (every child of > a child of a child etc...) to be processed according to document order and when > there is not matching template it will simply move to the next child or > grandchild until it finds a match. While this is in no way an uncommon mistake > - in fact its a VERY common mistake - it is fundamentally flawed from an XSLT > template matching perspective and as such will not provide you the results you > are looking for. If you try to think of it from the perspective that to gain > access to the children of the current context node you must begin the recursive > nature of apply-templates when the desired children are in context you will find > yourself catching your errors quite easily... for example, the following will > select the children of the root node, find the best matching template, process > it accordingly, and then begin the recursive process on the children of the > current context node ("allGamesDownloadable") by once again calling > apply-templates at a time when the children are in context. Because we are > using "*" for our match value the same template will match the children > currently being processed which means any children of these children will be > recursively processed and matched to the same template and this process will > continue until every node in the source document has gone through "the ringer" > so to speak... > > so this.... > > <?xml version="1.0"?> > <xsl:stylesheet > version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="text" /> > > <xsl:template match="/"> > <xsl:text> > GAMEID,GAMENAME > </xsl:text> > <xsl:apply-templates/> > </xsl:template> > > <xsl:template match="*"> > <xsl:value-of select="@gameId"/>, > <xsl:apply-templates/> > </xsl:template> > > Will output the value of @gameId for every node that is processed by this > template that has an attribute gameId. > > While this particular case will not give you the CSV output you are in desire of > this should give you just enough information to help move you in the right > direction... > > Best of luck to you! > > <M:D/> > > > > Todd Alexander wrote: > > I have an xsl I'm running through xalan against an xml file, with the > > output going to a csv file. My problem is that I get the output > > expected for the first template rule in the csv file but I canot get > > anything output for the second. I'm getting blank spaces for each > > node I'm expecting to hit for the second rule, so I know I'm getting > > there, but no matter what I put inside the rule (xsl:text , xsl:value- > > of etc) I cannot get any text of any kind. > > > > The source xml file looks like: > > > > <?xml version="1.0"?> > > <allGamesDownloadable> > > <featuredGameList title="Featured Downloads"> > > <featuredGame featuredHeadline="blah blah blah" > > gameId="gameOne"> > > </featuredGameList> > > <gameGroupList> > > <gameGroup title="Action Games"> > > <gameItem gameID="gameOne"/> > > <gameItem gameID="gameTwo"/> > > </gameGroup> > > <gameGroup title="Arcade"> > > <gameItem gameID="gameThree"/> > > <gameItem gameID="gameFour"/> > > </gameGroup> > > </gameGroupList> > > </allGamesDownloadable> > > > > The XSL in question is: > > <?xml version="1.0"?> > > <xsl:stylesheet > > version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:output method="text" /> > > > > <xsl:template match="/"> > > <xsl:text> > > GAMEID,GAMENAME > > </xsl:text> > > <xsl:apply-templates/> > > </xsl:template> > > > > <xsl:template match="gameItem"> > > <!-- for debugging --> > > <xsl:text>cracker</xsl:text> > > </xsl:template> > > > > </xsl:stylesheet> > > > > What I get output is: > > > > GAMEID,GAMENAME > > > > {then the expected numner of lines with varying numbers of spaces} > > > > > > > > Thanks, > > Todd Alexander > > heeznow@xxxxxxx
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Can't get output from xml, M. David Peterson | Thread | Re: [xsl] Can't get output from xml, M. David Peterson |
[xsl] Omit Data While Using Copy, Trevor Majic | Date | Re: [xsl] FO: padding within list p, J.Pietschmann |
Month |