Okei, olisi tämmöinen XML-tiedosto, joka esittää www-sivua:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <website title="Life"> <topcontainer id="topcontainer"> <error>I am errorous!</error> </topcontainer> <errorcontainer id="errorcontainer"> <error>I am errorous too!</error> </errorcontainer> <bodycontainer> <error>I am errorous as well!</error> <html src="../html/lorem.html" /> </bodycontainer> </website>
Huomatkaa, että XML:ssä ei ollut linkkiä tyylitiedostoon. Johtuupi siitä, että muunnos tapahtuu PHP:lla. Tyylitiedosto on seuraavanlainen:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" id="rootelement"> <xsl:output method="html" /> <xsl:template match="website"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><xsl:value-of select="@title" /></title> <link rel="stylesheet" type="text/css" href="masterpages/default.css" /> </head> <body> <div class="bgframe"></div> <div class="bgframe2"> <div class="topnavi"> <xsl:call-template name="topcontainer"></xsl:call-template> </div> <div class="content"> <div class="newswindow"> <img src="img/uutisia.png" /> </div> <div class="flash_and_logo"> <img src="img/logo.png" /> </div> <div class="calendarwindow"> <img src="img/tanaan.png" /> </div> <div style="clear:both"></div> <div class="maincontent"> <xsl:call-template name="errorcontainer"></xsl:call-template> <xsl:call-template name="bodycontainer"></xsl:call-template> </div> </div> </div> </body> </html> </xsl:template> <xsl:template match="topcontainer" name="topcontainer"> <xsl:apply-templates/> </xsl:template> <xsl:template match="errorcontainer" name="errorcontainer"> <xsl:apply-templates/> </xsl:template> <xsl:template match="bodycontainer" name="bodycontainer"> <xsl:apply-templates/> </xsl:template> <xsl:template match="error"> <p style="color:red"> <xsl:value-of select="."/> </p> </xsl:template> <xsl:template match="html"> <xsl:copy-of select="document(@src)"/> </xsl:template> </xsl:stylesheet>
Nythän olisi loogista olettaa, että kun kutsun templatea, jolla on nimi "topcontainer," joka vastaa (match) topcontainer-nimistä tagia XML-tiedostossa, xsl:apply-templates koskisi ainoastaan topcontainerin sisässä olevia tageja, joita on siis tässä esimerkissä yksi. Mutta näin ei käy. Ja käytös on muutenkin omituista.
Eli siis jokainen containeri näyttää ainoastaan oman sisältönsä sijasta kaikkien containereiden sisällöt, mikä ei ole toivottavaa.
Kun mitkä tahansa kahden container-templaten apply-templates -tagit kommentoi, alkaa jäljellejäänyt toimia toivotulla tavalla, eli se näyttää ainoastaan oman sisältönsä.
Kun vain yhden container-templaten apply-templates -tagin kommentoi ja antaa muiden toimia, molemmat näyttävät oman sisältönsä lisäksi toistensa sisällön.
Osaisiko joku jelppiä? Unohtamalla koko call-templates touhu tietenkin helpottuu, mutta vain välillisesti. Pitkässä juoksussa olisi kätevämpää, ettei vakiona pysyvää HTML-rakennetta tarvitsisi rikkoa.
EDIT:
Jälleen kerran ratkaisu oli liian helppo. <xsl:apply-templates select="plaa" /> hoisi homman.
Aihe on jo aika vanha, joten et voi enää vastata siihen.