[xml/xsl] html uit xml doorgeven via call-template

Pagina: 1
Acties:

  • Evilbee
  • Registratie: November 2002
  • Laatst online: 13:27
Ik heb een xml bestand met de volgende inhoud:
XML:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="ISO-8859-1" ?>
<data>
  <posts>
    <post id="4"><title><![CDATA[<strong>test</strong>]]></title></post>
    <post id="3"><title><![CDATA[<em>test</em>]]></title></post>
    <post id="2"><title>title 3</title></post>
    <post id="1"><title>title 4</title></post>
  </posts>
</data>


Hier staat html in. Als ik dit wil weergeven via xsl gaat het op de volgende manier goed:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="data/posts/post">
  label: <xsl:value-of select="title" disable-output-escaping="yes" /><br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


Nu staat de 1e regel keurig bold en de 2e cursief.

Maar omdat hier nog een header en menu enzo om heen moet wil ik dit gaan doen via call-template.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="wrapper.xsl" />
  <xsl:template match="/">
    <xsl:call-template name="wrapper">
      <xsl:with-param name="content">
<!-- start content -->
<xsl:for-each select="data/posts/post">
  label: <xsl:value-of select="title" disable-output-escaping="yes" /><br />
</xsl:for-each>
<!-- end content -->
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>


En dan wrapper.xsl
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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="xhtml" indent="yes"/>
<xsl:template match="/" name="wrapper">
<xsl:param name="content" /> 
<html>
<head>
  <title>test</title>
  <style type="text/css">
    div#blaat {
      background-color: #00ff00;
    }
  </style>
</head>
<body>
<div id="blaat">
<xsl:copy-of select="$content" />
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


Als ik dit dus doe, dan zijn bij de 1e en 2e regel de html tags ge-escaped. Ook als ik disable-output-escaping="yes" weghaal heeft dit geen effect.

Het zoeken leverde niks op. Dan kreeg ik alleen topics over het toepassen van call-template, maar dat gaat wel goed. Alleen de waarde van die value-of wordt ergens ge-escaped. Heeft iemand enig idee hoe ik dit kan oplossen??

LinkedIn - Collega worden?


  • Sendy
  • Registratie: September 2001
  • Niet online
Jouw manier van een template gebruiken en via een param(eter) de inhoud doorgeven zal wel de oorzaak zijn. Dit is een nogal aparte manier.

Als je de gangbare manier gebruikt, gebeurd het dan ook nog?

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xsl:template match="/">
<html>
  <head>
    <title>test</title>
    <style type="text/css">
div#blaat {
        background-color: #00ff00;
}
    </style>
  </head>
  <body>
    <apply-templates select="data/posts/post"/>
  </body>
</html>
</xsl:template>

<xsl:template match="post">
  <div id="blaat"  <!-- id? geen class? -->
label: <xsl:value-of select="title" disable-output-escaping="yes"/><br />
  </div>
</xsl:template>


Het is misschien een bug in je XSLT processor?

[ Voor 3% gewijzigd door Sendy op 31-12-2006 18:09 ]


  • Evilbee
  • Registratie: November 2002
  • Laatst online: 13:27
Sendy schreef op zondag 31 december 2006 @ 18:07:
Jouw manier van een template gebruiken en via een param(eter) de inhoud doorgeven zal wel de oorzaak zijn. Dit is een nogal aparte manier.

Als je de gangbare manier gebruikt, gebeurd het dan ook nog?

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xsl:template match="/">
<html>
  <head>
    <title>test</title>
    <style type="text/css">
div#blaat {
        background-color: #00ff00;
}
    </style>
  </head>
  <body>
    <apply-templates select="data/posts/post"/>
  </body>
</html>
</xsl:template>

<xsl:template match="post">
  <div id="blaat"  <!-- id? geen class? -->
label: <xsl:value-of select="title" disable-output-escaping="yes"/><br />
  </div>
</xsl:template>


Het is misschien een bug in je XSLT processor?
Het probleem hiervan is dat ik dan de wrapper niet meer voor verschillende xsl's kan gebruiken. En dat is nou net de bedoeling.

LinkedIn - Collega worden?


  • Sendy
  • Registratie: September 2001
  • Niet online
De wrapper is toch alleen de html formaliteiten (html-element, title-element, CSS)? Als je dat op je root element toepast en in de template een eenvoudige <apply-templates> op te nemen. Voor je verschillende data-elementen (zoals data/posts/post in je voorbeeld) maak je dan verschillende templates (zoals in mijn voorbeeld.)

Edit: Jouw zogenaamde wrapper is geen "wrapper", maar het is de basis van je webpagina. Het enige verschil is hoe de "data" uitgevoerd wordt. Maar beschrijf eens hoe je de structuur van je xslts voorsteld?

[ Voor 24% gewijzigd door Sendy op 02-01-2007 10:39 ]


  • Evilbee
  • Registratie: November 2002
  • Laatst online: 13:27
Nou de bedoeling is dat iedere pagina zijn eigen xml en xsl heeft. Maar aangezien iedere pagina dezelfde header en menu heeft, wil ik dit in een apart xsl bestand zetten. Dat zie je ook staan in mijn eerste post.

Of bedoel je dat ik op iedere pagina dezelfde template laat zien en dan een rijtje apply-template's laat zien?

offtopic:
Ik heb het nu op een ranzige php manier opgelost door boven iedere pagina [[INCLUDE_HEADER]] te replacen.

LinkedIn - Collega worden?