Subject: Re: xsl:apply-imports? From: James Clark <jjc@xxxxxxxxxx> Date: Wed, 23 Dec 1998 11:23:14 +0700 |
Tyler Baker wrote: > > In the latest XSL spec the following is defined: > > "xsl:apply-imports processes the current node using only template rules > that were imported into the stylesheet containing the current rule; the > node is processed in the current rule's mode." > > What happens when you nest apply-imports statements inside of each > other, e.g. > > <xsl:template match="foo"> > <xsl:apply-imports> > <xsl:apply-templates/> > <xsl:apply-imports> > <xsl:apply-templates/> > <xsl:apply-imports> > <xsl:apply-templates/> > OK now what is the stylesheet context? > </xsl:apply-imports> > </xsl:apply-imports> > </xsl:apply-imports> > </xsl:template> xsl:apply-imports can't contain other elements: <!ELEMENT xsl:apply-imports EMPTY> The description in the WD needs expansion. Here's a fuller description: Imagine a tree with a node for the root and a node for each xsl:import element, where each node has an associated list of template rules. I'll call these nodes import-nodes to distinguish them from XML nodes. Number the import-nodes in the tree in a post-order traversal (ie number children before a parent). Associate each template rule with the number of its import-node. Also build a vector that for each import-node number gives the number of its lowest-numbered descendant import-node. Define a template rule Y to be a _subordinate_ of a template rule X if 1. the import-node number of X is > the import-node number of Y, and 2. the import-node number of Y is >= the import-node number of the lowest-numbered descendant of X, and 3. X and Y either both don't have a mode or both have the same mode In the course of processing, maintain a stack of {node, template rule} pairs, corresponding to the template rules that are being run (this stack is also needed for loop detection). To implement xsl:apply-templates look at the top-most entry on the stack. Find the best template rule that is a subordinate of the template rule on the top of the stack; if there's no such rule, use the built-in rule. Process the node on the top of the stack using this template rule. For example, given a stylesheet 1.xsl: <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:import href="2.xsl"/> <xsl:template match="foo"> <foo1><xsl:apply-imports/></foo1> </xsl:template> <xsl:template match="bar"> <bar1><xsl:apply-imports/></bar1> </xsl:template> </xsl:stylesheet> where 2.xsl is <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:import href="3.xsl"/> <xsl:template match="foo"> <foo2><xsl:apply-imports/></foo2> </xsl:template> <xsl:template match="bar"> <bar2><xsl:apply-imports/></bar2> </xsl:template> </xsl:stylesheet> and 3.xsl is <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="bar"> <bar3><xsl:apply-imports/></bar3> </xsl:template> </xsl:stylesheet> and a source document: <foo>A<bar>B<foo>C<bar/>D</foo>E</bar>F</foo> The result will be <foo1><foo2>A<bar1><bar2><bar3>B<foo1><foo2>C<bar1><bar2><bar3/></bar2></bar1>D</foo2></foo1>E</bar3></bar2></bar1>F</foo2></foo1> James XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
xsl:apply-imports?, Tyler Baker | Thread | ANN: XQL & XSL now supported in new, Michelle Curtis |
Re: XSL with scripting, Ray Cromwell | Date | Re: XSL with scripting, Don Park |
Month |