|
Subject: RE: [xsl] increasing variable? From: "Andreas L. Delmelle" <a_l.delmelle@xxxxxxxxxx> Date: Sun, 7 Dec 2003 12:53:38 +0100 |
> -----Original Message-----
> From: chris poppe
>
> What im trying to do here is to halve ( sorry for my english, I
> mean divide
> by 2) the length of the Substreams. Offcourse the positions should be
> altered too and here comes the problem. I thought i could declare
> a variable
> 'position' initiate it at 134 and every time I come across a
> substream or
> mv I just add the length but as Ive understood you cant just change your
> variables?
>
Not entirely true... there is actually something as 'scope'. In essence, you
are right that variables declared at the top-level of the stylesheet can't
be modified during the transformation.
Suppose you have this at the top of your stylesheet
<xsl:variable name="start" select="134" />
Then you can't change the value of the start var, but you can use it in all
computations.
> hope anyone can help me out here, every suggestion is welcome,
>
Hard to say without seeing more of your XML. Questions arising are: Are the
MV_interior nodes always in between two SUBSTR nodes? How many of these can
be in one file? In what variation(s)?
For now, all I can see is :
The real difficulty is that you can't use the computed values from the
result nodes (otherwise it would be rather easy... just pick up the modified
values from the previous '*_interior' and use these to compute the new
offset). Another difficulty I see is that, just because you have to compute
using the original values, for the MV_interior, you would have to compute
the offset like (pseudocode) :
134 + (sumofsizes(previous SUBSTREAM_interiors) * 0.5) +
(sumofsizes(previous MV_interiors))
+ (2 * count(previous SUBSTREAM_interiors)
But the sizes would have to be decoded from the string values first... which
would make using the sum() function quite awkward.
I'm personally thinking in the direction of a two-pass solution here:
- first transform the source so that each of the *_interior elements have
two subelements <offset> and <size> (as that would be a cake-walk AIW, I'll
leave this as an exercise...)
- then, on the intermediate XML, you could probably perform the necessary
calculations on the preceding:: axes with more ease
Attempt:
<!-- for all nodes (except SUBSTREAM_interior and MV_interior), you just
want the identity transform -->
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="*" />
</xsl:copy>
</xsl:template>
<!-- for stuff and MV_end, you want to copy the content as well -->
<xsl:template match="stuff | MV_end">
<xsl:copy-of select="." />
</xsl:template>
<!-- for the very first SUBSTREAM_interior -->
<xsl:template match="//SUBSTR[1]/SUBSTREAM[1]/SUBSTREAM_interior[1]" />
<xsl:copy>
<xsl:value-of select="number($start)" /> <!-- alt. use 'offset' here -->
<xsl:text> </xsl:text>
<xsl:value-of select="size * 0.5" />
</xsl:copy>
</xsl:template>
<!-- you want to 'halve' the SUBSTREAM_interior size, but only when it's in
a SUBSTR with multiple SUBSTREAMs (correct? --in your example the last one
isn't)
for the SUBSTREAM_interiors that are not in the first SUBSTREAM of the
surrounding SUBSTR; these are the easiest -->
<xsl:template match="//SUBSTR[count(SUBSTREAM) >
1]/SUBSTREAM[position()!=1]/SUBSTREAM_interior">
<xsl:copy>
<xsl:value-of select="preceding::SUBSTREAM_interior[1]/offset
+ (sum(preceding::SUBSTREAM_interior[1]/size) * 0.5)
+ 2" />
<xsl:text> </xsl:text>
<xsl:value-of select="size * 0.5" />
</xsl:copy>
</xsl:template>
<!-- for the MV_interiors, and the SUBSTREAM_interiors in a SUBSTR with only
one SUBSTREAM something like -->
<xsl:template match="MV_interior | //SUBSTR[count(SUBSTREAM) =
1]/SUBSTREAM/SUBSTREAM_interior">
<xsl:copy>
<xsl:value-of select="number($start)
+ (sum(preceding::SUBSTR[count(SUBSTREAM) >
1]/SUBSTREAM/SUBSTREAM_interior/size)
+ (2 * count(preceding::SUBSTREAM_interior))) * 0.5
+ (sum(preceding::SUBSTR[count(SUBSTREAM) =
1]/SUBSTREAM/SUBSTREAM_interior/size))
+ (sum(preceding::MV_interior/size))" />
<xsl:text> </xsl:text>
<xsl:value-of select="size" />
</xsl:copy>
</xsl:template>
<!-- for the first SUBSTREAM_interior in a SUBSTR with more than one
SUBSTREAM, the same except for the size -->
<xsl:template match="//SUBSTR[count(SUBSTREAM) >
1]/SUBSTREAM[1]/SUBSTREAM_interior">
<xsl:copy>
<xsl:value-of select="number($start)
+ (sum(preceding::SUBSTR[count(SUBSTREAM) >
1]/SUBSTREAM/SUBSTREAM_interior/size)
+ (2 * count(preceding::SUBSTREAM_interior))) * 0.5
+ (sum(preceding::SUBSTR[count(SUBSTREAM) =
1]/SUBSTREAM/SUBSTREAM_interior/size))
+ (sum(preceding::MV_interior/size))" />
<xsl:text> </xsl:text>
<xsl:value-of select="size * 0.5" />
</xsl:copy>
</xsl:template>
Hope this helps!
Cheers,
Andreas
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] increasing variable?, chris poppe | Thread | RE: [xsl] increasing variable?, Andreas L. Delmelle |
| [xsl] Re: sort on param value, Dimitre Novatchev | Date | FW: [xsl] increasing variable?, Andreas L. Delmelle |
| Month |