xsl-list
[Top] [All Lists]

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

2008-07-04 10:08:43

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(_at_)saxonica(_dot_)com> 
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(_at_)gmail(_dot_)com]
Sent: 04 July 2008 14:56
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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


--~------------------------------------------------------------------
XSL-List info and archive:  
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





--
Edwin
PoeticTerror.Com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--