[XML] XSLT als UBB-code parser

Pagina: 1
Acties:

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Hier zijn al meerdere topics over geweest, maar ik kom er toch niet uit.

Ik ben bezig met een site te maken waarbij ik XML en XSLT gebruik. Het is de bedoeling dat er UBB-like code bij in de database kan om tekst op te maken. vb [ B ]Tekst in bold[ /B ]. Dit wordt dan omgezet naar <bold>Tekst in bold</bold>. Dus de XML ziet er ongeveer zo uit:
code:
1
2
3
4
<root>
  .....
  <content>Hier een tekst <bold>Tekst in bold</bold> Nog een zin...</content>
</root>

Nu wil ik met behulp van een XSLT template dit omzetten naar:

Hier een tekst Tekst in bold Nog een zin...

En nu komt het probleem: ik geraak niet verder dan dit:

Tekst in boldHier een tekst Tekst in bold Nog een zin...

Mijn XSLT:
code:
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
<?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="root">
    <html>
      <head>
        [ ..... ]
      </head>
      
      <body>
        <div id="container">
          [ ..... ]
          <div id="body">
            <table>
              <tr><td><xsl:apply-templates select="Content"/> </td></tr>
            </table>
          </div>
        </div>
      </body>
    </html>
  </xsl:template>

<xsl:template match="Content">
  <xsl:apply-templates select="bold"/> 
  <xsl:value-of select="."/>
</xsl:template>

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

</xsl:stylesheet>


Mijn probleem is dus dat ik er niet in slaag om de vette tekst tussen mijn andere tekst te houden. Is het mogelijk om dit op te lossen met behulp van een template match? of wil ik nu iets dat niet kan?

Ik zou het toch op deze manier willen klaarkrijgen omdat ik van mening ben dat in mijn XML geen html tags moeten staan, maar dat dit thuis hoort in de XSLT.

Verwijderd

Kun je niet ipv:
code:
1
2
3
4
5
6
7
8
<xsl:template match="Content">
  <xsl:apply-templates select="bold"/> 
  <xsl:value-of select="."/>
</xsl:template>

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

dit gebruiken?
code:
1
2
3
4
5
6
7
<xsl:template match="Content">
  <xsl:apply-templates/> 
</xsl:template>

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

Ik zou zeggen dat het dan gewoon goed moet gaan. Maar het is al even geleden dat ik iets met XSLT gedaan heb.

[ Voor 29% gewijzigd door Verwijderd op 30-05-2004 16:51 ]


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
ik heb een tijdje geleden ook zoiets gebruikt... heb toen een PostingML template gebruikt:

code:
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
    <!-- PostingML -->
    <xsl:template match="emotion">
        <xsl:call-template name="displayEmotion">
            <xsl:with-param name="ref" select="@ref"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="smile|devil|confused|wink|frown|fuckyou|worship|barf|jammie|beer">
        <xsl:call-template name="displayEmotion">
            <xsl:with-param name="ref" select="name(.)"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="displayEmotion">
        <xsl:param name="ref"/>
        [img]"{$path}img/smillies/{$ref}.gif"[/img]
    </xsl:template>

    <xsl:template match="codeblock">

        <blockquote>
            <small>code:</small>
            <hr/>
                <pre><code><xsl:apply-templates/></code></pre>
            <hr/>
        </blockquote>

    </xsl:template>

    <xsl:template match="br">
        <br/>
    </xsl:template>

    <xsl:template match="b|i|u|p|code">
        <xsl:element name="{name(.)}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="quote">
        <blockquote>
            <small>
                <xsl:text>quote</xsl:text>
                <xsl:if test="count(@date) = 1">
                    <xsl:text> (</xsl:text>
                    <xsl:value-of select="@date"/>
                    <xsl:if test="count(@time) = 1">
                        <xsl:text>, </xsl:text>
                        <xsl:value-of select="@time"/>
                    </xsl:if>
                    <xsl:text>)</xsl:text>
                </xsl:if>
                <xsl:text>:</xsl:text>
            </small>
            <hr/>
                <xsl:if test="count(@person) = 1">
                    <xsl:choose>
                        <xsl:when test="count(@url) = 1">
                            <a href="{@url}">
                                <xsl:value-of select="@person"/>
                            </a>:
                        </xsl:when>
                        <xsl:otherwise>
                            <b>
                                <xsl:value-of select="@person"/>:
                            </b>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:if>

                <xsl:apply-templates/>
            <hr/>
        </blockquote>
    </xsl:template>

    <xsl:template match="image">
        [img]"{@url}"/>
    </xsl:template>
    
    <xsl:template[/img]
        <a href="mailto:{@address}">
            <xsl:choose>
                <xsl:when test="count(@person) = 1">
                    <xsl:value-of select="@person"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="@address"/>
                </xsl:otherwise>
            </xsl:choose>
        </a>
    </xsl:template>

    <xsl:template match="link">
        <a href="{@url}">
            <xsl:choose>
                <xsl:when test="string-length(.) = 0">
                    <xsl:value-of select="@url"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </a>
    </xsl:template>

    <!-- End PostingML -->

Verwijderd

Ja, ik probeerde die PostingML template van Martin nog te vinden, maar die blijkt compleet van de internet aardbodem verdwenen.

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Verwijderd schreef op 30 mei 2004 @ 16:50:
Kun je niet ipv:
[ ... ]
dit gebruiken?
[ ... ]
Ik zou zeggen dat het dan gewoon goed moet gaan. Maar het is al even geleden dat ik iets met XSLT gedaan heb.
_/-\o_ _/-\o_ _/-\o_

XSLT is leuk, maar ik heb nog wat te leren :)


@ CK

Dit ga ik zeker eens goed bekijken! Ik had dit al gevonden via de search, maar de website van PostingML bestaat niet meer, en via google kon ik hier ook niets meer over vinden.

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Dit werk fantastisch maar ik kan geen 2 opmaaktags door elkaar gebruiken?
<a href="link">[img]"source"[/img]</a> lukt dus niet

ik heb nu dit als XSL:
code:
1
2
3
4
5
<xsl:template match="Content">
  <xsl:apply-templates/> 
</xsl:template>
<xsl:template match="img">[img]"{@src}"/></xsl:template>
<xsl:template[/img]<a href="{@href}"><xsl:value-of select="."/></a></xsl:template>


ik kom er weer maar niet uit :'(

Verwijderd

Ipv <xsl:value-of .../> moet je dan weer <xsl:apply-templates /> gebruiken :)

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
En zo leer ik weer constant bij >:) Het is een mooi taaltje maar niet echt simpel in het begin. Bedankt allemaal :)
Pagina: 1