RE: [xsl] Is it possible to access a tag after using apply-templates?

Subject: RE: [xsl] Is it possible to access a tag after using apply-templates?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 4 Jul 2008 18:08:04 +0100
> That sounds very interesting and something I will have to 
> try. My main concern at this point is that there will be 
> dozens of xsl:param's and xsl:template's that would have to 
> be generated into an XSLT stylesheet (this will be for 
> applications that need to display a lot of data, each record 
> can hold many (dynamic) fields etc). Generating such an XSLT 
> is not a problem now that I have the basic structure thanks 
> to Martin's example. However, I am wondering if the 
> performance will deterriorate a lot becuz of the amount of 
> xsl:param's passed around?

I can't quite see why lots of xsl:params should be needed, but I haven't
really studied the detail of the problem (in fact, I don't think you've
really shown us the full detail). But I would think that a generated XSLT
stylesheet should in principle be faster than interpreted code. 

I've used this technique with clients to generate stylesheets for capturing
data from (thousands of similar) Excel spreadsheets, and performance never
became an issue.

Michael Kay
http://www.saxonica.com/

> 
> Would your double-pass approach help in such a case? 
> Considering data is gradually compiled into larger bits, I 
> would imagine it's better performance-wise, but not sure.
> 
> Thank you,
> 
> Edwin
> 
> On Fri, Jul 4, 2008 at 4:40 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > Another way of tackling this kind of problem, which I've generally 
> > found works better in the long run, is as follows. At present you 
> > essentially have a miniature layout language, and you have 
> written an 
> > interpreter in XSLT that interprets that language, fetching 
> data from 
> > a source document when the layout script instructs you to do so.
> >
> > The alternative approach is to compile your layout 
> language: that is, 
> > to write an XSLT stylesheet that converts it into an XSLT 
> stylesheet, 
> > which then operates on the data file directly.
> >
> > Michael Kay
> > http://www.saxonica.com/
> >
> >> -----Original Message-----
> >> From: XemonerdX [mailto:xemonerdx@xxxxxxxxx]
> >> Sent: 04 July 2008 14:56
> >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >> Subject: [xsl] Is it possible to access a tag after using 
> >> apply-templates?
> >>
> >> Is the following possible? I can't seem to wrap my head around it, 
> >> but I am an XSLT newbie, so that might explain it :)
> >>
> >> I have an XML file that contains data that needs to be displayed:
> >> <?xml version="1.0" ?>
> >> <top>
> >>       <data>
> >>               <title>title of page</title>
> >>               <name>Your name</name>
> >>       </data>
> >>       <cells>
> >>               <cell>
> >>                       <name>cell 1</name>
> >>                       <value>100</value>
> >>               </cell>
> >>               <cell>
> >>                       <name>cell 2</name>
> >>                       <value>200</value>
> >>               </cell>
> >>               <cell>
> >>                       <name>cell 3</name>
> >>                       <value>300</value>
> >>               </cell>
> >>       </cells>
> >> </top>
> >>
> >> I also have a layout XML file that will be used to put the 
> data from 
> >> the above XML-file into a certain layout, called layout.xml:
> >> <?xml version="1.0" encoding="utf-8"?> <layout>
> >>       <layout-main>
> >> <html>
> >> <head>
> >>       <title><insert-title/></title>
> >> </head>
> >> <body>
> >>       <div>
> >>               My name is: <insert-name/>
> >>       </div>
> >>       <div>
> >>               <table>
> >>                       <insert-cells/>
> >>               </table>
> >>       </div>
> >> </body>
> >> </html>
> >>       </layout-main>
> >>       <layout-cell>
> >>               <tr>
> >>                       <td><insert-cell-name/></td>
> >>                       <td><insert-cell-value/></td>
> >>               </tr>
> >>       </layout-cell>
> >> </layout>
> >>
> >> And then I have the XSL file to tie it all together (hopefully!):
> >> <?xml version="1.0"?>
> >> <xsl:stylesheet
> >> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> >> version="1.0"> <xsl:output method="html" indent="yes"/> 
> <xsl:variable 
> >> name="data" select="/"/> <xsl:variable name="layout"
> >> select="document('http://localhost/webopac2/xml/datatemplate_l
> >> ayout.xml')"/>
> >> <xsl:template match="/">
> >>       <xsl:apply-templates select="$layout/layout/layout-main/*"/>
> >> </xsl:template>
> >> <!-- transformations -->
> >> <xsl:template match="insert-name">
> >>       <xsl:value-of select="$data/top/data/name"/> </xsl:template> 
> >> <xsl:template match="insert-title">
> >>       <xsl:value-of select="$data/top/data/title"/> 
> </xsl:template> 
> >> <xsl:template match="insert-cells">
> >>       <xsl:for-each select="$data/top/cells/cell">
> >>               <xsl:variable name="name" select="name"/>
> >>               <xsl:variable name="value" select="value/*"/>
> >>               <xsl:apply-templates
> >> select="$layout/layout/layout-cell/tr">
> >>                       <xsl:with-param name="name" select="$name"/>
> >>               </xsl:apply-templates>
> >>               <xsl:call-template name="insert-cell-name">
> >>                       <xsl:with-param name="name" select="$name"/>
> >>               </xsl:call-template>
> >>       </xsl:for-each>
> >> </xsl:template>
> >> <xsl:template name="insert-cell-name">
> >>       <xsl:param name="name"/>
> >>       <xsl:value-of select="$name"/>
> >> </xsl:template>
> >> <!-- Identity transformation -->
> >> <xsl:template match="@*|node()">
> >>     <xsl:copy>
> >>         <xsl:apply-templates select="@*|node()"/>
> >>     </xsl:copy>
> >> </xsl:template>
> >> </xsl:stylesheet>
> >>
> >> I would like the output to look like the following:
> >> <html>
> >> <head>
> >>       <title>title of page</title>
> >> </head>
> >> <body>
> >>       <div>
> >>               My name is: Your name
> >>       </div>
> >>       <div>
> >>               <table>
> >>                       <tr>
> >>                               <td>cell 1</td>
> >>                               <td>100</td>
> >>                       </tr>
> >>                       <tr>
> >>                               <td>cell 2</td>
> >>                               <td>200</td>
> >>                       </tr>
> >>                       <tr>
> >>                               <td>cell 3</td>
> >>                               <td>300</td>
> >>                       </tr>
> >>               </table>
> >>       </div>
> >> </body>
> >> </html>
> >>
> >> Unfortunately that's not quite the result. I can't seem to 
> be able to 
> >> replace the 'insert-cell-name' and 'insert-cell-value' 
> tags with the 
> >> corresponding 'name' and 'value' tag values. Is this possible?
> >>
> >> The reason I want to keep as much layout out of the XLS-file as 
> >> possible is to allow non-developers to design a layout without 
> >> knowing XSLT. This way I can hopefully also use a single XLS-file 
> >> where 'layout.xml' can be easily changed/generated.
> >>
> >> Thanxxx for any guidance/advice/comments...
> >>
> >> Edwin
> >
> >
> 
> 
> 
> --
> Edwin
> PoeticTerror.Com

Current Thread