xsl-list
[Top] [All Lists]

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

2008-07-04 07:41:00
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>
--~--