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

Re: [xsl] How to use generate-id() inside an xsl:function without a node available?


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>

<xsl:sequence select="generate-id($vdynNode)"/>

<xsl:function


-- 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, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
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
Keywords
svg