Avatar billede r.hegaard Nybegynder
10. august 2009 - 13:24 Der er 8 kommentarer og
1 løsning

Gøre brug af formatering fra XML'en

Jeg er ved at opbygge et XSL-Stylesheet til formattering af et XML-dokument. Det skal dog være muligt at have lidt formatering i selve XML'en også, men jeg kan desværre ikke få det til at virke. Hvis jeg f.eks. vil have kursiv tekst, har jeg prøvet at skrive <i>...</i> i selve XML'en, men det virker ikke, fordi det bare bliver opfattet som XML.
Jeg har så prøvet at skrive ... og så lave en søg og erstat i XSL-dokumentet, for at få det rettet til <i>...</i>, men det kan jeg heller ikke få til at virke. Jeg har her et eksempel på det:

XML-filen:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?>
<test>
  <test>ABCDEF</test>
  <test><i>ABC</i>DEF</test>
</test>

XSL-filen:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes" />
<xsl:template match="/test">
  <html>
  <body>
    <xsl:value-of select="test[1]" /><br />
    <xsl:call-template name="insertHTML">
    <xsl:with-param name="text" select="test[1]"/>
    </xsl:call-template><br />
    <xsl:call-template name="insertHTML2">
    <xsl:with-param name="text" select="test[1]"/>
    </xsl:call-template><br />
    <xsl:value-of select="test[2]" disable-output-escaping="yes" /><br />   
    <i><xsl:value-of select="test[2]" /></i>
  </body>
  </html>
</xsl:template>
<xsl:template name="replace-string">
  <xsl:param name="text"/>
  <xsl:param name="replace"/>
  <xsl:param name="with"/>
  <xsl:choose>
  <xsl:when test="contains($text,$replace)">
    <xsl:value-of select="substring-before($text,$replace)"/>
    <xsl:value-of select="$with"/>
    <xsl:call-template name="replace-string">
    <xsl:with-param name="text" select="substring-after($text,$replace)"/>
    <xsl:with-param name="replace" select="$replace"/>
    <xsl:with-param name="with" select="$with"/>
    </xsl:call-template>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$text"/>
  </xsl:otherwise>
  </xsl:choose>
</xsl:template>
<xsl:template name="insertHTML">
  <xsl:param name="text"/>
  <xsl:variable name="i"><i></i></xsl:variable>
  <xsl:call-template name="replace-string">
  <xsl:with-param name="text">
    <xsl:call-template name="replace-string">
    <xsl:with-param name="text" select="$text"/>
    <xsl:with-param name="replace" select="'[/i]'"/>
    <xsl:with-param name="with" select="substring($i,4,4)"/>
    </xsl:call-template>
  </xsl:with-param>
  <xsl:with-param name="replace" select="''"/>
  <xsl:with-param name="with" select="substring($i,1,3)"/>
  </xsl:call-template>
</xsl:template>
<xsl:template name="insertHTML2">
  <xsl:param name="text"/>
  <xsl:variable name="i">&lt;i&gt;&lt;/i&gt;</xsl:variable>
  <xsl:call-template name="replace-string">
  <xsl:with-param name="text">
    <xsl:call-template name="replace-string">
    <xsl:with-param name="text" select="$text"/>
    <xsl:with-param name="replace" select="'
'"/>
    <xsl:with-param name="with" select="substring($i,4,4)"/>
    </xsl:call-template>
  </xsl:with-param>
  <xsl:with-param name="replace" select="'[i]'"/>
  <xsl:with-param name="with" select="substring($i,1,3)"/>
  </xsl:call-template>
</xsl:template>
</xsl:stylesheet>

Hvad gør jeg forkert og hvad skal jeg gøre, for at få det til at virke?

På forhånd tak.
Avatar billede jokkejensen Novice
10. august 2009 - 15:07 #1
1: brug <em> og ikke <i>
2: <xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes" />

=

<xsl:output method="xml" indent="yes" />


3:
<xsl:template match="/test"><xsl:text disable-output-escaping="yes"><![CDATA[
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">]]></xsl:text>
  <html>
  <body>
    <em><xsl:value-of select="//test" /></em>
  </body>
  </html>
</xsl:template>


/J
Avatar billede jokkejensen Novice
10. august 2009 - 15:10 #2
dit xml bør se sådan her ud:

&gt;em&lt; for <em>

og så bruge <xsl:value-of select="..." disable-output-escaping="yes" />

Så vil den lave &gt;em&lt; om til <em>

eller brug <test><[!CDATA[<em>test</em>]]></test>
Avatar billede jokkejensen Novice
10. august 2009 - 15:12 #3
... &lt;em&gt;
Avatar billede r.hegaard Nybegynder
11. august 2009 - 08:48 #4
jokkejensen> Tak for svaret. Jeg kan ikke lige se, at det giver nogen forskel at bruge <em> i stedet for <i> og doctype på en anden måde. Hvorfor skulle det give en forskel?
Jeg kender attributen disable-output-escaping="yes", men jeg synes ikke, at jeg kan se, hvordan den kan bruge i det konkrete eksempel. Kan du give et eksempel på det?
Avatar billede jokkejensen Novice
11. august 2009 - 09:45 #5
angående em, så er <italic> deprecated i xhtml, så hvis du vil skrive xhtml, så tag at brug <em> og ikke <i>, men ja, det kan vel være ligegodt, det var bare lige så du vidste.

Når du sætter doctype der, så bliver outputtet i xml, du vil gerne præsentere en html side formoder jeg ?

ex på disable-output....


<xsl:variable name="mitHTML"><![CDATA[&lt;em&gt;HEJ&lt;/em&gt;]]></xsl:varible>

<xsl:value-of select="$mitHTML" />


= &lt;em&gt;HEJ&lt;/em&gt;

<xsl:value-of select="$mitHTML" disable-output-escaping="yes" />
Avatar billede r.hegaard Nybegynder
12. august 2009 - 12:36 #6
Tak for svarene.

Jeg kan ikke helt bruge det seneste eksempel, fordi det ikke duer med mere formatering i min XML end <em>, [ em ] eller lignende.
Men jeg har fået det til at virke nu, ved at lave en template med nogle af dine idéer, som klarer det hele.

Jeg kom i øvrigt lige til at se, at Eksperten har "ædt" de steder, hvor der i mit oprindelige spørgsmål stod [ i ] (uden mellemrum).

Er <u> og <b> heller ikke gyldige i XHTML og hvad skal man så bruge der i stedet?

M.h.t. doctype, så er det rigtigt, at jeg gerne vil have det i HTML eller rettere XHTML, men det er jo også det der står i min output-doctype?
Avatar billede jokkejensen Novice
12. august 2009 - 12:42 #7
b = strong
u : findes ikke, brug <span style="text-decoration: underline">tekst</span>
Avatar billede jokkejensen Novice
12. august 2009 - 12:44 #8
Problemet ved at bruge <xsl:output> til deklerationen, er at den så vil servicere det som xml/application og ikke text/html, det er korrekt at afvikle xhtml med xml/applikation content-type, men hvis der kommer en eneste fejl der gør det ikke validere som et xml ark, så får du en "yellow screen of death". Derfor plejer jeg at holde doctype ude.
Avatar billede r.hegaard Nybegynder
12. august 2009 - 15:17 #9
OK, tak for hjælpen.
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