Toon posts:

[XSLT] XML vs XHTML matching??

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer dus een webpagina te genereren uit XML mbv XSLT. Nou gebruikte ik eerst als output gewoon XML. Officieel moet dit natuurlijk XHTML zijn, maar nadat ik dat dus veranderd heb werken sommige pagina's niet meer goed. Een versimpeld stuk code dat niet goed gaat is de volgende:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0"?>

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

    <xsl:output method="xhtml"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:variable name="newtree">
                    <msg>Hallo!</msg>
                </xsl:variable>
                <xsl:apply-templates select="$newtree" mode="snd"/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="msg" mode="snd">
        Yeah
    </xsl:template>
    
</xsl:stylesheet>


Het probleem zit dus in de newtree variabele en de laatste template: als XHTML gekozen wordt als output, wordt deze template niet uitgevoerd, bij XML wel (eigenlijk ligt het trouwens niet eens aan die xsl:output tag, maar aan xhtml namespace die geinclude wordt). Als ik in die laatste template trouwens match tegen "/" doet ie het wel maar dat wil ik eigenlijk niet.

Mijn vraag is dus of ik iets fout doe of dat dit een bug is in de (XSLT 2.0) implementatie van de gebruikte Saxon XSLT engine.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Eigenlijk is het al heel sneu dat er een xhtml output method nodig is in XSLT, maar ja dat is de vraag niet ;) .
eigenlijk ligt het trouwens niet eens aan die xsl:output tag, maar aan xhtml namespace die geinclude wordt.
Exact (alhoewel ik de term include niet zou gebruiken). Je bouwt het element:
code:
1
<msg>Hallo!</msg>

op. Dit element valt binnen de XHTML namespace omdat dat immers de default namespace van het document is. Dit is niet juist, want "msg" is uiteraard geen XHTML element.

Je zou bijvoorbeeld dit kunnen doen:
code:
1
<msg xmlns="">Hallo!</msg>

Nu heeft msg geen namespace meer en werkt het zaakje waarschijnlijk.

Waar ligt dan eigenlijk precies het probleem? Saxon zal waarschijnlijk niet gaan kijken of msg wel een XHTML element is, dus daar kan de oorzaak niet echt liggen. Het probleem is de namespace van de elementen in de XPaths. Wat is de namespace van msg in de match van de template?

Met het "default-xpath-namespace" attribuut kan je de namespace instellen, maar uiteraard kan je hem ook zelf opgeven in de XPath expressies (bijvoorbeeld html:msg, waarbij de html prefix dan uiteraard gebonden is aan de XHTML namespace).

De kern van het probleem is dit stukje:
In the absence of this attribute, an unqualified NameTest (that is, a NameTest that is an NCName) matches an expanded-QName whose namespace URI is null: the default namespace (as defined by an xmlns="some-uri" declaration) is not used.
Al met al is het dus de netste oplossing om "msg" de creeeren zonder namespace zoals in het voorbeeld hierboven. Dit is in feite wat je bedoelt te bereiken waarschijnlijk. Al het andere geklets legt meer het probleem uit en is wellicht nuttig in andere situaties :) .

Leuk trouwens dat je met Saxon & XSLT 2.0 bezig bent :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het is erg makkelijk dat je standaard weer opnieuw templates kan toepassen in XSLT 2.0 he? Ik zie het je hier gebruiken. Het maakt veel transformaties een stuk eenvoudiger en overzichtelijker. Het past ook veel beter in de ietwat functionele denkwijze van XSLT. Doodzonde dat het niet al altijd mogelijk is geweest :*) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
mbravenboer schreef op 08 March 2003 @ 20:37:
Je zou bijvoorbeeld dit kunnen doen:
code:
1
<msg xmlns="">Hallo!</msg>

Nu heeft msg geen namespace meer en werkt het zaakje waarschijnlijk.
Hmmm, ok, ik heb het nog niet getest, maar ik geloof graag dat dit gaat werken. Het enige probleem is dat ik eigenlijk een hele boom heb ipv 1 msg tag, en om nou dus overal dat xmlns attribuut toe te gaan voegen trekt me niet echt.

Als ik dan toch aan alle tags iets toe moet voegen dan nog liever <myast:msg> oid. Enige probleem is dan dat ik dus al de XPath queries moet herschrijven (tenzij ik dus meteen die default-xpath-namespace gebruik)... En om het nog erger te maken, doordat bepaalde code hergebruikt word in al mn pagina's betekend dat waarschijnlijk dat ik deze nieuwe namespace in alle pagina's moet doorvoeren...

Verder moet ik deze namespace dan ook weer specificeren (volgens mij) in alle gebruikte XML files (aangezien die msg tag van het zelfde 'type' is als de XML input). Maar aangezien je dit volgens mij alleen in de XML files zelf kunt aangeven betekend dat dat meteen iedereen/elk project die de XML files gaan gebruiken aan deze namespace vast zitten en of dat nou is wat je wil...
Leuk trouwens dat je met Saxon & XSLT 2.0 bezig bent :) .
Ja dat kon niet uitblijven natuurlijk...Maar ik moet zeggen, tot nu toe bevalt het best goed!
Het is erg makkelijk dat je standaard weer opnieuw templates kan toepassen in XSLT 2.0 he? Ik zie het je hier gebruiken. Het maakt veel transformaties een stuk eenvoudiger en overzichtelijker. Het past ook veel beter in de ietwat functionele denkwijze van XSLT. Doodzonde dat het niet al altijd mogelijk is geweest :*) .
't is net Stratego :+ :D. Maar dat is idd erg makkelijk, verder heb ik ook al een paar keer erg handig gebruik kunnen maken van de functionaliteit om meerdere outputs te genereren met 1 xsl file, ook een erg handige feature. Maar voor de rest ben ik eigenlijk nog weinig nieuwe dingen tegengekomen, maar goed ik pas anderhalve dag bezig en heb er ook nog niet echt naar gezocht... Eerst maar even verder in die namespaces duiken...Bedankt voor de tips in ieder geval!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
hondass50: Het enige probleem is dat ik eigenlijk een hele boom heb ipv 1 msg tag, en om nou dus overal dat xmlns attribuut toe te gaan voegen trekt me niet echt.
Overal hoeft in principe ook niet: met xmlns="" wordt "geen namespace" de nieuwe default namespace. Alleen als je weer html nodig hebt zal je weer xmlns="http://...." moeten aangeven.
Als ik dan toch aan alle tags iets toe moet voegen dan nog liever <myast:msg> oid. Enige probleem is dan dat ik dus al de XPath queries moet herschrijven (tenzij ik dus meteen die default-xpath-namespace gebruik)...
Inderdaad ... Meestal vind ik het zelf ook aantrekkelijker om als er toch namespaces gebruikt worden, dan ook gelijk voor alle 'talen' die een rol spelen in de transformatie namespaces te gebruiken.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment