Avatar billede themepark Nybegynder
14. marts 2005 - 23:24 Der er 11 kommentarer

Whitespace helvede for selv det simpleste XSLT dokument

Jeg har følgende XSLT dokument:

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

    </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

som giver følgende HTML fil med XSLTransform

<HTML>
  <HEAD>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
      <TITLE></TITLE>
  </HEAD>
  <BODY>A
      B
      E
      F
     
      C
      D
     
  </BODY>
</HTML>

Problemet er, at jeg ikke vil have alle de mellemrum med, jeg vil gerne have det hele venstrestillet (ligesom HTML taggene er), og jeg har forgæves forsøgt at finde hoved og hale i alle de forskellige måder at styre whitespace på. Er der nogen, der kan fortælle mig, præcis hvad jeg skal have med for at fjerne alle de mellemrum? :(

Venlig hilsen
Michael K. P.
Avatar billede Slettet bruger
15. marts 2005 - 10:02 #1
Prøv at sætte xsl:output ind - nedenstående er blot et eksempel (ident styre whitespace generering) men der kan godt være noget med XSL-processoren som du ikke kan styre.
<xsl:output method="html" indent="no" encoding="iso-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
Avatar billede Slettet bruger
15. marts 2005 - 13:04 #2
Du er ihvertfald nødt til at lave en template der matcher de enkelte elementer (ved ikke hvad elementerne der indeholder A, B, C osv. hedder) - fordi den overordnede apply-templates som du benytter dig af medtager alt. Prøv f.eks.:

<xsl:template match="navn-paa-element-med-a" xml:space="preserve"><!-- linjeskift her -->
<xsl:value-of select="normalize-space(.)" /></xsl:template>

-og se hvad du får ud af det.

Ellers må du simpelthen vise os en bid af XML filen også.

/CS
Avatar billede themepark Nybegynder
17. marts 2005 - 12:34 #3
Tja...lidt hjælper de to ting da, men ikke nok :(

<HTML>
  <HEAD>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
      <TITLE></TITLE>
  </HEAD>
  <BODY>A B E F C D</BODY>
</HTML>

Dette er mit output nu (med XSLTransform), og det jeg ønsker er

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE></TITLE>
</HEAD>
<BODY>
A
B
E
F
C
D
</BODY>
</HTML>

(egentlig helst uden meta tagget, men hvis jeg ikke kan få det væk, så går det nok).

Mit XSLT ser sådan ud

<xsl:template match="TEST" xml:space="preserve">
    <HTML>
    <HEAD>
    <TITLE></TITLE>
    </HEAD>
    <BODY>
<xsl:value-of select="normalize-space(.)" />
    </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

og mit XML er sådan

<?xml version="1.0" encoding="UTF-8"?>

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

  <TEST>A

    <TEST>B

      <TEST/>E

      <TEST/>F

    </TEST>

    <TEST/>C

    <TEST/>D

  </TEST>

Så mange er ordene...er der nu nogle, der kan hjælpe mig med en løsning? :(
Avatar billede Slettet bruger
18. marts 2005 - 00:00 #4
Aha - ser du; eet af problemerne her, er at <TEST> indeholder både elementer og text() - outputtet fra en value-of er samtlige textnodes i et element og dettes childnodes.

I dit XML har det første TEST element flg. textnodes A, C & D og 3 TEST elementer - for at generere dit ønskede output skal du kunne processere hver textnode for sig selv, og det er mere end besværligt med XSLT (hvis overhovedet muligt).

/CS
Avatar billede Slettet bruger
18. marts 2005 - 00:09 #5
Damn - just nailed it :-)

Her er det fulde stylesheet:

<?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" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
    <HTML>
    <HEAD>
    <TITLE></TITLE>
    </HEAD>
    <BODY>
        <xsl:apply-templates />
    </BODY>
    </HTML>
  </xsl:template>
 
  <xsl:template match="TEST"><xsl:apply-templates /></xsl:template>
 
  <xsl:template match="TEST/text()"><xsl:value-of select="concat('&#x0A;', normalize-space(.))" /></xsl:template>
 
</xsl:stylesheet>

/CS
Avatar billede Slettet bruger
18. marts 2005 - 00:12 #6
Bemærk venligst at HTML outputtet jo naturligvis stadig bare viser "A B E F C D" medmindre du bruger et <pre> element eller en tilsvarende CSS rule...

/CS
Avatar billede themepark Nybegynder
18. marts 2005 - 13:06 #7
HTML outputtet er ikke så vigtigt lige nu, det var mere hovedsageligt for min egen overskueligheds skyld, at jeg vil have det venstrestillet :)

Men jeg kigger da lige på det...men sig mig, hvad er &#x0A; for et tegn?
Avatar billede Slettet bruger
18. marts 2005 - 13:39 #8
Den korte: &#x0A; er såmænd et linjeskift :-)

Den lange: "&#" starter en såkaldt numerisk entity, "x" siger at jeg gerne vil bruge hexadecimal notation, og "0A" er hex for tallet 10 som er ASCII koden for et linjeskift.

/CS
Avatar billede themepark Nybegynder
18. marts 2005 - 13:43 #9
Damn...hvorfor tænkte jeg mig ikke bare om, og oversatte det hexadecimale...jeg kender godt notationen, anede bare ikke hvad det var for et tegn *g*
Avatar billede themepark Nybegynder
20. marts 2005 - 16:49 #10
Jeg har testet det nu, og det virker jo, problemet er bare, at HTML taggene stadig har whitespace, og jeg ville også have dem venstrestillet :(
Avatar billede Slettet bruger
22. marts 2005 - 15:15 #11
Så vil jeg gætte på at du kan fixe det ved at venstrestille dem i rodtemplaten OG inkludere xml:space attributten herpå - altså:

<xsl:template match="/" xml:space="preserve">
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<xsl:apply-templates />
</BODY>
</HTML>
</xsl:template>

/CS
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