Re: [xsl] Web sites: building common components centrally

Subject: Re: [xsl] Web sites: building common components centrally
From: Kevin Bird <kevin.bird@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 28 Nov 2004 10:50 +0100
___
Kevin Bird
Matrix

...... Original Message .......
On Sat, 27 Nov 2004 08:19:31 -0800 Robert Koberg <rob@xxxxxxxxxx> wrote:
>Hi,
>
>We (an application service provider CMS (livestoryboard.com) based on 
>XML/XSL.) do something like the following...
>
>Each client project usually defines a layouts.xsl[1] that imports 
>several XSLs. The client project can use the applcation defaults for the 
>imports or can extend/override them. You would use (in java) a custom 
>URIResolver to check the client project's dir structure for a file, if 
>not there fallback to the app's default
>
>To overrride an import, the client project could either import their own 
>uniquely named xsl file while removing the import for the override or 
>create the file (with the same name as the one to override) in the 
>project's filesystem.
>
>To extend an existing imported XSL, the client would create the template 
>they want to override from the default, but still use the default file. 
>For example, head.xsl[2] has a named template that calls other 
>templates. If you want to extend the head.xsl without overriding it 
>completely you could define one of the named templates in the 
>layouts.xsl or some other imported XSL.
>
>Hope this makes sense.
>
>best,
>-Rob
>
>
>[1] A layouts.xsl might look like:
>
><?xml version="1.0" encoding="UTF-8" ?>
><xsl:stylesheet exclude-result-prefixes="s" version="1.0" 
>xmlns:s="http://livestoryboard.com/schemas/lsb"; 
>xmlns="http://www.w3.org/1999/xhtml"; 
>xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>   <!--
>   XSL will be looked first relative to this XSL file. If it is not 
>found, the system will lookup an LSB default. If nothing is found it 
>will will return an error (null).
>   -->
>   <xsl:import href="head.xsl"/>
>   <xsl:import href="banner.xsl"/>
>   <xsl:import href="top-level-nav.xsl"/>
>   <xsl:import href="second-level-nav.xsl"/>
>   <xsl:import href="topics.xsl"/>
>   <xsl:import href="footer.xsl"/>
>
>   <xsl:import href="components/indexer.xsl"/>
>   <xsl:import href="components/metadata.xsl"/>
>   <xsl:import href="components/toc.xsl"/>
>   <xsl:import href="components/pager.xsl"/>
>   <xsl:import href="components/snailtrail.xsl"/>
>
>   <xsl:import href="content.xsl"/>
>   <xsl:import href="table.xsl"/>
>   <xsl:import href="flash.xsl"/>
>
>   <xsl:import href="global_definitions.xsl"/>
>   <xsl:import href="metadata_nodesets.xsl"/>
>   <xsl:import href="linking.xsl"/>
>   <xsl:import href="aggregator.xsl"/>
>
>   <xsl:output
>     doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
> 
>doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
>     encoding="utf-8"
>     indent="no"
>     method="xml"
>     omit-xml-declaration="yes"/>
>
>   <xsl:template match="/">
>     <html xmlns="http://www.w3.org/1999/xhtml";>
>       <xsl:call-template name="head"/>
>       <body class="{$lsb_folder_nodeset/@name}">
>         <xsl:choose>
>           <xsl:when test="$user.focus.layout='default'">
>             <xsl:call-template name="default"/>
>           </xsl:when>
>           <!--<xsl:when test="$user.focus.layout='home'">
>             <xsl:call-template name="home"/>
>           </xsl:when>
>           <xsl:when test="$user.focus.layout='topics'">
>             <xsl:call-template name="topics"/>
>           </xsl:when>
>           <xsl:when test="$user.focus.layout='screenshots'">
>             <xsl:call-template name="screenshots"/>
>           </xsl:when>-->
>           <xsl:otherwise/>
>         </xsl:choose>
>       </body>
>     </html>
>   </xsl:template>
>
>   <xsl:template name="default">
>     <xsl:call-template name="banner"/>
>     <xsl:call-template name="tabs"/>
>     <div id="content-main">
>       <xsl:if test="$lsb_folder_nodeset/@snailtrail">
>         <xsl:call-template name="snailtrail"/>
>       </xsl:if>
>       <h1>
>         <xsl:value-of select="$focus_title"/>
>       </h1>
>       <xsl:apply-templates mode="load_regions" 
>select="$lsb_folder_metadata/s:regions/s:region[@name='wideColumn']/*"/>
>       <xsl:apply-templates mode="load_regions" 
>select="$lsb_focus_metadata/s:regions/s:region[@name='wideColumn']/*"/>
>       <xsl:if test="$lsb_folder_nodeset/@pager">
>         <xsl:call-template name="pager"/>
>       </xsl:if>
>     </div>
>     <div id="content-sidebar">
>       <div id="nav-header">
>         <xsl:variable name="href">
>           <xsl:apply-templates select="$lsb_folder_nodeset" 
>mode="get_page_href"/>
>         </xsl:variable>
>         <a href="{$href}">
>           <xsl:value-of select="$lsb_folder_nodeset/@label"/>
>         </a>
>         <xsl:text>:</xsl:text>
>       </div>
>       <xsl:call-template name="nav"/>
>       <xsl:apply-templates mode="load_regions" 
>select="$lsb_folder_metadata/s:regions/s:region[@name='narrowCol']/*"/>
>       <xsl:apply-templates mode="load_regions" 
>select="$lsb_focus_metadata/s:regions/s:region[@name='narrowCol']/*"/>
>       <br class="brkr"/>
>     </div>
>     <xsl:call-template name="footer"/>
>   </xsl:template>
>
></xsl:stylesheet>
>
>
>[2] head.xsl's main named template:
>
>
>   <xsl:template name="head">
>     <head>
>
>       <xsl:call-template name="head-misc-before"/>
>       <xsl:call-template name="head-css"/>
>       <xsl:call-template name="head-favicon"/>
>       <xsl:call-template name="head-metadata-misc"/>
>       <xsl:call-template name="head-metadata-dc"/>
>       <xsl:call-template name="head-title"/>
>       <xsl:call-template name="head-misc-after"/>
>
>     </head>
>   </xsl:template>
>
>
>
>
>Frans Englich wrote:
>
>> 
>> Hello,
>> 
>> I am working on a project which as user interface has a web site. The software 
>> is information intensive and produces much data. What the website consists of 
>> is plain informative documents(such as FAQs), and various data files which 
>> are statically produced. The browser-sophisticance requirement for solving my 
>> problem can be fairly high since the userbase is software developers; 
support 
>> for client side XSLT transformation can be assumed, if it's deemed 
necessary.
>> 
>> The problem I have is of plain web design: How do I in the best way 
insert 
>> common elements, such as footers and navigation, into every file which 
is 
>> part of the website?
>> 
>> Currently, my plan is to write/produce all documents in XHTML, and 
associate 
>> every file with an XSLT which adds the common parts such as base CSS, 
>> headers, navigation, footers, and so forth; the styleheet would "merge" 
the 
>> document with the common elements.
>> 
>> To me it sounds practical, the documents are standalone, valid XHTML 
>> documents(they can be validated and tested independently) and the 
website 
>> framework is centrally controlled. Bandwidth can be saved by doing the 
>> transformation at the client. Perhaps it is restraining if the 
navigation is 
>> somehow dynamic/context bound, affected by the document, I cannot yet 
tell.
>> 
>> But this is a common problem -- how do people usually solve this?
>> 
>> I've worked with a PHP framework, where documents were written in 
>> php-tags+body content + php tags, and the php tags then inserted the XML 
>> declaration, navigation, and head, html tags, and so forth(the documents 
were 
>> not well-formed). When the documents needed to affect the navigation, 
such as 
>> to add a menu, they simply declared PHP variables. Apart from that, this 
>> copy&paste solution was of course a major pain; impossible to validate 
the 
>> documents, and just think about extending or integrating an XML 
technology, 
>> such as Docbook..
>> 
>> I might add that I have no dependency on a procedural server-side 
language, 
>> and it would be nice if it stayed that way.

Current Thread