Toon posts:

XML/XSLT wel op win2kpro niet op NT40

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met XML en XSLT wat op de server samengevoegd wordt tot een HTML document welke vervolgens naar de client gaat. Nu heb ik de volgende documenten;

Het XML document

<login>
<account>
<username>Niels</username>
<password>Blaat</password>
</account>
<account>
<username>Irene</username>
<password>Hallo</password>
</account>
</login>


en het XSL document;

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
<h1>login info</h1>

<xsl:for-each select="login/account">
<h3><xsl:apply-templates select="username"/></h3>
<h3><xsl:value-of select="password"/></h3>
</xsl:for-each>

</html>

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

er is nog een ASP script documentje wat de boel samenvoegt.

set objXMLDoc = Server.CreateObject("Microsoft.XMLDOM")
objXMLDoc.async = false
objXMLDoc.load(Server.MapPath(sXMLFilename))
set objXSLDoc = Server.CreateObject("Microsoft.XMLDOM")
objXSLDoc.async = false
objXSLDoc.load(Server.MapPath(sXSLFilename))

Response.Write(objXMLDoc.transformNode(objXSLDoc))


Nu werkt dit wel op mijn thuiscomputer met windows2000 professional (zonder daar extra software op te installeren) maar het werkt niet op onze server die draait op windows NT 4 server (waarop ik MsXml3 sp1 heb geinstalleerd)

Hoe is dit mogelijk?? :?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik weet niets van de Microsoft XML/XSL spullen (behalve dat ze altijd veel problemen veroorzaken ;) ) maar ik kan wel wat over je stylesheet zeggen.

Het is volgens mij verplicht om een output method op te geven (zo niet, dan toch netjes ;) ).

Verder zou ik for-each proberen te vermijden. Gebruik de recursieve aard van XSL en gebruik daarom ook meerdere templates. Het is ook erg makkeijk om de default-templates te gebruiken. Verder kan het misschien ook nog door je HTML komen...
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
<?xml version="1.0"?>

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

    <xsl:output method="html"/>

    <xsl:template match="login">
        <html>
            <head>
                <title>Accounts</title>
            </head>

            <body>
                <h1>login info</h1>

                <xsl:apply-templates select="account"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="username">
        <h3><xsl:value-of select="."/></h3>
    </xsl:template>

    <xsl:template match="password">
        <h3><xsl:value-of select="."/></h3>
    </xsl:template>

</xsl:stylesheet>

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


Verwijderd

Topicstarter
Bedankt voor je tips. Alleen waarom zou ik for-each moet willen vermijden? Het maakt de code wel overzichtelijk.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik vind zelf for-each eigenlijk niet overzichtelijk, maar dat is misschien wel een kwestie van smaak...

Concrete voordelen van apply-templates zijn:
1. Het is duidelijker wat de huidige knoop is

2. Je kan stylesheet importeren en een template overriden. Als je navigeert met for-each is dat niet mogelijk.

3. Navigatie hoef je eigenlijk niet te definieren in XSL. XSL is gebaseerd op structure recursie. Als je geen controle over de navigatie nodig hebt zou je dus ook niet zelf de navigatie moeten definieren (behalve om naar andere plekken in de boom te gaan.

4. Door zoveel mogelijk gebruik te maken van templates ipv for-each en value-of (eigenlijk had ik in het voorbeeld hierboven ook helemaal niet xsl:value-of moeten gebruiken in de templates van name en password) zorg je ervoor dat je later gemakkelijk door het toevoegen van een template extra subelementen kunt opvangen. Nu navigeer je namelijk expliciet alleen maar naar username en password. Als je nu nieuwe content gaat toevoegen in een account (wat natuurlijk een heel goed kan gaan gebeuren) dan moet je een bestaande template gaan aanpassen. Als je apply-templates gebruikt hoef je alleen maar een nieuwe template toe te voegen. De bestaande template wordt zo niet steeds complexer.

5. Je kan for-each niet gebruiken in combinatie met mixed content: "<bold> hallo <italic> boe </italic stom he?</bold>" is juist ideaal met behulp van templates te transformeren :) . Met for-each gaat dat absoluut niet opschieten en is het volgens mij geeneens mogelijk.

Ok,niet echt hele sterke argumenten (en for-each hoeft ook zeker niet verbannen te worden) maar toch zijn het denk ik wel logische punten voor apply-templates :) .

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