[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: AW: AW: [xsl] Using key() from outside the default namespace
Subject: Re: AW: AW: [xsl] Using key() from outside the default namespace From: Markus Abt <abt@xxxxxxxx> Date: Fri, 8 Aug 2003 17:48:41 +0200 |
Peter Flynn wrote: >On Wed, 2003-08-06 at 16:07, Markus Abt wrote: >> I can see the problem. However, the reason for the root template to >> be instantiated more than once is not the global variable $maindoc >> that holds the root node of the main document, nor is it the dummy >> <xsl:for-each> to switch the context back to the main document. > >OK. > >> The reason is: >> >> (1) In your entry template, you define the variable $content with: >> <xsl:variable name="content"> >> <xsl:for-each select="$maindoc"> >> <xsl:value-of select="key($keyname,$entryid)"/> >> </xsl:for-each> >> </xsl:variable> >> The value of this variable is now a result tree fragment, containing a >> root node and a text node with the string from the <xsl:value-of>. > >So this for-each applied to my $maindoc actually places a node into the >variable? Yuck. (??) No, the variable $maindoc remains unchanged. The variable $contents is set, but not from the for-each, it is set from the result of value-of. The for-each is looping exactly one time, since $maindoc contains exactly one node (the root node /). >Oddly, if I declare maindoc to be some empty unused element buried deep >in the document (*anything* which will get me back to the main doc), it >still triggers the root template. Nothing is "triggered" here. Again, the for-each is looping exactly one time, since $maindoc contains one node (the empty node you chose). Honest, the "trigger problem" is not here, but in (2) below. >> (2) In your format template, you use this variable (via the param of >> the same name): >> <xsl:apply-templates select="$content"/> > >Right, because $content may contain further subelements which need >matching in templates. No, it does only contain one root node and one text node, since the value-of doesn't return the whole tree but only the first text node. If you use copy-of instead of value-of, then the variable $content will contain a result tree fragment with all subelements. >> This results in applying ("firing" in your words): >> - The root template, and then >> - the default template for text nodes. >> >> So you get the output from the root template more than once. > >Thank you very much, this explains what's happening. I really hadn't >expected the for-each to insert anything into the variable. See above, the for-each does *not* do that. >What I need is a key-with-respect-to-where-I-tell-it($foo,$bar). > >> One solution would be to replace the <xsl:apply-templates> >> with a <xsl:value-of> to output only the text node of this >> result tree fragment: >> <xsl:value-of select="$content"/> > >Unfortunately not. The possibility of subelements needing processing >within $content precludes this. If you use copy-of instead of value-of to construct the value of the variable, as I wrote above, then and only then $content will contain the subelements. Then, you can either - use <xsl:copy-of select="$content"/> here to copy the result tree fragment to the output *without processing*, or - use <xsl:apply-templates select="xx:node-set($content)/node()"/> to first convert the result tree fragment to a node set, and then apply templates to the resulting node-set. Note the .../node() here, to avoid "firing" of the root template... xx:node-set() is an extension function that must be supported by your xslt processor. Major processors have such an extension function. Look into the their docu, or start reading at: http://www.exslt.org/exsl/functions/node-set/index.html >It looks as if it simply isn't possible in XSLT transparently to >revisit a document like this to retrieve a key value. No, it is, via a node-set() extension function. >///Peter Regards, Markus __________________________ Markus Abt Comet Computer GmbH http://www.comet.de XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: AW: AW: [xsl] Using key() from , David Carlisle | Thread | Re: AW: AW: [xsl] Using key() from , Peter Flynn |
Re: [xsl] how to replace <?Pub _har, David Carlisle | Date | RE: [xsl] <xsl:if>, AROSO Jose Antonio |
Month |
Keywords