xsl-list
[Top] [All Lists]

Re: Newbie - XML and XSLT samples to produce XHTML Files please

2005-01-27 06:35:07
thanks.

heres the xsl page which displays an article
(some templates are stored in other files).

It's currently very very, VERY messy, and needs sorting out badly!
(it has evolved from something very basic, into something
a lot more complicated and I havn't had the time to try to be
tidy while I code).

I use AxKit to apply the transformations to the pages.
It works as a kind of pipeline, which you can configure
in your apache configuration file.

If your thinking of running an xml/xsl based site, you
should definatly check out AxKit, although the site seems to
be down right now.



<?xml version = "1.0"?>

<!--
        Virus Bulletin Stylesheet
 
                ** VB Article **
                Tom Kirkpatrick - webmaster(_at_)virusbtn(_dot_)com
                Last Edited: 01-Nov 04
-->

<xsl:stylesheet
        xmlns:xsl = "http://www.w3.org/1999/XSL/Transform";
        version = "1.0">

        <xsl:output method = "xml" indent = "yes"/>
 
        <xsl:template match = "article">
                <xsl:param name="dissabled"></xsl:param>
                <xsl:param name="embeded"></xsl:param>
 
                        <!-- Set the magazine type -->
                        <xsl:variable name="magazine">
                                <xsl:choose>
                                        <xsl:when 
test="@magazine"><xsl:value-of select = "@magazine" /></xsl:when>
 <xsl:otherwise>magazine</xsl:otherwise>
                                </xsl:choose>
                        </xsl:variable>
 

                        <!-- Get the edition detais -->
                        <xsl:variable name = "edition_month" select = 
"substring(@edition, 5, 6)" />
                        <xsl:variable name = "edition_year" select = 
"substring(@edition, 1, 4)" />
 
                        <!-- Get the date details -->
                        <xsl:variable name = "day"      select = 
"substring(@date, 7, 8)" />
                        <xsl:variable name = "month"    select = 
"substring(@date, 5, 6)" />
                        <xsl:variable name = "year"     select = 
"substring(@date, 1, 4)" />
 
                        <!-- Get the name of the category -->
                        <xsl:variable name = "displaycategory">
                                <xsl:if test = "@type">
                                        <xsl:value-of select = 
"document(concat('/',$magazine,'/articles/index.xml'))/articles/category[(_at_)name
 
= /article/@type]/@displayname" />
                                </xsl:if>
                                <xsl:if test = "@category">
                                        <xsl:value-of select = 
"document(concat('/',$magazine,'/articles/index.xml'))/articles/category[(_at_)name
 
= /article/@category]/@displayname" />
                                </xsl:if>
                        </xsl:variable>
 
                        <!-- Sidebar modules -->
                        <sidebars>
                                <sidebar type = "rating" />
                                <sidebar type = "opinions" />
                                <sidebar type = "articlearchive" magazine 
= "{$magazine}" />
                        </sidebars>

                <!-- Header bits for search engine optimisation -->
 
                        <!-- page title -->
                        <xsl:element name="pagetitle">
                        <xsl:attribute name="name">
                                         <xsl:value-of select = 
"$displaycategory" /> - <xsl:value-of select = '@title' />
 
                                         <xsl:choose>
                                                        <xsl:when test = 
"keywords/keyword">
                                                                (
 <xsl:for-each select = 'keywords/keyword'>
 <xsl:if test = "position() &lt; 3">
 <xsl:value-of select = '.' />
 <xsl:if test = "position() != 2">, </xsl:if>
 </xsl:if>
 </xsl:for-each>
                                                                )
                                                        </xsl:when>
                                                </xsl:choose>
                        </xsl:attribute>
                        </xsl:element>

                        <!-- meta description information -->
                        <pagedescription name = "{(_at_)title} - An in depth 
article ({$displaycategory}) provided by independent anti-virus advisors, 
Virus Bulletin" />
 
                                          <!-- for each keyword, add a 
keyword -->
                                          <xsl:for-each select = 
'keywords/keyword'>
                                                  <xsl:element 
name="keyword">
                                                          <xsl:attribute 
name="name"><xsl:value-of select = '.' /></xsl:attribute>
                                                  </xsl:element>
                                          </xsl:for-each>
 
                        <!-- Breadcrumb elements -->
                        <levels>
                                <level depth = "1" name = "{$magazine}" 
location = "{$magazine}" />
                                <level depth = "2" name = "Issues" 
location = "issues" />
                                <level depth = "3" name = 
"{document('/global/autodate.xml')/date/month[(_at_)position = 
$edition_month]/@name} {$edition_year}" location = 
"{$edition_year}/{$edition_month}" />
                                <level depth = "4" name = "{(_at_)title}" 
