[XML/XSTL]Spaties bij elk 'template match'

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Ik heb het volgende probleem bij het renderen van mijn xml pagina m.b.v. een stylesheet.
Na elk element (template match) 'verzint' Mozilla een spatie. Dat wil ik dus niet, maar heb geen idee hoe ik dit voorkom. IE geeft geen spaties.

Uitvoer in Mozilla ziet er bijvoorbeeld zo uit:

Element1 Element2 Element3

Ik wil dus:

Element1Element2Element3

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Post even een stukje van de XSLT. En weet je zeker dat er in de XML-data geen spaties staan?

  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Dit is een test filetje, maar ik krijg hier hetzelfde resultaat, helaas.

Mijn stylesheet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<!-- Simpele transformatie van database.xml tot HTML -->

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

        <xsl:template match = "note">
            <html>
            <head><title>Messages tabel</title></head>
            <body><xsl:apply-templates/></body>
            </html>
        </xsl:template>

        <xsl:template match="msg"><xsl:apply-templates/></xsl:template>
        
        <xsl:template match="msg/*"><xsl:apply-templates/></xsl:template>

</xsl:stylesheet>


Volledige xml file (zonder spaties) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="database1.xsl"?>

<note>
    <msg>
        <source>JJJJJJJJJJJJJJJJJJ</source>
        <from>KKKKKKKKKKKKKKK</from>
        <to>LLLLLLLLLLLLLLLLLLLLLLL</to>
        <message>MMMMMMMMMMMMMMMMMMMMMMMMMM</message>
    </msg>
</note>


Output van mozzilla:
JJJJJJJJJJJJJJJJJJ KKKKKKKKKKKKKKK LLLLLLLLLLLLLLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMMMMM

[ Voor 109% gewijzigd door Krul op 04-03-2003 13:16 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

En je html output, hoe zit die er (exact) uit?

ennuh... mis ik nou niet een stukje van je xsl?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
drm schreef op 04 March 2003 @ 13:11:
En je html output, hoe zit die er (exact) uit?

ennuh... mis ik nou niet een stukje van je xsl?
Ik hoop het niet :D Maar ik had niet mijn volledige xml file gecopy paste. Maar heb mijn vorige post even geupdate (inlcusief output wat Mozilla geeft).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik snap deze regel even niet:
<xsl:template match="msg/*"><xsl:apply-templates/></xsl:template>

ik zou het zo aanpakken:

code:
1
2
3
4
5
<xsl:template match="msg">
    source=<xsl:value-of select="source"/><p/>
    from=<xsl:value-of select="from"/><p/>
   enzovoort.
</xsl:template>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
In the absence of a select attribute, the xsl:apply-templates instruction processes all of the children of the context node, including text nodes.
Je past templates toe op alle kinderen van msg en daar vallen ook tekst knopen onder. Probeer eens templates op alle kinderen van msg toe te passen: child :: * of in de afgekorte syntax simpleweg *.

edit: hum, : * is een smiley :* .

[ Voor 6% gewijzigd door mbravenboer op 04-03-2003 13:33 ]

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


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Alarmnummer schreef op 04 March 2003 @ 13:27:
Ik snap deze regel even niet:
<xsl:template match="msg/*"><xsl:apply-templates/></xsl:template>

ik zou het zo aanpakken:

code:
1
2
3
4
5
<xsl:template match="msg">
    source=<xsl:value-of select="source"/><p/>
    from=<xsl:value-of select="from"/><p/>
   enzovoort.
</xsl:template>
Wat jij zegt komt in principe in dit geval op hetzelfde neer, alleen maakt dat voor het spatie-probleem niet zoveel uit. Met jou methode krijg ik ook spaties tussen de elementen in Mozilla (heb trouwens de <p/> elementen natuurlijk wel weggehaald):

source=JJJJJJJJJJJJJJJJJJ from=KKKKKKKKKKKKKKK to=LLLLLLLLLLLLLLLLLLLLLLL message=MMMMMMMMMMMMMMMMMMMMMMMMMM
mbravenboer schreef op 04 March 2003 @ 13:32:
[...]

Je past templates toe op alle kinderen van msg en daar vallen ook tekst knopen onder. Probeer eens templates op alle kinderen van msg toe te passen: child :: * of in de afgekorte syntax simpleweg *.
Dit lost het probleem helaas niet op...

[ Voor 41% gewijzigd door Krul op 04-03-2003 13:40 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: Ik snap deze regel even niet:
XML:
1
2
3
<xsl:template match="msg/*">
   <xsl:apply-templates/>
</xsl:template>
Dit is in feite een default template: er wordt niets anders gedaan dan weer opnieuw templates toepassen op alle kinderen (inclusief text nodes) van het element waarop wordt gematched. Dit is in XSLT een default template, je hoeft hem dus in feite niet op te geven. Toch kan het soms wel duidelijk zijn.

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


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

mbravenboer schreef op 04 March 2003 @ 13:39:
[...]

Dit is in feite een default template: er wordt niets anders gedaan dan weer opnieuw templates toepassen op alle kinderen (inclusief text nodes) van het element waarop wordt gematched. Dit is in XSLT een default template, je hoeft hem dus in feite niet op te geven. Toch kan het soms wel duidelijk zijn.
Ok, heb ik weer iets geleerd.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Krul: Dit lost het probleem helaas niet op...
Laat je nieuwe code eens zien dan? (volledig, zodat wij hem snel uit kunnen voeren)

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


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
mbravenboer schreef op 04 maart 2003 @ 13:48:
[...]

Laat je nieuwe code eens zien dan? (volledig, zodat wij hem snel uit kunnen voeren)
Ik heb mijn XSL een stuk eenvoudiger gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<!-- Simpele transformatie van database.xml tot XHTML-tabel -->

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

        <xsl:template match = "note">
            <html>
            <head><title>Messages tabel</title></head>
            <body><xsl:apply-templates/></body>
            </html>
        </xsl:template>
        
        <xsl:template match="msg">
           source=<xsl:value-of select="source"/>
           from=<xsl:value-of select="from"/>
           to=<xsl:value-of select="to"/>
           message=<xsl:value-of select="message"/>
        </xsl:template>

</xsl:stylesheet>


code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="database1.xsl"?>
<note>
    <msg>
        <source>JJJJJJJJJJJJJJJJJJ</source>
        <from>KKKKKKKKKKKKKKK</from>
        <to>LLLLLLLLLLLLLLLLLLLLLLL</to>
        <message>MMMMMMMMMMMMMMMMMMMMMMMMMM</message>
    </msg>
</note>

[ Voor 21% gewijzigd door Krul op 04-03-2003 13:52 ]


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Ik zie nu wat hier fout aan is, heb hier tab/enters gebruikt dat levert de spaties op...
Moet mijn eigenlijke XSL file nu gaan aanpassen zodat ik niet steeds die recursieve apply-templates aanroep, want blijkbaar levert dat de spaties op.

[ Voor 47% gewijzigd door Krul op 04-03-2003 13:56 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Alarmnummer:
Ok, heb ik weer iets geleerd.
ik ook :o, ik verwachtte namelijk nog daadwerkelijk templates te zien ook :+

offtopic:
mbravenboer > als je geen smileys in je post geparsed wilt hebben kun je de [nosmileys] tag gebruiken

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik begrijp dat je het nu dus al aan de praat hebt?
drm: ik verwachtte namelijk nog daadwerkelijk templates te zien ook :+
Die gedachtengang volg ik helemaal niet ;) .
drm: [ nosmileys ]
Ah, bedankt voor de tip :) .

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


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
mbravenboer schreef op 04 March 2003 @ 14:03:
Ik begrijp dat je het nu dus al aan de praat hebt?
In mijn test xml/xsl bestanden werkt het dus nu wel....maar in mijn echte xml/xsl bestanden die ik aan het maken bent, krijg ik dus nog steeds spaties, omdat ik wel elke keer apply-templates aanroep. Die moet ik dus anders schrijven, wat nog niet zo makkelijk is omdat ik gebruik maak van het attribuut 'mode' om meerdere keren dezelfde data op een andere manier op het scherm te schrijven. Maar ik ga proberen om de stylesheet aan te passen zodat het wel werkt. En eigenlijk wil ik van die 'mode' af en met if-statements gaan werken. Maar dan moet ik me eerst goed gaan verdiepen in XML/XSLT.

In ieder geval bedankt voor jullie hulp :) !

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Op zich is die mode best aardig hoor ;) .

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


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

