Subject: Re: 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
|