Subject: Re: [xsl] PARAMS and VARIABLES in XSL From: mark bordelon <markcbordelon@xxxxxxxxx> Date: Tue, 30 Jan 2007 13:18:37 -0800 (PST) |
Abel, This worked beautifully. Thank you. Also, you adressed some aspects and practices about XSL which I was not clear about. Thanks again. --- Abel Braaksma <abel.online@xxxxxxxxx> wrote: > mark bordelon wrote: > > I need help with the following problem. > > > > This is the XML is wish to transform: > > > > > > > > I have tried all sorts of solutions using axes, > > preceding-sibling, but these did not work, since > the > > <word> and <sound> are not true siblings to the > > processor, even though they are on the same level > of > > the hierarchy. > > > > Well, if you mean with "not true siblings" that you > have missed the > closing tag, you are out of luck: it is not XML. > > But you just made a copy n paste mistake, and each > sound tag is an empty > tag, here's your solution: > > <xsl:stylesheet > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:output indent="yes" /> > > <xsl:template match="word"> > <word > soundtime="{preceding-sibling::sound[1]/@time}"> > <xsl:value-of select="." /> > </word> > </xsl:template> > > <xsl:template match="text()" /> > </xsl:stylesheet> > > > The delete-template for text() is one way to get rid > of the whitespace > that would otherwise be output (but is not necessary > with your input). > > To make this work, you must first make XML from your > input. > > > > <?xml version="1.0" encoding="UTF-8"?> > > <xsl:stylesheet version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > > <xsl:template match="//clause/*"> > > > > As a general rule: never start a match with "//". It > is not necessary > for any reason. Just 'clause/*' would do if you want > to match all nodes > that have a parent 'clause' (which is not what you > want, I think). > > > <xsl:param name="soundtime" /> > > <xsl:if test="local-name() = 'sound'"> > > <xsl:param name="soundtime" select="@time" /> > > </xsl:if> > > > > Somehow this looks like trying to redefine a > parameter. Which is not > allowed, ever. Using 'local-name()' is redundant. If > you want to test > for a node that is there, just do: > > <xsl:if test="sound" >.... > > > > <xsl:if test="local-name() = 'word'"> > > > > same here > > > <word sound = "{$soundtime}" > > > > > You may be falling in the trap of thinking as XSLT > as a 'normal' > language, where 'normal' is defined as "take > variable X, assign it value > Y, read out variable X, assign it another value Z, > do something else... > etc". Which is the Java, VB, C++ etc way of doing > things. > > Not so in XSLT. Assignment of variables is not > possible at all. Here you > define the rules and the processor does the thinking > for you. If you > find yourself making many xsl:if and xsl:choose, you > are probably > missing something vital somewhere. A rule is > defined like: > > <xsl:template match="somenode"> > ... DO something IF this node is encountered in > the source > > > To select what set of nodes you want to process, you > use > xsl:apply-templates + select. > > > Cheers, > -- Abel > > ____________________________________________________________________________________ Do you Yahoo!? Everyone is raving about the all-new Yahoo! Mail beta. http://new.mail.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] PARAMS and VARIABLES in X, Abel Braaksma | Thread | Re: [xsl] PARAMS and VARIABLES in X, David Carlisle |
RE: [xsl] PARAMS and VARIABLES in X, mark bordelon | Date | Re: [xsl] Simple Question, Abel Braaksma |
Month |