|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: 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]/@_id,
'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: 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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








