[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

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


Subject: Re: [xsl] Assigning unique id to new node using generate-id()
From: <kyle.himmerick@xxxxxxxxxxxxxx>
Date: Wed, 13 Aug 2003 14:40:34 -0400 (EDT)

Thank you for you reply.

I would like to keep the existing ID's the same.  As they are referenced from
other nodes (a credential is referenced from 0 or more services).

My current workaround seems to be working although I'm not 100% convinced that it
will always create a unique id.

After new node is created without an id, I transform the document again with. 
This is run against the result of the first transform which adds the new
credential without and id.

<xsl:for-each select="credential">
	<xsl:choose>
		<xsl:when test="@id">
			<xsl:copy-of select="."/>				
		</xsl:when>
		<xsl:otherwise>
			<credential>
				<xsl:attribute name="id">
					<xsl:value-of select="generate-id()"/>
				</xsl:attribute>
				<xsl:copy-of select="username"/>
				<xsl:copy-of select="password"/>
				<xsl:copy-of select="description"/>
				<xsl:copy-of select="lastModified"/>
			</credential>
		</xsl:otherwise>
	</xsl:choose>
</xsl:for-each>

As I said, this seems to work.

What other methods would you recommend for generating a unique id?  It is
possible, albeit unlikely, that the a profile may contain identical credential
nodes (where username, password, description and lastModified are identical).

Thanks,
Kyle


On Wed, 13 Aug 2003 13:10 , Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> sent:

>Hi Kyle,
>
>At 12:11 PM 8/13/2003, you wrote:
>>I'd like this stylesheet to copy all existing credential nodes and create 
>>a new
>>node assigning a unique id
>
>It's a reasonable requirement.
>
>>  with generate-id().
>
>Why? as opposed to by some other means?
>
>>   It appears as if the generate-id
>>call doesn't observe existing id's in the current/copied credential 
>>nodes.  So I
>>end up with duplicate (illegal) id's.  I've tried passing several context 
>>nodes
>>to the generate-id() function, but with no luck.
>>
>>Sample XSL:
>>         
>>                 
>>                         
>>                                 
>>                         
>>                         
>>                                 
>>                                         
>> select="generate-id()"/>
>>                                 
>>                                 
>> select="$username"/>
>>                                 
>> select="$password"/>
>>                                 
>> select="$description"/>
>>                                 
>>select="java:getCurrentDateTimeGMT($dateHelper)"/>
>>                         
>>                 
>>         
>>
>>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.
>
>The root of your problem is in thinking that generate-id() assigns (unique) 
>IDs to new nodes, when it doesn't; it merely assigns (or retrieves) an ID 
>for a node in the source. The generated value has nothing to do with any 
>value in the source, even if on an attribute called "id". It needs only to 
>be unique to the node provided as argument to the function, or to the 
>context node (in your case, "/profile") if none is given.
>
>Given the code you have provided, in which you create only one  
>and assign it an ID unique to the  you have matched, there is a 
>good chance that the observed duplication is actually faithful to the 
>input, in which IDs are not unique (check to verify whether this is not the 
>case). To guarantee uniqueness, reassign an ID to every credential. Since 
>you are also creating new credentials, a second pass (your current 
>workaround) is an appropriate place to do this. If you have a requirement 
>to preserve IDs where they exist, this is a more complex problem and 
>generate-id() is probably not part of the solution at all.
>
>Cheers,
>Wendell
>
>
>
>======================================================================
>Wendell Piez                           
wapiez@xxxxxxxxxxxxxxxx','','','')">wapiez@xxxxxxxxxxxxxxxx
>Mulberry Technologies, Inc.                http://www.mulberrytech.com
>17 West Jefferson Street                    Direct Phone: 301/315-9635
>Suite 207                                          Phone: 301/315-9631
>Rockville, MD  20850                                 Fax: 301/315-8285
>----------------------------------------------------------------------
>   Mulberry Technologies: A Consultancy Specializing in SGML and XML
>======================================================================
>
>
> 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
Keywords
xml