8 users online. Create an account or sign in to join them.Users
Structuring site assets in page templates
This is an open discussion with 28 replies, filed under XSLT.
Search
Allen accomplishes this with modes:
In your head:
<!-- Whatever stuff you need sitewide --> <xsl:apply-templates select="data" mode="assets"/>
And then on your page:
<xsl:template match="data" mode="assets">
<!-- page-specific stuff -->
</xsl:template>
Make sure you’ve got a blank template match on that mode in your master too, to prevent it dumping out the contents of /data if no matching template is found in a child page…
That’s how I was looking at doing it, I was also looking at using named templates, but I couldn’t get it to work either way.
I wanted to apply CSS from the master.xsl and the page specific CSS. I couldn’t figure out how to do it…
I more or less do the same thing.
<xsl:if test="$current-url=blahblahblah"> whatever I need included goes here </xsl:if>
$current-url can be replaced with whatever param is more convenient.
Thanks everyone! I think I’ll give modes a go…
Yep, I’m using modes for an intranet ensemble that uses a single master template for all pages.
My template looks something like this:
<xsl:template match="/">
<html lang="en">
<head>
<xsl:apply-templates mode="page-title" />
<meta name="description" content="" />
<meta name="author" content="" />
<xsl:apply-templates mode="css" />
</head>
<body id="{$current-page}-page">
<xsl:apply-templates mode="header" />
<xsl:apply-templates mode="nav" />
<xsl:apply-templates mode="aside" />
<xsl:apply-templates />
<xsl:apply-templates mode="footer" />
<xsl:apply-templates mode="js" />
</body>
</html>
</xsl:template>
Then, I am able to override any of these apply-templates instructions in each page template, sometimes depending on whether a JavaScript, CSS, or XML file has been uploaded with the entry.
Each entry can potentially have a completely different layout.
That’s really clever. You are essentially simulating a call-template, but with the ability to use matching template overrides. Cool!
Ugh, I tried this and couldn’t get it to work for some reason. I had, for instance a CSS moded template on the master stylesheet for global CSS, then one on the specific page, but neither would work correctly.
I will revisit this as it must be something I did wrong…
@bauhouse: awesome, that’s exactly what I was going for!
I have an empty template in my master.xsl:
<xsl:template name="head" />
And then just before the end of my <head>-tag in my master.xsl I put:
...
<xsl:call-template name="head" />
</head>
Now, if I have certain pages which have the need to add some other content to the head, I simply create a <head>-template, causing it to override the empty one located in my master.xsl:
<xsl:template name="head">
<link rel="stylesheet" type="text/css" href="portfolio.css" />
</xsl:template>
I do this same trick for my <title>- keywords- and description-(meta)-tags, so I can adjust the title, keywords and description of each page if I want to. In this case, the master meta-template (as I call it), is not an empty template (like head), but holds a default title, keywords and description.
kanduvisla hit an important point: There are not only matched template overrides as used by bauhouse, but also named template overrides. So no matter which route you take, “overriding” is king.
When I try to override a template when calling it by its name just like kanduvisla said, I get an error:
xsl:template: error duplicate name 'assets'
So I'm forced to use the mode method or have an empty template in all my pages.. any idea where that comes from?
I see in my local phpinfo() the libxslt version being libexslt Version 0.8.13 where as on some server I can read libexslt Version 1.1.24
Do you think this my be a reason?
I don't think that this is the reason. I assume that you are simply doing something wrong. :-)
That's right :)
Turns out I was using an <xsl:include> instead of an <xsl:import> to call my master.xsl.. lesson learned!
Weirdly getting an error saying that I have a duplicate template name when using Kanduvislas approach Comment #11, any idea what could be wrong?
have empty template at bottom of template and a call-template in the head markup of master..
Then each page xsl file has a xsl:template name="metadata" but it says there is a duplicate named template.. hmmmm
This is the error:
XSLTProcessor::importStylesheet(): xsl:template: error duplicate name 'metadata' XSLTProcessor::transformToXml(): No stylesheet associated to this object
Can you post your xsl?
It's cool, I just removed the blank template bit and put a choose otherwise block in each page for now. it's only 5 pages, but loads of categories.. they are also filtered in DS.. so fingers crossed I'm good for now.
@monoo2
Perhaps case as here. You are <include>ing master.xsl instead of <import>ing it :)
Create an account or sign in to comment.
Hi all, here’s a quick question. How do you organize your site’s assets (CSS, Javascript, etc.) within your page templates? I use a master.xsl utility, but I’ve recently found it to be somewhat inflexible for including assets on an individual page basis.
In my case the
<head>is contained in the master.xsl template. So for example, if I want to include a stylesheet in an individual page, I either put it in master.xsl (thereby having it loaded on the whole site), or I have to embed it somewhere in the page’s template below the<head>, which is ugly.I considered using
<xsl:call-template>, and passing it a parameter with the link to the stylesheet, but this still seems sort of clunky once you have a couple of assets you want to include.Any clever ideas? I’m sure one of you guys has done this :)