xsl-list
[Top] [All Lists]

Re: Assigning unique id to new node using generate-id()

2003-08-13 12:47:01
Thanks for all of your feedback.  I've got a solution that will meet my 
requirements.

I've added a nextCredentialID attribute to the users profile.  This will serve 
as
a counter, that I will update each time I add a new credential (but won't change
when I edit or delete a credential).

Then for the credentialID of the new node, I prefix with a 'c' so it's a valid
xml ID attribute.

Below is the sylesheet I'm using to add a new credential.

    <xsl:template match="/profile">
        <profile>
            <xsl:attribute name="nextCredentialID">
                <xsl:value-of select="number(@nextCredentialID) + number('1')"/>
            </xsl:attribute>
            <xsl:for-each select="credential">
                <xsl:copy-of select="."/>
            </xsl:for-each>
            <credential>
                <xsl:attribute name="id">
                    <xsl:value-of select="concat('c', @nextCredentialID)"/>
                </xsl:attribute>
                <username><xsl:value-of select="$username"/></username>
                <password><xsl:value-of select="$password"/></password>
                <description><xsl:value-of select="$description"/></description>
                <lastModified><xsl:value-of
select="java:getCurrentDateTimeGMT($dateHelper)"/></lastModified>
            </credential>
    </xsl:template>

Thanks again for your help.
Kyle

On Wed, 13 Aug 2003 17:57 , David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> 
sent:


It appears as if the generate-id
call doesn't observe existing id's in the current/copied credential nodes. 

that is so, the only thing generate-id() is defined to do is 
return a unique string that matches the Name production (so is usable as
an id) when applied to any node in the source. 

My current workaround is to transform twice.  The first transformation 
appends
the new credential node.  The second transformation assigns an id (using
generate-id()) to any credential nodes without an id (probably only newly
created).  Seems like I should be able to do it all in one transform.

That doesn't sound a safe workaround. You have no assurance that the ids
generated on the second pass won't be teh same as an existing id in your
source.

If you don't need the ids to be stable you could of course regenerate
the document wioth new ids in each case, generated by generate-id() they
would all then be distinct but also typically didffernt from teh id in
teh source.

Otherwise you need a different way to generate unique id. Two obvious 
contenders.
As your are always adding to teh doc you coul duse



...

so the id will be id followed by teh number of elements you had before,
this will go up by one each time,

or you could use

':- ','')}">

an use an id based on the current time.

David

________________________________________________________________________
This e-mail has been scanned for all viruses by Star Internet. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list







 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list