[xsl] probleem met templates

Pagina: 1
Acties:

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Ik ben bezig met een op XML-gebaseerde forum uitbreiding (hier een voorbeeld van een xml-topiclijst). Nu moet een topic zelf natuurlijk ook te bekijken zijn met XML. De view.php genereerd de volgende XML:

HTML:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version='1.0' ?><?xml-stylesheet type="text/xsl" href="view.xsl"?><viewtopic>
    <topic>
        <title>Belangrijk: DE EXIT KNOP</title>
        <id>61</id>
        <forumid>1</forumid>
        <forumname>Geemz Forum</forumname>
        <posts>2</posts>

        <status>-1</status>
    
                <pages>0.08</pages>
        <limit>25</limit>
    </topic>
    
    
    <message>
        <id>159</id>
        <online>

            Offline     </online>
        
        <postername>ToMmY</postername>
        <posterid>1</posterid>
        <subtitle>BOFH</subtitle>
        <text> 
                                    geblaat met HTML ertussen
                    </text>
        
        <time>17 September 2002 21:41:7</time>
    </message>

    
    <message>

        <id>180</id>
        <online>
            Offline     </online>
        
        <postername>ToMmY</postername>
        <posterid>1</posterid>
        <subtitle>BOFH</subtitle>

        <text>
            [img]"smiles/hamer.gif"[/img]       </text>
        
        <time>19 September 2002 14:18:15</time>
    </message>

</viewtopic>


Binnen <message> en </message> kunnen dus andere HTML-tags voorkomen. Het probleem is dat deze XML-XSL-combinatie het totaal niet doet in Mozilla. Verder krijg ik het niet voor elkaar om tekst die bold is gemaakt (en dus met <b> en </b> in <text> en </text> staat) ook werkelijk er bold te laten uitzien. Ik kan in m'n view.xsl wel een template maken dat op "b" matcht, maar dan verdwijnt de andere tekst die niet tussen een tag staat. De xsl ziet er nu zo uit:

HTML:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?xml version='1.0'  encoding="UTF-8" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <!-- <xsl:output method="html" indent="yes" encoding="UTF-8"/> -->
    <!-- <xsl:variable name="path-prefix">http://localhost/</xsl:variable> -->
    
    <xsl:template match="/">
        <html >
            <head>
                <title><xsl:value-of select="/viewtopic/topic/title"/></title>
                <link rel="stylesheet" type="text/css" href="../include/default.css" />
            </head>
            
            <body>  
                <center>
                    <table class="MainTable" align="center" cellpadding="0" cellspacing="0">
                        <style>
                        A.HeaderLink {
                            color:#000000;
                            font-weight:bold;
                            text-decoration:none;
                            width:75px;
                            text-align:center;
                        }
                        
                        A.HeaderLink:Hover{
                            color:#000000;
                        }
                    </style>
            
                    <tr>
                        <td class="TopHeader" colspan="2"></td>
                    </tr>
                    
                    <tr>
                        <td class="BottomHeader" colspan="2">
                            <a class="HeaderLink" href="../../index.php">Home</a>
                            <a class="HeaderLink" href="../../my.php">My.Geemz</a>
                            <!-- if  not logged in -->
                            <a class="HeaderLink" href="../login.php">Login</a>
                            <a class="HeaderLink" href="../register.php">Registreren</a>
                            <!-- else --> <!-- 
                            <a class="HeaderLink" href="logout.php" style="width:150px;">Ingelogd als <?php echo $session_user ?></a>
                            -->
                            <a class="HeaderLink" href="index.php">Community</a>
                            <a class="HeaderLink" href="../../reviews.php">Reviews</a>
                            <a class="HeaderLink" href="../../games.php">Games</a>
                            <a class="HeaderLink" href="../../all_news.php">Nieuws</a>
                        </td>
                    </tr>
                    <tr>
                        <td class="TopTab">
                           [img]"../images/pijltje.gif"/>
                        [/img]Index</a> 
                           
                           <a>
                            <xsl:attribute name="href">
                                topics.php?id=<xsl:value-of select="/viewtopic/topic/forumid"/>
                            </xsl:attribute>
                            <xsl:value-of select="/viewtopic/topic/forumname"/></a>  
                           <xsl:value-of select="/viewtopic/topic/title"/>
                        </td>
                        <td class="TopArea">
                            <!-- if logged in -->
                                <a href="logout.php">[img]'../images/logout.gif'[/img]</a>
                            <!-- else --> <!-- 
                                <a href="register.php">[img]'../images/register.gif'[/img]'/></a>       <a href="login.php">[img]'../images/login.gif'[/img]'/></a>                 
                            -->

                            <a href="../mod_listusers.php" alt="Gebruikerslijst">[img]"../images/profile.gif"[/img]</a>
                            
                             <a href="../search.php">[img]'../images/search.gif'[/img]</a>
                           <a href="../faq.php">[img]'../images/faq.gif'[/img]</a>
                            <a href="../index.php">[img]'../images/home.gif'[/img]</a>
                        </td>
                    </tr>
                    
                    
                    <tr>
                        <td class="MainArea" colspan="2">
                            <table width="780">
                                <xsl:apply-templates />
                            </table>
                        </td>
                    </tr>
                    
                    
                </table>
            </center>
        </body>
    </html>
    </xsl:template>
    
    <xsl:template match="topic">
        <th>Titel</th>
        <th colspan="2">Poster</th>
    </xsl:template>
    
    <xsl:template match="/viewtopic">
        <xsl:apply-templates />
    </xsl:template>
    
    <xsl:template match="message">
        <tr>
            <td class="GrayLeft" style="width:100px;vertical-align:top;text-align:left;font-weight:normal;padding-left:3px;border-bottom:solid 1px #CCCCCC;" rowspan="2">
                <b> <xsl:value-of select="postername"/> </b><br/>
                <xsl:value-of select="subtitle"/>
            </td>
            <td style="border-bottom:solid 1px #CCCCCC;border-left:solid 1px #CCCCCC;color:#CCCCCC;">
                Door <xsl:value-of select="postername"/> <xsl:value-of select="time"/>
            </td>
            <td align="right" style="border-bottom:solid 1px #CCCCCC;color:#CCCCCC;">
            <a>
                <xsl:attribute name="href">
                    ../newreply.php?quote=<xsl:value-of select="id"/>&amp;topic=<xsl:value-of select="/viewtopic/topic/id"/>
                </xsl:attribute>
                [img]'../images/down.gif'[/img]</a>
            

        
            <a href="../profile.php?id=">[img]'../images/profile.gif'[/img]</a>
            <a href="../edit.php?mid=">[img]'../images/write_message.gif'[/img]</a>
            <a href="mod_remove_post.php?id=">[img]"../images/delete.gif"[/img]</a>
            <a href="notes.php?id=">[img]'../images/notes.gif'[/img]</a>
            
            <?php
            }
            ?>
            </td>
        </tr>
        
        <tr>
            <td class="GrayLeft"  style="height:200px;vertical-align:top;border-bottom:solid 1px #CCCCCC;font-weight:normal;width:620px;text-align:left;" colspan="2">
                <xsl:apply-templates />
            </td>
        </tr>
    </xsl:template>
    
    <xsl:template match="text">
        <xsl:value-of />
    </xsl:template>
    
    <xsl:template match="br">
        <br/>
    </xsl:template>
    
    <xsl:template match="img">
        <img>
            <xsl:attribute name="src">
                <xsl:value-of select="src"/>
            </xsl:attribute>
        </img>
    </xsl:template>
