[xsl] templates snap ik niet

Pagina: 1
Acties:

  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Ik heb een probleem met het opmaken van een XML bestand met XSL.

Deze twee bestanden zouden samen een heel simpel artikel moeten weergeven.

Het probleem zit hem in de alinea's deze zijn in het XML bestand als <p> gedifineerd. Bij alinea's is het de bedoeling dat er een witregel tussen zit. De inhoud van deze <p> tags moet dus met XSL tussen <p> tags in HTML worden gezet.

Ik heb het eerst met een geneste xsl:for-each geprobeerd, maar dat werkte niet. Na wat zoeken vond ik deze uitleg over templates. daar staat precies wat ik wil, maar als ik het doe op een manier als deze (ik heb alle andere varianten ook al geprobeerd) dan werk het niet.
PHP:
1
2
3
<xsl:template match="article/content/chapter/body/p">
<p><xsl:apply-templates/></p>
</xsl:template>


De fout is dan dat xsl:template niet op die plaats mag staan. waarschijnlijk omdat er al eentje geopend is? Dus heb ik geprobeer dom deze eerst te sluiten, maar dan krijg ik weer een fout dat <body> niet afgesloten is (logisch).

XML file:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="iso-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="article3.xsl" ?>
<article>
    <info>
        <title>titel</title>
    </info>
    
    <content>
        <chapter>
            <title>subtitel</title>
            <body>
                <p>Eerst alinea hoofdstuk 1</p>
                <p>Tweede alinea hoofdstuk 2</p>
                <p>Derde alinea hoofdstuk 3</p>
            </body>
        </chapter>

    </content>
</article>


XSL file:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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>
<head>
<title>Artikel</title>
</head>
<body>
   
<h1><xsl:value-of select="article/info/title" /></h1>

<xsl:for-each select="article/content/chapter">
          
    <h2>
         <xsl:attribute name="id">
              <xsl:value-of select="generate-id()" />
        </xsl:attribute>
        <xsl:value-of select="title" />
    </h2>

    <p><xsl:value-of select="body" /></p>
    
</xsl:for-each>

</body>
</html>

</xsl:template>
</xsl:stylesheet>


Samenvatting probleem: Alinea's moeten tussen <p> tags worden gezet en op verschillende regels komen te staan.

Online voorbeeld van hoe het nu is en niet moet

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

hmz, lijkt me heel rechtoe recht aan:

code:
1
2
3
4
5
6
7
<xsl:tempate match="body">
  <xsl:apply-templates select="p" />
</xsl:template>

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


paktie vanzelf alle p's

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Clay schreef op 18 november 2003 @ 21:12:
hmz, lijkt me heel rechtoe recht aan:

code:
1
2
3
4
5
6
7
<xsl:tempate match="body">
  <xsl:apply-templates select="p" />
</xsl:template>

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


paktie vanzelf alle p's
Waar moet ik dat dan neerzetten?

Als ik het onder de <h2> doe dan krijg ik een error. Als ik aan de bovenkant <xsl:template match="/"> verander naar <xsl:template match="body"> worden er alinea's gemaakt, maar doen de koppen het niet meer.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

kijk b.v. op w3schools vanaf de apply-templates. Daar staat het uitgelegd.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Clay schreef op 18 november 2003 @ 21:12:
hmz, lijkt me heel rechtoe recht aan:

code:
1
2
3
4
5
6
7
<xsl:template match="body">
  <xsl:apply-templates select="p" />
</xsl:template>

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


paktie vanzelf alle p's
Nou ben ik geen XSL guru maar hij is geleerd dat het zo moet
code:
1
2
3
4
5
6
7
<xsl:template match="body">
  <xsl:apply-templates select="p" />
</xsl:template>

<xsl:template match="p">
  <p><xsl:value-of select="." /></p>
</xsl:template>


Of is dit precies hetzelfde :?

edit:
nou je het zegt ja, helemaal overheen gelezin, maar is nu fix0rd

[ Voor 24% gewijzigd door PrisonerOfPain op 18-11-2003 21:43 ]


Verwijderd

volgens mij kun je in je xml file de body het beste in een cdata gooien, dan parst ie em niet en krijg je hem wel goed te zien...

vervang wel ff de <p></p> in je xsl door een <span></span>

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

mja :P ik zie idd ook nog een tempate zonder l, maar ik het is voor het idee he ;) heb het ook maar ff snel uit mn mouw geschud.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Clay, ik begrijp niets van wat je zegt :)

