Problem: It's pretty unlikely, but the stylesheet I sent could possibly generate non-unique IDs because it doesn't check whether generate-id() returns an ID that has already been created by appending underscores to an ID that generate-id() returned for another node. This version should fix it (sorry about the missing indentation, the Yahoo Groups web interface mangles it):
<?xml version="1.0" ?> <stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform"> <key name="id" match="*...@id]" use="@id"/> <template name="generateUniqueId"> <param name="id" select="generate-id()"/> <param name="alreadyAddedIds"/> <choose> <!-- Test whether $id is already taken by another item --> <when test="key('id',$id) or contains($alreadyAddedIds, concat(' ',$id,' '))" > <call-template name="generateUniqueId"> <!-- Append something to the id until it's unique --> <with-param name="id" select="concat($id,'_')"/> <with-param name="alreadyAddedIds" select="$alreadyAddedIds"/> </call-template> </when> <otherwise> <value-of select="$id"/> </otherwise> </choose> </template> <template match="*"> <param name="alreadyAddedIds" select="' '"/> <!-- Copy element and all attributes --> <copy> <for-each select="@*"> <copy/> </for-each> <choose> <!-- If id attribute is missing, generate one (only for svg elements) --> <when test="not(@id) and namespace-uri()='http://www.w3.org/2000/svg'"> <variable name="id"> <call-template name="generateUniqueId"> <with-param name="alreadyAddedIds" select="$alreadyAddedIds"/> </call-template> </variable> <attribute name="id"> <value-of select="$id"/> </attribute> <apply-templates> <with-param name="alreadyAddedIds" select="concat($alreadyAddedIds,$id,' ')"/> </apply-templates> </when> <otherwise> <apply-templates> <with-param name="alreadyAddedIds" select="$alreadyAddedIds"/> </apply-templates> </otherwise> </choose> </copy> </template> </stylesheet> --- In [email protected], "t...@..." <t...@...> wrote: > > Does this do the job for you? > > <?xml version="1.0" ?> > <stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform"> > <key name="id" match="*...@id]" use="@id"/> > > <template name="generateUniqueId"> > <param name="id" select="generate-id()"/> > <choose> > <!-- Test whether $id is already taken by another item --> > <when test="key('id',$id)" > > <call-template name="generateUniqueId"> > <!-- Append something to the id until it's unique --> > <with-param name="id" select="concat($id,'_')"/> > </call-template> > </when> > <otherwise> > <value-of select="$id"/> > </otherwise> > </choose> > </template> > > <template match="*"> > <!-- Copy element and all attributes --> > <copy> > <for-each select="@*"> > <copy/> > </for-each> > <!-- If id attribute is missing, generate one (only for svg elements) > --> > <if test="not(@id) and namespace-uri()='http://www.w3.org/2000/svg'"> > <attribute name="id"> > <call-template name="generateUniqueId"/> > </attribute> > </if> > </copy> > <apply-templates/> > </template> > > </stylesheet> > > > Thomas W. > > > --- In [email protected], "fisad@" <fisad@> wrote: > > > > Is There any stylesheet to add missing id to elements in svg files. > > > > I have some svg files without id for some elements like path's and rect's > > and I want to add the missing id's to this elements with the use of a > > stylesheet. > > > > That is possible?. > > > > I can make that with a xml rutine in Delphi but that is to much long. > > > > Any idea? > > > > Thanks. > > > > Fisad. > > > ------------------------------------ ----- To unsubscribe send a message to: [email protected] -or- visit http://groups.yahoo.com/group/svg-developers and click "edit my membership" ----Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/svg-developers/ <*> Your email settings: Individual Email | Traditional <*> To change settings online go to: http://groups.yahoo.com/group/svg-developers/join (Yahoo! ID required) <*> To change settings via email: [email protected] [email protected] <*> To unsubscribe from this group, send an email to: [email protected] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/

