xsl-list
[Top] [All Lists]

Re: [xsl] PARAMS and VARIABLES in XSL

2007-01-30 14:18:58
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(_dot_)online(_at_)xs4all(_dot_)nl> 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


--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





 
____________________________________________________________________________________
Do you Yahoo!?
Everyone is raving about the all-new Yahoo! Mail beta.
http://new.mail.yahoo.com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>