location = "{(_at_)filename}" />
                        </levels>

                        <!-- Page heading (h1) -->
                        <heading><xsl:value-of select = "$displaycategory" 
/>: <xsl:value-of select = "@title" /></heading>
 
                        <!-- Article head -->
                        <section>
 
 
                        <!-- do embeded virus overview info -->
                        <xsl:if test = "not($embeded = 'true')">
                        <xsl:if test = "(//@type = 'analysis') or 
(//@category = 'analysis')">
                        <xsl:for-each select = 
"//related_viruses/related_virus">
                        <xsl:variable name = "filename" select = 
"@filename" />
                        <xsl:if test = 
"not(document('/resources/viruses/index.xml')/viruses/virus[(_at_)filename = 
$filename]/@dissabled)">
                        <xsl:variable name = "virusinfo" select = 
"document(concat('/resources/viruses/',@filename))"/>
                                <rawhtml>
                                                <div class="alpha-shadow 
right"> 
                                                        <div>
                                                                <div style 
= "border:1px solid #708E7E; margin:0px; padding:0px">
                                                                <h2 style 
="background-color:#708E7E; color:white; text-align:center; margin:0px; 
padding:2px;">
 <xsl:value-of select = "$virusinfo//@name" />
                                                                </h2>
                                                                <table 
style = "padding:0px 3px 0px 3px; margin:0px; width:200px;">
 <xsl:if test = "$virusinfo//@type">
 <tr>
        <th class = "leftContent">Type:</th>
        <td><xsl:value-of select = "$virusinfo//@type" /></td>
 </tr>
 </xsl:if>

 <xsl:if test = "$virusinfo//@exploits">
 <tr>
        <th class = "leftContent">Exploits:</th>
        <td><xsl:value-of select = "$virusinfo//@exploits" /></td>
 </tr>
 </xsl:if>
 
 <xsl:if test = "$virusinfo//@infects">
 <tr>
        <th class = "leftContent">Infects:</th>
        <td><xsl:value-of select = "$virusinfo//@infects" /></td>
 </tr>
 </xsl:if>

 <xsl:if test = "$virusinfo//@spreads">
 <tr>
        <th class = "leftContent">Spreads:</th>
        <td><xsl:value-of select = "$virusinfo//@spreads" /></td>
 </tr>
 </xsl:if>
 
 <xsl:if test = "$virusinfo//@payload">
 <tr>
        <th class = "leftContent">Payload:</th>
        <td><xsl:value-of select = "$virusinfo//@payload" /></td>
 </tr>
 </xsl:if>
 
 <xsl:if test = "$virusinfo//@removal">
 <tr>
        <th class = "leftContent">Removal:</th>
        <td><xsl:value-of select = "$virusinfo//@removal" /></td>
 </tr>
 </xsl:if>
 
 <xsl:if test = "$virusinfo//@patch">
 <tr>
        <th class = "leftContent">Patch:</th>
        <td><xsl:value-of select = "$virusinfo//@patch" /></td>
 </tr>
 </xsl:if>
                                                                </table>
                                                                <p style = 
"text-align:right; padding:0px 3px 4px 3px; margin:0px;">
                                                                        <a 
href = "/resources/viruses/{(_at_)filename}">
 more info &gt;
 </a>
                                                                </p>
                                                                </div>
                                                        </div>
                                                </div>
                                </rawhtml>
                        </xsl:if>
                        </xsl:for-each>
                        </xsl:if>
                        </xsl:if>
 
                        <!-- do author info -->
                        <xsl:for-each select = "authors/author[(_at_)id] | 
author[(_at_)id]">
                                <xsl:variable name = "id" select = "@id" 
/>
                                <!-- check author exists in database -->
                                <xsl:if test = 
"document('/global/authors.xml')/authors/author[(_at_)id = @id]">
 
                                        <!-- if we have an image... -->
                                                <xsl:if test = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/image">
                                                  <!-- do image -->
                                                          <rawhtml>
                                                                  <div 
class="right rightContent" style="clear:both;">
 <table padding="0" margin="0" width="135">
        <tr><td>
                <div class="alpha-shadow right"> 
                        <div>
                        <img 
src="{document('/global/authors.xml')/authors/author[(_at_)id = $id]/image}" 
alt="VB{/issue/@edition}" title="VB{/issue/@edition}" />
                        </div>
                </div>
        </td></tr>
        <tr><td style = "line-height:12px; padding-right:5px;" class = 
