Subject: RE: [xsl] key(), generate-id question From: "Américo Albuquerque" <aalbuquerque@xxxxxxxxxxxxxxxx> Date: Mon, 11 Nov 2002 18:39:02 -0000 |
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: [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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] key(), generate-id questi, Endre Magyari | Thread | Re: [xsl] key(), generate-id questi, Endre Magyari |
RE: [xsl] Transform in-memory XML d, John Aschenbrenner | Date | Re: [xsl] xslt replace special char, Greg Faron |
Month |