[XML/XSLT] gebruik van XHTML in XML element

Pagina: 1
Acties:

  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
Ik ben bezig xml en xslt transformaties in php met sablotron.
M.b.v. PHP haal ik de data uit een database en vervolgens bouw ik hier de XML file van. Ik wil echter dat deze data soms ook XHTML kan zijn.
Dan wil ik de volgende output (dus na transformatie):
* gewenste output:
code:
1
2
3
 blablabla bla bla<BR />
 blabla <BR />
 ........


Ik krijg het echter niet goed voor elkaar: bij gewoon wegschrijven is raken alle XHTML tags verloren na transformatie (op zich logisch). Dan zien DTD, XML en XSLT er als volgt uit:

* gewoon wegschrijven
DTD:
code:
1
<!ELEMENT omschrijving ANY>


XML:
code:
1
2
3
<omschrijving>
 blablabla bla bla <BR /> blabla <BR />........
</omschrijving>


XSLT:
code:
1
<xsl:value-of select="omschrijving" disable-output-escaping='yes' />


Output:
code:
1
2
3
 blablabla bla bla
 blabla 
 ........


en aangezien de browser newlines negeert is dit niet wat ik wil.
Dus heb ik vervolgens met htmlentities($xml_content) geprobeerd dit aan te passen.

* wegschrijven na htmlentities()
XML:
code:
1
2
3
<omschrijving>
 blablabla bla bla &lt;br /&gt; blabla &lt;br /&gt;........
</omschrijving>


Echter, hier valt sablotron over bij het parsen.
code:
1
XSLT processing error: XML parser error 11: undefined entity


Hoe kan ik makkelijk ervoor zorgen dat XHTML kan worden gebruikt binnen een XML tag. Ik vermoed dat het volledig definiëren van alle XHTML elementen wel zou werken, maar ik kan me niet voorstellen dat er geen makkelijker manier is.

[ Voor 26% gewijzigd door vargo op 08-12-2003 13:51 ]


Verwijderd

ben er sinds kort ook een beetje mee bezig op school, weet er nog niet zoveel van, maar: let op cASE sENSITIVITY!

-> <br />

[ Voor 7% gewijzigd door Verwijderd op 08-12-2003 13:52 ]


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
<![CDATA[ element data, ook html ]]>

  • pimlie
  • Registratie: November 2000
  • Laatst online: 26-05 18:55
cdata tags er omheen zetten? Dan kan je ook html gebruiken..

code:
1
2
3
4
5
<omschrijving>
<![CDATA[
   blablabla bla bla <BR /> blabla <BR />........
]]>
</omschrijving>

  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

Waarom wil je XHTML in je XML? Zeker <br /> heeft geen databeschrijvende functie.

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
Rickets schreef op 08 december 2003 @ 13:57:
Waarom wil je XHTML in je XML? Zeker <br /> heeft geen databeschrijvende functie.
De output moet in een browser worden bekeken en ik zou niet weten hoe ik line breaks anders moet weergeven.

  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

vargo schreef op 08 december 2003 @ 14:03:
De output moet in een browser worden bekeken en ik zou niet weten hoe ik line breaks anders moet weergeven.
De line-breaks regel je met CSS die je toepast op de met XSLT gegenereerde XHTML. De <br /> hoort imo thuis in XML noch XHTML.

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
pimlie schreef op 08 december 2003 @ 13:56:
cdata tags er omheen zetten? Dan kan je ook html gebruiken..

code:
1
2
3
4
5
<omschrijving>
<![CDATA[
   blablabla bla bla <BR /> blabla <BR />........
]]>
</omschrijving>
edit nu zie ik het pas:

Hmmmm ik heb dit geprobeerd en sablotron vertaald dit naar
code:
1
&lt;br /&gt;
waarbij dus in de browser de <br /> tags zichtbaar zijn :?

[ Voor 14% gewijzigd door vargo op 08-12-2003 14:32 ]


  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
Rickets schreef op 08 december 2003 @ 14:10:
[...]

De line-breaks regel je met CSS die je toepast op de met XSLT gegenereerde XHTML. De <br /> hoort imo thuis in XML noch XHTML.
Eigenlijk vind ik dit een discussie over de opmaak van de output. Nog even afgezien of dat het punt dat je aansnijdt juist danwel praktisch is of niet (beschrijven in de CSS zou mijn inziens iig ook beter zijn), ik vind dat de processor de transformatie gewoon moet slikken.

  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
vargo schreef op 08 december 2003 @ 14:18:
[...]

edit nu zie ik het pas:

Hmmmm ik heb dit geprobeerd en sablotron vertaald dit naar
code:
1
&lt;br /&gt;
waarbij dus in de browser de <br /> tags zichtbaar zijn :?
Heel vreemd - Sablotron zou er toch gewoon vanaf moeten blijven?
Ik heb al geprobeerd
PHP:
1
xslt_set_encoding($xh,"ISO-8859-15");
weg te halen, maar dat werkt dus ook niet.