mbravenboer:
Die gedachtengang volg ik helemaal niet ;) .
Euh, ja, ik bedoel in feite 't zelfde als Alarmnummer, geloof ik.

Als ik 't goed begrijp wordt er nu een default-template toegepast op alle childnodes van 'msg', door de <xsl:apply-templates /> in de <xsl:template match="msg/*" /> node. Ik zat dus eigenlijk te zoeken naar een value-of node, maar die was er niet, en dat was mijn verwarring... Het feit dat er dus sprake kan zijn van default-templates is voor mij nieuw :)

drm is dan ook behoorlijke xsl n00b

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
drm: Als ik 't goed begrijp wordt er nu een default-template toegepast op alle childnodes van 'msg', door de <xsl:apply-templates /> in de <xsl:template match="msg/*" /> node.
Nee, het zit toch iets anders: xsl:apply-templates past alle templates in een transformatie toe op alle kinderen van de msg. Hier ontbreekt alleen maar het select attribuut, wat dan dus de betekenis van "alle kinderen" heeft (wat dus niet child:* is omdat tekst knopen er ook onder vallen :+ )

Default templates worden gebruikt als er geen zelf gedefinieerde templates toepasbaar zijn. Deze templates definieren default gedrag voor elementen en tekst knopen. Voor tekst knopen wordt de tekst van de knoop opgeleverd, voor elementen worden de templates toegepast op alle kinderen.

Met name die laatste default template is erg handig: veel XSL Transformaties zullen verdacht weinig doen zonder die default template. Het definieert een soort standaard traversal zodat je zelf niet de volledige traversal hoeft te specificeren.

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


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

* drm snapt 'm :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Alhoewel ik nu een andere implementatie gebruik, heb ik nu wel de oorzaak en oplossing gevonden :). Ik maak nu gebruik van HTML en TEXT output en geef dat met de volgende tags aan:
code:
1
2
3
<xsl:output method = "html" />
<p>Hier komen HTML tags of andere text MET spaties<p>
<xsl:text>Hier komt plain text zonder spaties</xsl:text>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dat zorgt er alleen maar voor dat je geen mixed content meer gebruikt. Mixed content zorgt inderdaad voor de moeilijkheden. De oplossing met xsl:text heeft echter niets met de text output method te maken: het is gewoon een manier om je tekst niet op te nemen als mixed content.

Zie ook deze note in de XSLT 2.0 working draft:
It is not always necessary to use the xsl:text instruction to write text nodes to the result tree. Literal text can be written to the result tree by including it anywhere in a content constructor, while computed text can be output using the xsl:value-of instruction. The principal reason for using xsl:text is that it offers improved control over whitespace handling.
Voor de manier waarop whitespace gestripped moet worden:
http://www.w3.org/TR/xslt20/#strip

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


  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Topicstarter
Thanx....ga ik even goed naar kijken....het wordt me al wat helderder.
Pagina: 1