"rightContent">
 <b><xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/title" />
 <xsl:text> </xsl:text><xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/firstname" />
 <xsl:text> </xsl:text><xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/lastname" />
 </b>
 <xsl:if test = "document('/global/authors.xml')/authors/author[(_at_)id = 
$id]/company/name">
        <br />
        <xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/company/name" 
/>
 </xsl:if>
 <xsl:if test = "document('/global/authors.xml')/authors/author[(_at_)id = 
$id]/company/country">
        , <xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = 
$id]/company/country" />
 </xsl:if>
 </td></tr>
 </table>
 </div>
                                                          </rawhtml>
                                                </xsl:if>
                                </xsl:if>
                        </xsl:for-each>


 
                <!-- Show when it was published -->
                        <xsl:if test = "@edition">
                                <rawhtml>
                                <b>Published in Virus Bulletin: </b>
                                <a href = 
"/magazine/issues/{$edition_year}/{$edition_month}.xml">
                                        <xsl:value-of select = 
"document('/global/autodate.xml')/date/month[(_at_)position = 
$edition_month]/@name" />
                                        <xsl:text> 
</xsl:text><xsl:value-of select = "$edition_year" />
                                </a>
                                <br />
                                </rawhtml>
                        </xsl:if> 

                <!-- if there is no image display author in text at the 
top-->
                        <xsl:for-each select = "authors/author[(_at_)id] | 
author[(_at_)id]">
                                <xsl:variable name = "id" select = "@id" 
/>
                                <!-- check author exists in database -->
                                <xsl:if test = 
"document('/global/authors.xml')/authors/author[(_at_)id = @id]">
                                        <xsl:if test = 
"not(document('/global/authors.xml')/authors/author[(_at_)id = $id]/image)">
                                                <rawhtml>
                                                        <xsl:if test = 
"position() = 1"><b>By: </b></xsl:if>
                                                        <xsl:value-of 
select = "document('/global/authors.xml')/authors/author[(_at_)id = $id]/title" 
/>
                                                        <xsl:text> 
</xsl:text><xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/firstname" />
                                                        <xsl:text> 
</xsl:text><xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/lastname" />
                                                        - 
                                                        <xsl:if test = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/company/name">
 <xsl:value-of select = 
"document('/global/authors.xml')/authors/author[(_at_)id = $id]/company/name" 
/>
                                                        </xsl:if>
                                                        <xsl:if test = 
"document('/global/authors.xml')/authors/author[(_at_)id = 
$id]/company/country">,
                                                        <xsl:value-of 
select = "document('/global/authors.xml')/authors/author[(_at_)id = 
$id]/company/country" />
                                                        </xsl:if>
                                                        <br />
                                                </rawhtml>
                                        </xsl:if>
                                </xsl:if>
                        </xsl:for-each>
 
                <xsl:for-each select = "authors/author[not(@id)] | 
author[not(@id)]"> 
                                <!-- support for legacy author entries -->
                                        <rawhtml>
                                                        <xsl:if test = 
"position() = 1"><b>By: </b></xsl:if>
                                                <xsl:value-of select = 
"@name" />
                                                <xsl:if test = "@company 
or @country">
                                                        - <xsl:value-of 
select = "@company" />, <xsl:value-of select = "@country" />
                                                </xsl:if>
                                                <br />
                                        </rawhtml>
                </xsl:for-each>
 
        </section>
 
                <!-- Article body -->
                <xsl:choose>
                        <xsl:when test = "$dissabled">
                                <section>
                                        [The latest articles are only 
available to <link location = 
"/perlbin/subscribe.cgi:SSL">subscribers</link>]
                                </section>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:choose>
                                        <xsl:when test = "body">
                                                <xsl:for-each select = 
"body">
 <xsl:apply-templates />
                                                </xsl:for-each>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:apply-templates />
                                        </xsl:otherwise>
                                </xsl:choose>
                        </xsl:otherwise>
                </xsl:choose>

        </xsl:template>
 
</xsl:stylesheet>




Julian Voelcker <asp(_at_)tvw(_dot_)net>
27/01/2005 11:47
Please respond to xsl-list

 
        To:        xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
        cc: 
        Subject:        Re: [xsl] Newbie - XML and XSLT samples to produce 
XHTML Files please


Hi Tom,

www.virusbtn.com

Nice site.

This is the site I am currently working on. The entire site is driven by
XML/XSL

Any chance of letting me look at the XML/XSL to generate one of the pages
to help me on my way........ Pretty please :-)
--
Cheers,

Julian Voelcker
United Kingdom



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




-- 
Tom David Kirkpatrick
Virus Bulletin Web Developer, Virus Bulletin

Tel: +44 1235 555139
Web: www.virusbtn.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>
--~--