</xsl:stylesheet>


Wie kan mij vertellen hoe ik de HTML tussen <text> en </text> ook daadwerkelijk als HTML in de output krijg en hoe ik dit in Mozzila aan de praat krijg?

[ Voor 0% gewijzigd door MisterData op 06-10-2002 11:48 . Reden: layout wordt vernaggelt :( ]


Verwijderd

Gebruik "disable-output-escaping" in je template text
zou er ongeveer zo uit moeten komen te zien:

<xsl:template match="text">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

Ik weet niet uit het nou juist aan of uit moet zijn, maar dat moet je maar ff proberen.
Je schrijft trouwens wel old-style XSL. Dingen als <xsl:value-of /> kunnen niet meer, moet <xsl:value-of select="." /> worden.
En let erop dat de HTML die in je Text-node komt te staan altijd valid moet zijn, als hier HTML van gebruikers in komt te staan is de kans groot dat ie over zun nek zal gaan. Ik zou je aanraden om er CD-Data/comment tags om heen te zetten zodat de parser niet over z'n nek gaat. Je kan CDdata met value-of select terug krijgen, en als je comment-tags gebruikt kan je <xsl:value-of select="comment(.)" />.
Suc6!

Ohjah! XSL(t) schopt kont! >:)

Ik heb overigens weinig tot geen ervaring met Client-side parsen van XML, maar ik neem aan dat de XSL gelijk zal zijn met de XSL voor server-side parsen.

Verwijderd

Verwijderd schreef op 06 oktober 2002 @ 14:32:
Ik heb overigens weinig tot geen ervaring met Client-side parsen van XML, maar ik neem aan dat de XSL gelijk zal zijn met de XSL voor server-side parsen.
Dat is dan weer het leuke van een standaard he ;)

Als elke browser het zou ondersteunen volgens de standaard, iets dat niet echt het geval is

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Verwijderd schreef op 06 oktober 2002 @ 14:32:
Gebruik "disable-output-escaping" in je template text
zou er ongeveer zo uit moeten komen te zien:

<xsl:template match="text">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
Ik ga het proberen :)
Ik weet niet uit het nou juist aan of uit moet zijn, maar dat moet je maar ff proberen.
Je schrijft trouwens wel old-style XSL. Dingen als <xsl:value-of /> kunnen niet meer, moet <xsl:value-of select="." /> worden.
Dat is meer een kwestie van luiheid aan mijn kant >:) Definitieve versie heeft natuurljik wel de laatste standaarden :)
En let erop dat de HTML die in je Text-node komt te staan altijd valid moet zijn, als hier HTML van gebruikers in komt te staan is de kans groot dat ie over zun nek zal gaan. Ik zou je aanraden om er CD-Data/comment tags om heen te zetten zodat de parser niet over z'n nek gaat. Je kan CDdata met value-of select terug krijgen, en als je comment-tags gebruikt kan je <xsl:value-of select="comment(.)" />.
Ik gebruik een stacked-parser, en dat betekent dat niet afgesloten tags (meestal) worden afgesloten. In een later stadium ga ik over van BBCode naar m'n eigen XPosting, en dat is ook een soort BBCode, alleen dan de XML versie. Mijn script moet dan controleren of er valide XML is getypt :)
Suc6!
danku :*
Ohjah! XSL(t) schopt kont! >:)
* MisterData agrees!
Ik heb overigens weinig tot geen ervaring met Client-side parsen van XML, maar ik neem aan dat de XSL gelijk zal zijn met de XSL voor server-side parsen.
Met de enige voorwaarde dat de client zich wel aan de standaarden moet houden 8)

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Verwijderd schreef op 06 oktober 2002 @ 14:38:
[...]

Dat is dan weer het leuke van een standaard he ;)

Als elke browser het zou ondersteunen volgens de standaard, iets dat niet echt het geval is
Daarom is er in dit geval ook zo'n verschil tussen Mozilla en IE :(