Avatar billede themepark Nybegynder
07. marts 2005 - 12:32 Der er 15 kommentarer

Whitespace foran elementer

Som det er nu, bruger jeg blot

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

til at udskrive alle mine elementer, problemet er bare, at jo dybere, elementet er nestet, jo mere whitespace kommer der foran. Hvis jeg nu gerne vil fjerne alt whitespace, saaledes, at alle mine elementer faktisk bare er venstrestillede, hvordan kan jeg saa goere det?

Venlig hilsen
Michael K. P.
Avatar billede atoft Nybegynder
07. marts 2005 - 12:35 #1
prøv at sætte indent="no" på dit xsl:output element
Avatar billede themepark Nybegynder
07. marts 2005 - 12:38 #2
Jeg har ikke noget output element? Yderligere er der ogsaa det problem, at lige saa snart den skal til at gaa op i traet for at finde det naeste element, saa kommer elementet paa en linje, men hvis jeg skriver noget foran det kommer det paa linjen ovenover.

Dvs.

A
5

hvis den soeger opad, men

A5

hvis den soeger nedad.
Avatar billede atoft Nybegynder
07. marts 2005 - 12:43 #3
Så tilføj et <xsl:output indent="no" /> lige under xsl:stylesheet elementet

jeg er ikke med på hvad du mener med at søge op og ned
Avatar billede themepark Nybegynder
07. marts 2005 - 12:46 #4
ja, altsaa soege op, at den bliver ved med at tage en parent, indtil den finder en, der har boern, som ikke er blevet tjekket endnu. Og nedad er bare at soege efter det foerste barn.
Avatar billede themepark Nybegynder
07. marts 2005 - 12:47 #5
Hmm...indent virker ikke :(
Avatar billede themepark Nybegynder
07. marts 2005 - 13:53 #6
Det skulle heller ikke have nogen betydning, da indent som default er no, ifoelge W3 :(
Avatar billede atoft Nybegynder
07. marts 2005 - 13:55 #7
hvad med attributten method på output er den sat til text?
Avatar billede arne_v Ekspert
07. marts 2005 - 17:51 #8
Hvordan checker du output ?

Eller: er du sikker på at det er output fra XSLT som har indrykning og ikke
det værktøh du bruger til at vise output med som "smukkeserer" XML ved
at lave indrykning ?
Avatar billede Slettet bruger
08. marts 2005 - 01:39 #9
Whitespace er en smule tricky i XML/XSLT - men det er som regel kun indtil man har fundet ud af hvad man vil.

Hvis du f.eks. forsøger at konvertere en XML fil til en kommafil vha. XSLT, bør du ihvertfald starte med at bruge den omtalte output-mode "text" (<xsl:output mode="text" />) - "indent" parameteren er *kun* ment som en hjælp til at gøre output mere læsbart, da den faktisk kun fortæller at "processoren *må* (dvs. er ikke forpligtet til) tilføje whitespace til outputtet".

Tilbage til problemet - du kan desuden benytte dig af normalize-space() funktionen når du udskriver elementer der i XML filen indeholder (for) meget whitespace, sådan:

<xsl:value-of select="normalize-space(ELEMENT)" />

hvilket vil fjerne alt det der er defineret som "insignificant whitespace".

Desuden skal du som regel "shrink-wrappe"(TM) udvalgte templates, alá:

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


Endelig er der <xsl:strip-space /> elementet der tager en attribut "elements" som indeholder en whitespace-separeret (sjovt nok) liste over elementer der i outputtet skal have fjernet extra whitespace, f.eks.:

<xsl:strip-space elements="strong span a" />

/CS
Avatar billede Slettet bruger
08. marts 2005 - 01:41 #10
Oh - and don't get me started on the "xml:space" attribute... :-)
Avatar billede themepark Nybegynder
08. marts 2005 - 20:26 #11
It aint helping :(

Okay, her er alle de informationer, jeg overhovedet kan give. Dels bruger jeg Mozilla på Linux. Og mit stylesheet ser i en forkortet udgave sådan her ud.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
    <xsl:if test="not(*)">H</xsl:if>
    <xsl:apply-templates/>
</BODY>
</HTML>
  </xsl:template>
</xsl:stylesheet>

Lige nu ønsker jeg ikke at skrive elementet ud (det kommer jeg til senere), men bare nogle bogstaver afhængigt af nogle ting, jeg tjekker på, det virker sådan set fint. Jeg havde tidligere mellemrum foran mine elementer, altså indenteret dem, i mit XML dokument, for overskuelighedens skyld, men det har jeg fjernet nu. Og jeg har prøvet de første par ting, men uden held.

Hvad er det, der går galt?
Avatar billede Slettet bruger
09. marts 2005 - 00:49 #12
OK - hvad med lige at dumpe en smule af XML filen også, så vi kan teste det?

Er desuden i tvivl om hvad det egentlig er du gerne vil opnå - vil du gerne have hvert nyt element på sin egen linje med childnodes i samme linje, eller skal alle elementer bare komme på en ny linje?

/CS

PS: Dit eksempel-stylesheet ser ud til at generere HTML, HEAD, BODY osv. for *hvert* element i din source-XML. Det er vel ikke meningen?
Avatar billede themepark Nybegynder
09. marts 2005 - 10:14 #13
Hov, det var en copy-paste fejl, da jeg havde rodet lidt med det, og ville sætte det tilbage som det var før...det skal selvfølgelig være før og efter de to templates :)

Ja, hvert enkelt element skal komme på en ny linje og stå helt til venstre, og mht. koden må jeg lige paste den, når jeg får tid.
Avatar billede themepark Nybegynder
09. marts 2005 - 17:23 #14
Et lille eksempel

<E>
  <F>
</E>
Avatar billede themepark Nybegynder
09. marts 2005 - 17:32 #15
Hov, faktisk er det med HTML ikke en fejl, naturligvis vil jeg kun have det genereret 1 gang, men det eneste sted, det aabenbart kan staa er inden i template match, jeg kan hverken smide den lige efter stylesheet tagget eller i starten af dokumentet, saa faar jeg en parse fejl.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester