Subject: Re: [xsl] How to use generate-id() inside an xsl:function without a node available? From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Tue, 27 Feb 2007 13:30:03 -0800 |
Cheap impementation. =================
It may even be possible to only use one node (and then immediately delete it as part of the closing of the scope of the function. Looking at the spec I am not sure, however if re-using the generated ID for a node (which is no longer alive) is allowed or not. If it is not allowed, then we have the following *cheap* implementation:
<xsl:function name="pref:myId" as="xs:string"> <xsl:variable name="myNode" as="element()"> <someNode/> </xsl:variable>
<xsl:variable name="vdynNode" as="element()"> <xsl:copy-of select="$myNode"/> </xsl:variable>
-- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play
Hve an auxiliary function, which creates a new node every time t is evaluated, for example using:
<xsl:function name="pref:GetNode" as="element()"> <xsl:variable name="myNode" as="element()"> <someNode/> </xsl:variable>
<xsl:copy-of select="$myNode"/> <xsl:function
Then in your code use:
generate-id(pref:GetNode() )
-- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play
On 2/27/07, Abel Braaksma <abel.online@xxxxxxxxx> wrote: > Hi List, > > This seems an obvious question to ask, but I couldn't find anything on > the net (but more often than not, it is a matter of wrong keywords, I am > sure). The issue is this: I have a function that generates some nodes > based on some strings and these nodes must receive a unique ID/IDREF > value. Normally, one would use generate-id(), but inside a function (or > inside anything that does not have a context node), generate-id() will fail. > > My question: how can I create unique identifiers without a node in sight? > > Example function (which will err): > > <xsl:function name="my:dupSVGText"> > <xsl:variable name="new-id" select="generate-id()" /> > <svg:text id="{$new-id}">some text</svg:text> > <svg:use xlink:href="#{$new-id}" y="10" /> > </xsl:function> > > My original function is a bit larger (ahum, counted > 100 lines today, > time for refactoring...) and creates some SVG objects that reference one > another, which is why I must make sure the ID for referencing the > xlink:href attributes are unique within the document. Don't let the SVG > and XLink upset or distract you, I just mention it to explain my use-case. > > And no, there's no way that there will be a node in sight (it is really > disconnected from the source document). Yes, I can use different > techniques than xsl:function if needed (of course). Oh, and before I > forget: I can do so with extension functions or assignable variables > (saxon), but I'd rather not to. > > Any ideas? It seems easy enough, but I couldn't find any (quick) > resolutions. > > TIA, > > Cheers, > -- Abel
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] How to use generate-id() , Abel Braaksma | Thread | Re: [xsl] How to use generate-id() , David Carlisle |
RE: [xsl] How to use generate-id() , Michael Kay | Date | Re: [xsl] How to use generate-id() , David Carlisle |
Month |