Is dit een bug van Sablotron?

[ Voor 7% gewijzigd door vargo op 08-12-2003 14:50 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

tsja, als je wilt dat in je output-boom je br elementen ook moeten komen te staan, zul je die dus in de transformatie op moeten nemen.

input
code:
1
<omschrijving> blabla bla bla <br /> blablabla <br /></omschrijving>


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

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

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Volgens mij is het een combinatie van CDATA en output escaping:

<node>
<![CDATA[ blaa blaat <BR> blaat blaat ]]>
</node>

in je xsl:

<xsl:value-of select="node" disable-output-escaping="true"/>

Het werkt bij mij prima iig..

[ Voor 23% gewijzigd door dominic op 08-12-2003 15:00 ]

Download my music on SoundCloud


  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
dominic schreef op 08 december 2003 @ 14:59:
Volgens mij is het een combinatie van CDATA en output escaping:

<node>
<![CDATA[ blaa blaat <BR> blaat blaat ]]>
</node>

in je xsl:

<xsl:value-of select="node" disable-output-escaping="true"/>

Het werkt bij mij prima iig..
Mijn dank is groot! Het werkt!
Het moest overigens wel zijn:
<xsl:value-of select="node" disable-output-escaping="yes"/>

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik vind het een beetje lelijk om xhtml tags (<br />'s) dwars door de textnode van je eigen <omschrijving> xml element heen te gooien. dat maakt het gebruik van <xsl:copy-of /> , imho dé manier om dit fraai te doen zonder CDATA rommel enzo, erg een beetje lastig, zoniet onmogelijk. veel netter is om xhtml-eilandjes te vangen in een <span>, <p> of <div> , en die, inclusief hun xhtml inhoud, te kopieren. Wat daar weer lelijk aan is, is dat je nog meer opmaak-achtig informatie in je xml stopt. Maarja, de reden dat dit uberhaupt nodig is, wordt al veroorzaakt door je <br />'s, die natuurlijk ook weinig met je inhoud van doen hebben.

dus...(ff zitten pielen :)) ...het kan WEL omslachtig:

code:
1
2
3
4
5
    <xsl:template match="/">
        <body>
            <xsl:copy-of select="omschrijving/child::text()|omschrijving/child::*" />
        </body>
    </xsl:template>


of iets fraaier:

code:
1
2
3
4
5
    <xsl:template match="omschrijving">
        <p>
            <xsl:copy-of select="child::text()|child::*" />
        </p>
    </xsl:template>

[ Voor 41% gewijzigd door Genoil op 08-12-2003 16:22 ]


  • vargo
  • Registratie: Januari 2001
  • Laatst online: 22-05 10:15
Genoil schreef op 08 december 2003 @ 16:03:
ik vind het een beetje lelijk om xhtml tags (<br />'s) dwars door de textnode van je eigen <omschrijving> xml element heen te gooien. dat maakt het gebruik van <xsl:copy-of /> , imho dé manier om dit fraai te doen zonder CDATA rommel enzo, erg een beetje lastig, zoniet onmogelijk. veel netter is om xhtml-eilandjes te vangen in een <span>, <p> of <div> , en die, inclusief hun xhtml inhoud, te kopieren. Wat daar weer lelijk aan is, is dat je nog meer opmaak-achtig informatie in je xml stopt. Maarja, de reden dat dit uberhaupt nodig is, wordt al veroorzaakt door je <br />'s, die natuurlijk ook weinig met je inhoud van doen hebben.

dus...(ff zitten pielen :)) ...het kan WEL omslachtig:

code:
1
2
3
4
5
    <xsl:template match="/">
        <body>
            <xsl:copy-of select="omschrijving/child::text()|omschrijving/child::*" />
        </body>
    </xsl:template>


of iets fraaier:

code:
1
2
3
4
5
    <xsl:template match="omschrijving">
        <p>
            <xsl:copy-of select="child::text()|child::*" />
        </p>
    </xsl:template>
Muchos Gracias - ik ga hier zeker nog naar kijken... Wellicht kom ik er later ook nog op terug!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Als je nou een aparte template maakt die match op br kan je die gewoon een copy-of select="." laten doen, dat maakt het nog veel makkelijker. De XSL-sheets die ik gebruik hebben allemaal een default template die alle niet gedefinieerde tags gewoon kopieren naar de output tree.


code:
1
2
3
4
5
6
7
<xsl:template match="text()">
    <xsl:value-of select="." />
</xsl:template>

<xsl:template match="*">
    <xsl:copy-of select="." />
</xsl:template>

Rustacean

Pagina: 1