xsl-list
[Top] [All Lists]

RE: How to use multiple xsl:import

2005-04-06 08:30:29
Thanx Michael and Dimitre. I understand that using mode will help me control
the way the processor chooses a template. Michael already pointed that out
(both here and in his book) and you clarified it. 

Maybe I stated the question wrong. Actually we're not referring to the
import precedence. We're trying to find a way to name the imported
stylesheets, and apply them **anywhere** we choose in the web page. For
that, there's no functionality in xsl:import, AFAIK. Since xsl:import
doesn't provide this functionality (it is only allowed as a top element, and
it lacks a name or mode attribute), it means we simply cannot use the
approach my collegue had in mind.

But there's another approach. Back in March 2002 I ported a clasical ASP
aplication to using modular approach, using the xsl:include approach. That
would be a better solution, although we'll loose the import precedence
functionality. Following is the mother template where six includes are
called.

<?xml version='1.0' ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:ms="urn:schemas-microsoft-com:xslt" version="1.0">

  <xsl:output method="html" indent="yes" omit-xml-declaration="yes"
encoding="Windows-1252" />

  <xsl:include href="nace6inc1.xsl" />
  <xsl:include href="nace6inc2.xsl" />
  <xsl:include href="nace6inc3sub1.xsl" />
  <xsl:include href="nace6inc3sub2.xsl" />
  <xsl:include href="nace6inc3sub3.xsl" />
  <xsl:include href="nace6inc4.xsl" />

        <xsl:template match="/">
                <xsl:apply-templates select="root" />
        </xsl:template>

        <xsl:template name="root" match="root">

                <html>

                <head>
                <title>E L  N O R T E - nota</title>
                                <link href="img/StyleSheet.css"
type="text/css" rel="STYLESHEET" />
                        </head>

                <body vlink="#000080" alink="#000080" link="#000080"
bgcolor="#ffffff" leftmargin="0" topmargin="0" marginheight="?0?"
marginwidth="?0?">

        <!-- Header Terra -->
      <xsl:call-template name="headerTerra" />

        <!-- Header Elnorte -->
      <xsl:call-template name="headerElnorte" />

        <table cellspacing="0" cellpadding="0" width="760" border="0">
        <tbody>
                <tr>

                <!-- Parte Izquierda - Navegacion-->
                        <xsl:call-template name="navbarElnorte" />

                <!-- Parte Central -->
                        <xsl:call-template name="centralElnorte" />

                <!-- Parte Derecha -Herramientas-->
                        <xsl:call-template name="herrElnorte" />

                </tr>
        </tbody>
        </table>

        <!-- Parte Derecha -Herramientas-->
                        <xsl:call-template name="footerElnorte" />

                        </body>

                        </html>
        </xsl:template>

</xsl:stylesheet>

Thanx again for the help, I appreciate it a lot!

Cheers,
<prs/>

-----Original Message-----
From: Dimitre Novatchev [mailto:dnovatchev(_at_)gmail(_dot_)com] 
Sent: Wednesday, April 06, 2005 6:19 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] How to use multiple xsl:import

On Apr 6, 2005 9:50 AM, Pieter Reint Siegers Kort
<pieter(_dot_)siegers(_at_)elnorte(_dot_)com> wrote:
Since the two xsl:apply-imports are in the same template, they will 
follow
exactly the same search path in looking for the next template to apply.

This makes sense.

If you want to search different sets of templates in the two cases, 
the
mechanism to use is modes.

This not... how do I use mode on xsl:import? AFAIK mode belongs to 
xsl:template and xsl:call-templates... please explain!

This makes perfect sense. Let's take an example:

   If the imported stylesheet contains a template, which matches an element
named "foo" and the importing stylesheet contains a template matching
node(), at the instruction:

    <xsl:apply-templates select="foo"/>

the template from the importing stylesheet will always be selected over the
one from the imported stylesheet as the former has a higher import
precedence.

The only way to ensure that the wanted template from the imported stylesheet
will be selected is to specify it with a unique mode and change the
xsl:apply-templates to:

    <xsl:apply-templates select="foo" mode="fooprefix:fooMode"/>

where fooprefix is bound to a unique namespace-uri
   

Often the author of a stylesheet that will be imported doesn't know what
stylesheets will be importing it. The only sound protection from a template
with higher imort precedence being selected instead of owr own is to provide
it with unique mode.

In FXSL there is a general convention that referenced templates (whose
template references are passed as parameters to other
templates/functions) must have:

   mode="f:FXSL"

where "f" is bound to "http://www.sf.net/fxsl";

The templates that are passed such parameters initiate the referenced
templates using:

   <xsl:apply-templates mode="f:FXSL"/>


Of course, this is incompatible with the idea of xsl:apply-imports and, it
turns out, the idea of xsl:apply-imports is not a bulletproof one.

See for example: "Reliance on import precedence considered dangerous "
by Jeni Tennison at:

        http://www.xslt.com/html/xsl-list/2001-02/msg00613.html


Hope this helped.

Cheers,
Dimitre Novatchev.

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



<Prev in Thread] Current Thread [Next in Thread>