Re: XSLT Processing Model Questions
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Sunday 14 April 2002 21:54, Dietrich Ayala wrote: > But looking > at the example, I cannot understand what logic a processor is using to > determine the location in the result tree at which it appends new nodes. It just does it in the order that it matches the templates. For example: [source] <root> <e1/> <e2> <e3/> </e2> <e3/> </root> <xsl:template match="root"> <body> <xsl:apply-templates/> </body> </xsl:template> <xsl:template match="e1"> matched e1 </xsl:template> <xsl:template match="e2"> matched e2 <xsl:apply-templates/> end of e2 </xsl:template> <xsl:template match="root/e3"> matched e3 </xsl:template> <xsl:template match="e2/e3"> matched e3 child of e2 </xsl:template> [output] matched e1 matched e2 matched e3 child of e2 end of e2 matched e3 It just appends the results as it goes, and most of the times this means that it processes the source nodes in document order (unless you change this with a special apply-templates or xsl:sort). * The "root" template does an apply-templates and selects "e1, e2, e3", in order. * The processor finds templates to match those nodes, in order. So it executes the "e1", "e2", and "root/e3" templates in order. * But the "e2" template does some more work, namely doing another apply-templates, and so this happens before the "root/e3" template is executed. So in the "e2" template, it selects another "e3" (the only child), and the template that matches that is "e2/e3". So the whole process goes like this: execute "root" template select "e1, e2, e3" children of "root" execute "e1" template output "matched e1" execute "e2" template output "matched e2" select "e3" child of "e2" execute "e2/e3" template output "matched e3 child of e2" output "end of e2" execute "root/e3" template output "matched e3" done Hope that helps. It's really pretty simple; there isn't a whole lot of "magic" going on, it just does things in the order that you tell them to. The biggest mixup probably is the difference between this example and what happens when the result tree has parent and child elements. Well, there is no difference. Think of this example: <xsl:template match="foo"> <bar> <xsl:apply-templates/> </bar> </xsl:template> as having three instructions: "start <bar>", "apply-templates" (and execution of the matched templates), and "end <bar>". Again, this all happens in this exact order. Everything that is output after "start <bar>" and before "end <bar>" just ends up as a child of <bar> in the result tree. If you're still confused, use your processors "trace" functionality. For example: * in Xalan, use one or more of the -TT, -TG, -TS, and -TTC options when running "java org.apache.xalan.xslt.Process". See http://xml.apache.org/xalan-j/commandline.html for more info. * in Saxon, use the -T option when running "java com.icl.saxon.StyleSheet". I haven't tried to do this with other processors. These options will make the processor output exactly what it is doing at each step of the transformation; hopefully you can think up some examples and watch exactly what happens if you still have questions. - -- Peter Davis -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE8ujkgNSZCJx7tYycRApLGAJ0dGS+mbm6pjETHvr11KGs0/t5xnACgmRY9 OAlnr/wcWp9DO3TyzwHLJ8o= =QnWL -----END PGP SIGNATURE----- XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format