This is the mail archive of the docbook-apps@lists.oasis-open.org mailing list .
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Sun, Jul 04, 2004 at 11:42:39PM +0200, Wim Lemkens wrote: > This maybe isn't entirely the correct place to ask. > But how can I access variables from parents in xsl? > > Eg.: I have a custom list where the list itself has an id. Now I want to be > able to let every listitem now the id of that list. > > <xsl:template match="customlist"> > <xsl:variable name="listid"> > <xsl:value-of select="generate-id()"/> > </xsl:variable> > </xsl:template> > > <xsl:template match="customlist/listitem"> > <xsl:copy-of select="$listid"/> > </xsl:template> Your question, and your examples, display a subtle nuance about XSLT programming that I will attempt to address here. To make things concrete, let's use the following made-up XML document: <body> <customlist> <listitem>data</listitem> </customlist> </body> If you are working within the context of the body, say within the following template: <xsl:template match="body"> <!-- Do stuff --> <xsl:apply-templates/> </xsl:template> Then XSLT will begin processing all the templates that match, in tree order. In this case, your first template would match the customlist, and then your second template would match the customlist/listitem, both from the context of the body element, because both match in the context of the body element. However, there is nothing shared between those two templates; the variable in the first is not seen by the second. You need to take advantage of XSLT's recursive nature, and process the listitem as a child of the customlist in order to pass data from the latter to the former. It might look something like this: <xsl:template match="customlist"> <xsl:variable name="listid"> <xsl:value-of select="generate-id()"/> </xsl:variable> <xsl:apply-templates select="listitem"> <xsl:with-param name="listid" select="{$listid}"/> </xsl:apply-templates> </xsl:template> <xsl:template match="listitem"> <xsl:param name="listid"/> <!-- Do stuff with listid here... --> </xsl:template> Note how listitem is matched without any context; this gives its parent the freedom to match it against its children directly, as done above. This is probably best explained a different way; still, I hope this was helpful. Take care, John L. Clark
Attachment:
pgp00000.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |