|
Subject: RE: [xsl] key(), generate-id question From: "Américo Albuquerque" <aalbuquerque@xxxxxxxxxxxxxxxx> Date: Mon, 11 Nov 2002 19:39:37 -0000 |
Hi Endre.
Yes, they have to be in order, and the elements with no _id have to be
the last ones. Then I simply get the closest node that has an _id.
If they aren't, then you'll have to change the variable 'last' so it
search for the biggest one.
Something like this:
<xsl:template name="generate-id">
<xsl:variable name="lastid"> <!-- here we search for the biggest _id
-->
<xsl:call-template name="biggest"/>
</xsl:variable>
<xsl:variable name="last"
select="number(substring-after($lastid,'id'))"/> <!-- this now usea
$lastid -->
<xsl:variable name="this"
select="count(preceding-sibling::element[not(@_id)])+1"/>
<xsl:variable name="temp" select="concat('00000',$last+$this)"/>
<xsl:value-of
select="concat('id',substring($temp,string-length($temp)-5))"/>
</xsl:template>
<xsl:template name="biggest">
<xsl:for-each select="(preceding-sibling::element |
following-sibling::element)[@_id]">
<xsl:sort select="@_id"/>
<xsl:if test="position()=last()"> <!-- the one we want will be the
last one -->
<xsl:value-of select="@_id"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
This xml:
<page>
<element _id="id000001"/>
<element/>
<element _id="id000004"/>
<element _id="id000003"/>
<element/>
</page>
Now produce this result:
<page>
<element _id="id000001"/>
<element _id="id000005"/>
<element _id="id000004"/>
<element _id="id000003"/>
<element _id="id000006"/>
</page>
-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Endre
Magyari
Sent: Monday, November 11, 2002 6:59 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] key(), generate-id question
Dear Americo,
Thank you!
One question: Do you rely on the strictly ascending order of the id
values?
I will try it now,
Thanks!
Endre
----- Original Message -----
From: "Américo Albuquerque" <aalbuquerque@xxxxxxxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Monday, November 11, 2002 8:39 PM
Subject: RE: [xsl] key(), generate-id question
> Hi Endre.
>
> Ttry this.
>
> <xsl:template match="page">
> <xsl:copy>
> <xsl:apply-templates select="element[@_id] | element[not(@_id)]"/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="element">
> <element>
> <xsl:attribute name="xmi.id">
> <xsl:choose>
> <xsl:when test="@_id">
> <xsl:value-of select="@_id"/>
> </xsl:when>
> <xsl:otherwise>
> <xsl:call-template name="generate-id"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:attribute>
> </element>
> </xsl:template>
>
> <xsl:template name="generate-id">
> <xsl:variable name="last"
> select="number(substring-after(preceding-sibling::element[@_id][1]/@_i
> d,
> 'id'))"/>
> <xsl:variable name="this"
> select="count(preceding-sibling::element[not(@_id)])+1"/>
> <xsl:variable name="temp" select="concat('00000',$last+$this)"/>
> <xsl:value-of
> select="concat('id',substring($temp,string-length($temp)-5))"/>
> </xsl:template>
>
> they work with this xml:
> <page>
> <element _id="id000001"/>
> <element _id="id000002"/>
> <element _id="id000003"/>
> <element />
> <element />
> </page>
>
> And produce this:
> <page>
> <element _id="id000001"/>
> <element _id="id000002"/>
> <element _id="id000003"/>
> <element _id="id000004"/>
> <element _id="id000005"/>
> </page>
>
> If the structure of your xml is diferent (probably is) then you can
> change the 'element' in the templates by 'node()' Hope that this helps
> you.
>
>
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Endre
> Magyari
> Sent: Monday, November 11, 2002 7:30 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] key(), generate-id question
>
>
> > You can't control how generate-id() works, but you could do
> > something like write a named template that will generate the ID. For
> > example, you could count the number of preceding elements that don't
> > have an _ID attribute and then add that value to the numeric part of
> > the nearest preceding element that *does* have an _ID attribute. All
> > doable with normal XSLT functions.
>
>
> Based on this, as far as now I could do an enumeration of all the _id
> values (as numbers) from the document, but I have no idea how to
> select the one with the maximal value out of them. And Also, I have no
> idea how/where to store the new id values being assigned. The problem
> is that I've no experience with declarative languages. I can not get
> used to the idea that a variable can not vary. What I would do is that
> (if curr_value > max) max = curr_value. But how to do this here? Any
> help is greatly appreciated.
>
> <!-- ID Generator-->
> <xsl:template name="idgen">
> <xsl:for-each select="node()">
> <xsl:for-each select="@_id">
> <xsl:number value="substring-after(current(),'id')"/>;
> </xsl:for-each>
> </xsl:for-each>
> </xsl:template>
>
> Thank you,
> Endre
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] key(), generate-id questi, Endre Magyari | Thread | RE: [xsl] key(), generate-id questi, Endre, MAGYARI |
| Re: [xsl] xslt replace special char, Alice Fan | Date | RE: [xsl] key(), generate-id questi, Endre, MAGYARI |
| Month |