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>
--~--