xsl:template moet blijkbaar helemaal onderaan de pagina. Het werkt nu al bijna goed. Maar nu komen de tussenkoppen (<h2>) ook nog een keer als alinea te staan :(

zoals je hier kunt zien

Ik heb nu inmiddels deze code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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>
<head>
<title>Artikel</title>
</head>
<body>
   
<h1><xsl:value-of select="article/info/title" /></h1>

<xsl:for-each select="article/content/chapter">
          
    <h2>
         <xsl:attribute name="id">
              <xsl:value-of select="generate-id()" />
        </xsl:attribute>
        <xsl:value-of select="title" />
    </h2>

    <xsl:apply-templates/> 
    
</xsl:for-each>

</body>
</html>

</xsl:template>

<xsl:template match="p">
  <p><xsl:value-of select="." /></p>
</xsl:template>

</xsl:stylesheet>

[ Voor 21% gewijzigd door Johnny op 18-11-2003 22:11 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

ik bedoel dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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="html" indent="yes"/>

    <xsl:template match="article">
        <h1><xsl:value-of select="info/title" /></h1>
        <xsl:apply-templates select="content/chapter" />
    </xsl:template>

    <xsl:template match="chapter">
        <h2><xsl:value-of select="title" /></h2>
        <xsl:apply-templates select="body/p" />
    </xsl:template>

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


Dan heb je helemaal geen for each nodig.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Bedankt Clay, het werkt _/-\o_

Ik ben nu albijna klaarmet mijn XSL stylesheet, het enige wat nog moet gebeuren is het ondersteunen van HTML code in de tekst.

Maar daar loop ik weer tegen problemen aan. alle < > & " vervangen door < > & " werk niet. Ik heb al wat gespeeld met <![CDATA[ ]]!> en <xsl:text disable-output-encoding="yes">, maar het lukt nog steeds niet.

Gedeelte van XML file:
PHP:
1
2
3
4
5
6
7
8
9
        <chapter type="introduction">
            <title>Inleiding</title>
            
            <body>
                <p>Eerst alinea hoofdstuk 1 <a href="">Dit is een hyperlink</a> </p>
                <p>Tweede alinea hoofdstuk 1 &lt;a href=&quot;&quot;&gt;Dit is een hyperlink&lt;/a&gt;</p>
                <p>Derde alinea hoofdstuk 1</p>
            </body>
        </chapter>


Online XML
Online XSL

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Verwijderd

<![CDATA[ ]]!> en <xsl:text disable-output-encoding="yes">,
Als je dit gebruikt hun je gewoon html code tussen de cdata zetten, gebruik ik ook op mijn eigen site. Door de CDATA wordt het niet geparsed en hoef je dus ook nix te vervangen :)

  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Verwijderd schreef op 19 november 2003 @ 16:53:
[...]


Als je dit gebruikt hun je gewoon html code tussen de cdata zetten, gebruik ik ook op mijn eigen site. Door de CDATA wordt het niet geparsed en hoef je dus ook nix te vervangen :)
Je moet ze dus allebei gebruiken 8)7

Als ik alleen die CDATA er in zet veranderd er niets.

PHP:
1
<![CDATA[<a href="">Dit is een hyperlink</a>]]>


En die ander geeft ook alleen maar fouten.
code:
1
Attribute 'disable-output-encoding' is invalid on 'xsl:apply-templates'.

In welke tag moet hij dan?

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

in xsl:text.

wat je trouwens ook kan doen is een stukje recursief xsl schrijven dat html als xml beschouwt, en niets anders doet dan die html en de attributen weer opbouwen. 't is niet supermakkelijk, maar ook weer niet overdreven moeilijk.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Johnny
  • Registratie: December 2001
  • Laatst online: 11:56

Johnny

ondergewaardeerde internetguru

Topicstarter
Clay schreef op 19 november 2003 @ 17:25:
in xsl:text.

wat je trouwens ook kan doen is een stukje recursief xsl schrijven dat html als xml beschouwt, en niets anders doet dan die html en de attributen weer opbouwen. 't is niet supermakkelijk, maar ook weer niet overdreven moeilijk.
Waar moet ik die <xsl:text> dat dan neerzetten? Om de CDATA in de XML file? Dan krijg ik een fout. Doe ik het in de XSL file om de <xsl:apply-templates select="content/chapter" />, krijg ik ook een fout.
Attribute 'disable-output-encoding' is invalid on 'xsl:text'.

[ Voor 8% gewijzigd door Johnny op 19-11-2003 17:38 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

ow, hmz. dan was het disable-output-escaping. :/ bah

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
De oorspronkelijke vraag kan ook nog wat eenvoudiger worden opgelost:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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="html" indent="yes"/>

    <xsl:template match="article">
        <h1><xsl:value-of select="info/title" /></h1>
        <xsl:apply-templates select="content/chapter" />
    </xsl:template>

    <xsl:template match="chapter">
        <h2><xsl:value-of select="title" /></h2>
        <xsl:copy-of select="body/p" />
    </xsl:template>
    
</xsl:stylesheet>


en als je dan gewoon netjes xhtml in je p's hebt staan ipv html4 (why o why would you?), dan werkt de bovenstaande sheet nog steeds. bovendien is copy-of natuurlijk retesnel.
Pagina: 1