Hallo allemaal! Ik heb GOT al eerder geterroriseerd met n00b vragen over XSL. Gelukkig ben ik ondertussen al heel wat verder met XSL, maar ik heb nu een probleem waar ik toch echt niet uit kom in mijn eentje.
Een inleidingetje
Ik verwerk XML bestanden met mijn eigen dialectje (enigzins te vergelijken met XHTML) via XSL tot XHTML, die dan vervolgens naar mijn webhost verstuurd wordt. Omdat ik met X-Links en aanverwanten niet verder kwam, heb ik "mijn eigen hyperlink standaard" gemaakt, die dan omgezet wordt tot gewone XHTML.
Een van de functies van de xsl template die deze links omzet --waar ik erg blij mee ben-- is dat er onderscheid gemaakt wordt tussen interne en externe links, en dat anchors herkend worden. Op deze manier krijgen alle links op mijn web site een tooltip die bijvoorbeeld een van de volgende beschrijvingen bevat:
Interne link naar anchor "blaat" op pagina "blaat.html"
Interne link naar anchor "blaat" op deze pagina
Interne link naar bestand "blaat.zip"
Externe link naar "http://www.host.com/bestand.extensie"
En het probleem is...
Als mijn XSL stylesheet de pagina's verwerkt, krijgen alle links die voortkomen uit mijn XML bestanden deze tooltips, maar de links in het menu bijvoorbeeld niet. Dit is natuurlijk logisch, ik voeg het menu namelijk via datzelfde XSL bestand toe.
Omdat ik geen zin had om dubbel werk te doen, dacht ik slim te zijn: gewoon mijn originele links (eigen XML dialect) laten staan, en de links in het menu ook toevoegen in ditzelfde formaat, om vervolgens met een tweede stylesheet alle links te transformen. Ik transform immers toch naar XHTML, en XHTML zou even goed te verwerken moeten zijn als XML (ja, de pagina's zijn volledig gevalideerd
).
Maar als ik met mijn tweede stylesheet de XHTML pagina's transform gebeurt er gewoon niks
. De transform duurt wel eeuwenlang (alleen het laden van het stylesheet duurt 20 tot 30sec), maar de pagina's veranderen geen bit. Nou oke, misschien wordt er wat whitespace gestript
.
Hieronder volgt (het|de)? stylesheet in kwestie, dit is dus degene die de XHTML pagina's verwerkt:
Dat dit stylesheet nogal lang draait is neem ik aan ook wel logisch vanwege de grote choose/when/otherwise constructie. De rest van de inhoud van de pagina's wordt netjes gekopieerd, maar er veranderd niks... Ik vindt dus in mijn XHTML output dezelfde <reference> elementen terug. Er worden overigens geen foutmeldingen of waarschuwingen weergegeven.
Ik gebruik overigens Apache Ant, met geintegreerde XSL taak. Dit is natuurlijk de combinatie Xerces en Xalan.
Heeft iemand enig idee hoe dit komt??
- Peter Odding
ps. Ik neem aan dat er heel wat aan te merken is op dit stylesheet, elk commentaar (constructief zou mooi zijn) is dan ook welkom. Vergeet aub niet dat ik nog niet lang met XSL bezig ben, en misschien gewoon iets stoms over het hoofd heb gezien... Alvast bedankt!
Een inleidingetje
Ik verwerk XML bestanden met mijn eigen dialectje (enigzins te vergelijken met XHTML) via XSL tot XHTML, die dan vervolgens naar mijn webhost verstuurd wordt. Omdat ik met X-Links en aanverwanten niet verder kwam, heb ik "mijn eigen hyperlink standaard" gemaakt, die dan omgezet wordt tot gewone XHTML.
Een van de functies van de xsl template die deze links omzet --waar ik erg blij mee ben-- is dat er onderscheid gemaakt wordt tussen interne en externe links, en dat anchors herkend worden. Op deze manier krijgen alle links op mijn web site een tooltip die bijvoorbeeld een van de volgende beschrijvingen bevat:
Interne link naar anchor "blaat" op pagina "blaat.html"
Interne link naar anchor "blaat" op deze pagina
Interne link naar bestand "blaat.zip"
Externe link naar "http://www.host.com/bestand.extensie"
En het probleem is...
Als mijn XSL stylesheet de pagina's verwerkt, krijgen alle links die voortkomen uit mijn XML bestanden deze tooltips, maar de links in het menu bijvoorbeeld niet. Dit is natuurlijk logisch, ik voeg het menu namelijk via datzelfde XSL bestand toe.
Omdat ik geen zin had om dubbel werk te doen, dacht ik slim te zijn: gewoon mijn originele links (eigen XML dialect) laten staan, en de links in het menu ook toevoegen in ditzelfde formaat, om vervolgens met een tweede stylesheet alle links te transformen. Ik transform immers toch naar XHTML, en XHTML zou even goed te verwerken moeten zijn als XML (ja, de pagina's zijn volledig gevalideerd
Maar als ik met mijn tweede stylesheet de XHTML pagina's transform gebeurt er gewoon niks
Hieronder volgt (het|de)? stylesheet in kwestie, dit is dus degene die de XHTML pagina's verwerkt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| <?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="reference">
<xsl:choose>
<xsl:when test="@type = 'extended'">
<xsl:choose>
<xsl:when test="@anchor">
<xsl:choose>
<xsl:when test="not(@page)">
<a href="#{@anchor}" title="Internal link to anchor "{@anchor}" on this page" onmouseover="self.status='Internal link to anchor "{@anchor}" on this page'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:when>
<xsl:otherwise>
<a href="{@page}.html#{@anchor}" title="Internal link to anchor "{@anchor}" on page "{@page}.html"" onmouseover="self.status='Internal link to anchor "{@anchor}" on page "{@page}.html"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<a href="{@page}.html" title="Internal link to page "{@page}.html"" onmouseover="self.status='Internal link to page "{@page}.html"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="@type = 'simple'">
<xsl:choose>
<xsl:when test="@anchor">
<a href="{@url}#{@anchor}" title="External link to anchor "{@anchor}" on page "{@url}"" onmouseover="self.status='External link to anchor "{@anchor}" on page "{@url}"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="(starts-with(@url, 'http://')) or (starts-with(@url, 'ftp://')) or (starts-with(@url, 'https://'))">
<a href="{@url}{@anchor}" title="External link to "{@url}"" onmouseover="self.status='External link to "{@url}"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:when>
<xsl:when test="starts-with(@url, 'mailto:')">
<a href="{@url}" title="Open default mail-client with new message to "{substring-after(@url,':')}"" onmouseover="self.status='Open default mail-client with new message to "{substring-after(@url,':')}"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:when>
<xsl:otherwise>
<a href="{@url}{@anchor}" title="Internal link to file "{@url}"" onmouseover="self.status='Internal link to file "{@url}"'; return true;" onmouseout="self.status=''; return true;"><xsl:apply-templates/></a>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="@type = 'anchor'">
<a id="{@id}" name="{@id}" title="{@id}"><xsl:apply-templates/></a>
</xsl:when>
<!-- Dit is gewoon een vuile hack, zodat ik vannacht het idee kon noteren zonder er nog lang mee bezig te hoeven zijn. -->
<xsl:when test="@type = 'weblogpost'">
<a id="{@id}" name="{@id}" rel="bookmark" href="{@href}" title="Link to this post (for bookmarking & linking)"><xsl:apply-templates/></a>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet> |
Dat dit stylesheet nogal lang draait is neem ik aan ook wel logisch vanwege de grote choose/when/otherwise constructie. De rest van de inhoud van de pagina's wordt netjes gekopieerd, maar er veranderd niks... Ik vindt dus in mijn XHTML output dezelfde <reference> elementen terug. Er worden overigens geen foutmeldingen of waarschuwingen weergegeven.
Ik gebruik overigens Apache Ant, met geintegreerde XSL taak. Dit is natuurlijk de combinatie Xerces en Xalan.
Heeft iemand enig idee hoe dit komt??
- Peter Odding
ps. Ik neem aan dat er heel wat aan te merken is op dit stylesheet, elk commentaar (constructief zou mooi zijn) is dan ook welkom. Vergeet aub niet dat ik nog niet lang met XSL bezig ben, en misschien gewoon iets stoms over het hoofd heb gezien... Alvast bedankt!