Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XML/XSL] XHTML in XML+behouden bij transformatie

Pagina: 1
Acties:

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Ik ben bezig met een site die maakt gebruik van XML / XSL.
Nu is het voor de beheerders mogelijk om HTML in te voegen in de NEWS items. Maar hoe plaats ik die nu naar het scherm?

dus: xml-document
code:
1
2
3
4
5
6
<?xml version="1.0" ?>
<ROOT>
 <HTML>
  <b>tekst<i>nogmeertekst</i></b>
 </html>
</ROOT>

xsl-document
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="utf-8" /> 
<xsl:template match="/">
    <xsl:apply-templates select="HTML/descendant::*" mode="print" />
</xsl:template>

<!-- HTML -->
<xsl:template match="*" mode="print">
<xsl:text><</xsl:text>
        <xsl:value-of select="name()" />
<xsl:text>></xsl:text>
      <xsl:value-of select="text()" />
</xsl:template>
</xsl:stylesheet>

Ik had dus zoiets als dit gemaakt maar dat werkt dus niet ... :( En nog een paar andere dingen geprobeerd, maar die zal ik jullie besparen....

Enig idee hoe ik nou deze werkend kan krijgen???

[ Voor 2% gewijzigd door Kees op 22-02-2003 14:55 ]

Programmer - an organism that turns coffee into software.


Verwijderd

zet dit om je template heen
code:
1
2
3
4
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.. hier jouw <xsl:templates/> ...
</xsl:stylesheet>

[ Voor 5% gewijzigd door Kees op 22-02-2003 14:58 ]


Verwijderd

Verder is dit misschien wel interessant:
PostingMl

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zondag 27 januari 2002 23:01 schreef SurfingFromAM2PM het volgende:
Verder is dit misschien wel interessant:
PostingMl
Tja als je ook nog een mooie oplossing [topic=389472] hiervoor weet.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Hmmmm dat postingML ziet er leuk uit..... Maar dan kan je gebruikers een soort UBB code aanbieden?

Dat is niet wat ik wil... Aangezien ik ze de volledige HTML mogelijkheden wil bieden. Voornamelijk tables en form velden....
Op zondag 27 januari 2002 22:57 schreef SurfingFromAM2PM het volgende:
zet dit om je template heen
code:
1
2
3
4
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.. hier jouw <xsl:templates/> ...
</xsl:stylesheet>
Het was een greep uit mijn XSL, maar ze staan er om heen hoor.. :)

Programmer - an organism that turns coffee into software.


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 28-10 08:43
offtopic:
Hoort xml/xsl(t) eigenlijk niet bij de buren :?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op zondag 27 januari 2002 23:10 schreef Limhes het volgende:
offtopic:
Hoort xml/xsl(t) eigenlijk niet bij de buren :?
nee. :)
XML heeft toch niets met de layout te maken?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Limhes: Hoort xml/xsl(t) eigenlijk niet bij de buren :?
Hier is nooit echt een beslissing over genomen, maar XSLT wordt in ieder geval meestal in /14 behandeld. Dat bevalt mij uitstekend, anders moet ik serieus /13 gaan bezoeken ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Je stylesheet is behoorlijk raar.... waar wil je precies naar toe transformeren?

Als je even bij deze input een gewenste output geeft kan ik een voorbeeld maken. :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Op zondag 27 januari 2002 23:21 schreef mbravenboer het volgende:
Je stylesheet is behoorlijk raar.... waar wil je precies naar toe transformeren?

Als je even bij deze input een gewenste output geeft kan ik een voorbeeld maken. :)
Hmm dit is een gedeelte uit me stylesheet, om het verhaaltje beetje klein te houden. Kan wel mijn complete stylesheet gaan plaatsen, maar dat is nogal groot. (140 lines)

Ik wil naar HTML toe... :)

In dit voorbeeld moet hij het volgende weer geven:
tekstnogmeertekst

Maar het probleem is dat ik niet weet wat de HTML is hoe groot, hoeveel

Programmer - an organism that turns coffee into software.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
LuCarD: Maar het probleem is dat ik niet weet wat de HTML is hoe groot, hoeveel
Hum. ik ben al een voorbeeldje aan het maken. Misschien dat het daarmee duidelijk wordt.

Ken je namespaces?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Wat wil je allemaal aan HTML ondersteunen? Alleen eenvoudige opmaak of alles?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Hier alvast een eenvoudig voorbeeld.... Ik heb het vermoeden dat je generiek HTML wilt ondersteunen en dan moet je het wat anders aanpakken. Eigenlijk moet je dan namelijk met namespaces gaan werken.. Dat is wel erg goed mogelijk en vrij gemakkelijk. Geef maar even aan waar je heen wilt :) . Als je uitleg bij de stylesheet wilt moet je het maar zeggen :) .

Input:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" ?>

<news>
    <item>
      <heading>XSLT is fantastisch</heading>

      <description>
        Het is natuurlijk al lang duidelijk, maar
        <b>XSLT is<i>erg cool</i></b>
      </description>
    </item>

    <item>
      <heading>XSLT 2.0 wordt nog beter</heading>

      <description>
        Voor de mensen die al blij waren met ons vorige
        nieuws item: <b>XSLT 2.0 wordt<i>nog beter</i></b>
      </description>
    </item>
</news>

Stylesheet:
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
<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" indent="yes" encoding="utf-8" /> 

    <xsl:template match="news">
      <html>
        <head>
            <title>Nieuws van de dag</title>
        </head>

        <body>
            <h1>Nieuws van de dag</h1>

            <xsl:apply-templates select="item"/>
        </body>
      </html>
    </xsl:template>

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

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

    <xsl:template match="item">
      <h2>
        <xsl:value-of select="heading/text()"/>
      </h2>

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

Output:
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
<html>
    <head>
      <META http-equiv="Content-Type" content="text/html; charset=utf-8">

      <title>Nieuws van de dag</title>
    </head>

    <body>
      <h1>Nieuws van de dag</h1>
      
      <h2>XSLT is fantastisch</h2>

      <p>
        Het is natuurlijk al lang duidelijk, maar
        <b>XSLT is<i>erg cool</i></b>
      
      </p>

      <h2>XSLT 2.0 wordt nog beter</h2>

      <p>
        Voor de mensen die al blij waren met ons vorige
        nieuws item: <b>XSLT 2.0 wordt<i>nog beter</i></b>
      
      </p>
    </body>
</html>

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:56 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Op zondag 27 januari 2002 23:37 schreef mbravenboer het volgende:

[..]

Hum. ik ben al een voorbeeldje aan het maken. Misschien dat het daarmee duidelijk wordt.

Ken je namespaces?
Ik heb er van gehoord... Snap het nog niet als je dat bedoelt.... ;(
Op zondag 27 januari 2002 23:38 schreef mbravenboer het volgende:
Wat wil je allemaal aan HTML ondersteunen? Alleen eenvoudige opmaak of alles?
Mijn idee was om compleet HTML te ondersteunen, behalve APPLET, Javascript en VBScript. De beheerders van de site zijn bekend met HTML. De HTML die zij invoerden recht in de site plakken (zonder transformatie als dat kan).
Op zondag 27 januari 2002 23:43 schreef mbravenboer het volgende:
Hier alvast een eenvoudig voorbeeld.... Ik heb het vermoeden dat je generiek HTML wilt ondersteunen en dan moet je het wat anders aanpakken. Eigenlijk moet je dan namelijk met namespaces gaan werken.. Dat is wel erg goed mogelijk en vrij gemakkelijk. Geef maar even aan waar je heen wilt :) . Als je uitleg bij de stylesheet wilt moet je het maar zeggen :) .
Ik heb al een stylesheet kunnen maken, en die doet al redelijk wat ik wil. Hij is wel een beetje anders. Maar dat moet in principe niks uitmaken voor het eindresultaat. Tot op heden word hij nog steeds goed getransformeerd.

Programmer - an organism that turns coffee into software.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
LuCarD: Ik heb er van gehoord... Snap het nog niet als je dat bedoelt.... ;(
Het idee erachter is niet zo ingewikkeld: om conflicten tussen tagnamen te voorkomen heeft elke standaard een eigen namespace. Je gebruikt ze zelfs al in je stylesheet (xsl: en de xmlns: declaratie).
Mijn idee was om compleet HTML te ondersteunen
Wat je dan heel leuk kunt doen: aangeven dat alle kinderen van een bepaald element in de HTML namespace vallen. Je kunt dan in je stylesheet prachtig op alle elementen van deze namespace de identiteit toepassen. Als je daar nog een voorbeeld van wilt moet je het maar even zeggen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Op maandag 28 januari 2002 00:05 schreef mbravenboer het volgende:

[..]

Het idee erachter is niet zo ingewikkeld: om conflicten tussen tagnamen te voorkomen heeft elke standaard een eigen namespace. Je gebruikt ze zelfs al in je stylesheet (xsl: en de xmlns: declaratie).
[..]
Misschien een gekke vraag maar waar haalt hij de definitie dan vandaan??? Elke keer als zo'n namespace word opgegeven. Of zit deze al in de XML mee gebakken?
Wat je dan heel leuk kunt doen: aangeven dat alle kinderen van een bepaald element in de HTML namespace vallen. Je kunt dan in je stylesheet prachtig op alle elementen van deze namespace de identiteit toepassen. Als je daar nog een voorbeeld van wilt moet je het maar even zeggen.
Gaarne :) :) :)

Programmer - an organism that turns coffee into software.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
LuCarD: Misschien een gekke vraag maar waar haalt hij de definitie dan vandaan??? Elke keer als zo'n namespace word opgegeven. Of zit deze al in de XML mee gebakken?
Hum, ik snap niets van je vraag :+ . Je declareert in je root element hier een aantal namespaces. Je geeft bij de transformatie namespace een prefix "xsl" op. Die gebruik je om aan te geven welke elementen bij xsl horen... Wat was nu precies je vraag :? .
Gaarne :) :) :)
Ben bezig ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Op maandag 28 januari 2002 00:23 schreef mbravenboer het volgende:

[..]

Hum, ik snap niets van je vraag :+ . Je declareert in je root element hier een aantal namespaces. Je geeft bij de transformatie namespace een prefix "xsl" op. Die gebruik je om aan te geven welke elementen bij xsl horen... Wat was nu precies je vraag :? .
[..]
Ermmmm Ik denk de naam "namespaces" niet snap, maar dat ik onbewust het begrip wel toepas :) (Ik ben goed :+ ) Het kan natuurlijk ook zijn dat ik het toevallig goed heb gedaan.

Namespace: LuCarD Style:
- namespace wordt gebruikt om de definities van je xsl uniek te maken om conflicten te voorkomen.
- namespace wordt boven aan het xsl gedefineerd.

ermmm... that is my knowledge.. :(

Programmer - an organism that turns coffee into software.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Het werkt :) . Allereerst de input. Ik heb hierin twee namespaces gedeclareert. De ene is voor XHTML. Dit is de default namespace van de input. De andere is voor nieuws-structuur, die moet je apart opgeven (via n:).

Dit is dan de input (merk op dat in de content nu ook een link staat :) )
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
<?xml version="1.0" ?>

<n:news xmlns:n="http://www.nieuwsvandedag.nl"
        xmlns="http://www.w3.org/1999/xhtml">

    <n:item>
      <n:heading>XSLT is fantastisch</n:heading>

      <n:description>
        Het is natuurlijk al lang duidelijk, maar
        <b>XSLT is<i>erg cool</i></b>. De mensen
        die nog geen kennis hebben van XSLT raden we
        aan een goede <a href="http://www.xfront.com">tutorial</a>
        te raadplegen.
      </n:description>
    </n:item>

    <n:item>
      <n:heading>XSLT 2.0 wordt nog beter</n:heading>

      <n:description>
        Voor de mensen die al blij waren met ons vorige
        nieuws item: <b>XSLT 2.0 wordt<i>nog beter</i></b>
      </n:description>
    </n:item>
</n:news>

De stylesheet wordt nu ook wat anders. Allereerst moet je ervoor zorgen dat XPaths naar de goede namespace wijzen. Dat komt dus neer op overal een n: voor zetten :) .

Daarna moeten we nog een generieke template maken voor HTML content. Die heb ik gewoon gestolen en aangepast, maar hij is vrij eenvoudig als je goed kijkt :) .

Dit wordt nu de stylesheet:
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
<?xml version="1.0"?> 

<xsl:stylesheet   version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:n="http://www.nieuwsvandedag.nl"
           xmlns:html="http://www.w3.org/1999/xhtml"
              xmlns="http://www.w3.org/1999/xhtml">

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="n:news">
      <html>
        <head>
            <title>Nieuws van de dag</title>
        </head>

        <body>
            <h1>Nieuws van de dag</h1>

            <xsl:apply-templates select="n:item"/>
        </body>
      </html>
    </xsl:template>

    <xsl:template match="html:*">
      <xsl:element name="{name(.)}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:for-each select="@*">
            <xsl:attribute name="{name(.)}">
              <xsl:value-of select="."/>
            </xsl:attribute>
        </xsl:for-each>
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>

    <xsl:template match="n:item">
      <h2>
        <xsl:value-of select="n:heading/text()"/>
      </h2>

      <p>
        <xsl:apply-templates select="n:description"/>
      </p>
    </xsl:template>    
</xsl:stylesheet>

Uiteindelijk dan nog even de output om te laten zien dat het werkt:
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
<?xml version="1.0" encoding="UTF-8"?>

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>Nieuws van de dag</title>
    </head>

    <body>
      <h1>Nieuws van de dag</h1>

      <h2>XSLT is fantastisch</h2>

      <p>
        Het is natuurlijk al lang duidelijk, maar
        <b>XSLT is<i>erg cool</i></b>. De mensen
        die nog geen kennis hebben van XSLT raden we
        aan een goede <a href="http://www.xfront.com">tutorial</a>
        te raadplegen.
      </p>

      <h2>XSLT 2.0 wordt nog beter</h2>

      <p>
        Voor de mensen die al blij waren met ons vorige
        nieuws item: <b>XSLT 2.0 wordt<i>nog beter</i></b>
      </p>
    </body>
</html>

Lijkt me netjes ;) .

Merk op dat ik nu geen uitzonderingen voor applets en dergelijke, maar dat kan je er eventueel nog wel inbouwen.

Deze opzet is eigenlijk de meest zuivere: in de input heb je in feite twee standaarden door elkaar: structuur en html. Je moet dan eigenlijk ook aangeven wat waarbij hoort. De stylesheet maakt van dit verschil handig gebruik: html kan nu generiek met een identiteits template worden getransformeerd :) .

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:56 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
LuCarD: ermmm... that is my knowledge.. :(
En dat klopt allemaal :) . Alleen is dit dus een generiek systeem: je kunt het op alle XML documenten toepassen (zoals je ziet in de input hierboven).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Topic titel even iets duidelijker gemaakt.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Ik kwam erachter dat het volgende ook werkt.
Soms best makkelijk, dat je niet iedere keer de namespace hoeft te gebruiken....
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
<?xml version="1.0" ?>

<news xmlns="http://www.nieuwsvandedag.nl">
  <item>
    <heading>XSLT is fantastisch</heading>

    <description>
     <html xmlns="http://www.w3.org/1999/xhtml">
      Het is natuurlijk al lang duidelijk, maar
      <b>XSLT is<i>erg cool</i></b>. De mensen
      die nog geen kennis hebben van XSLT raden we
      aan een goede <a href="http://www.xfront.com">tutorial</a>
      te raadplegen.
    </html>
    </description>
    </item>

    <item>
    <heading>XSLT 2.0 wordt nog beter</heading>

    <description>
    <html xmlns="http://www.w3.org/1999/xhtml">
      Voor de mensen die al blij waren met ons vorige
      nieuws item: <b>XSLT 2.0 wordt<i>nog beter</i></b>
    </html>
    </description>
    </item>
</news>

De style-sheet blijft hetzelfde. Martin, nog bedankt voor de code, ik was er niet zelf uitgekomen :)

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:57 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Doekman: Ik kwam erachter dat het volgende ook werkt.
Ah ja, dat moet ook gewoon goed gaan ja :) . Dat kan overigens in mijn eerste voorbeeld niet omdat ik daar geen html tags om de content had....
Martin, nog bedankt voor de code, ik was er niet zelf uitgekomen :)
Graag gedaan :) . Was wel een leuk voorbeeld van het succesvol mixen van diverse 'standaarden' :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Een geralateerde vraag, wou geen nieuwe topic openen :)

XML-bestand:
code:
1
2
3
4
5
6
7
<blog>
    <entry nr="9772929">
        <author>waseem</author>
        <date>Saturday, February 16, 2002</date>
        <body xmlns="http://www.w3.org/TR/html4/">tra<i>l</i>alala...</body>
    </entry>
</blog>

XSL-bestand:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    <xsl:template match="/">
        
        <html>
            <head>
                <title>aap</title>
            </head>
            <body>
                <xsl:for-each select="blog/entry">
                    <p>entry: <xsl:value-of select="body" /></p>
                </xsl:for-each>
            </body>
        </html>
    
    </xsl:template>
</xsl:stylesheet>

Als ik select op date dan krijg ik wel netjes de uitvoer te zien. Maar als ik select op body dan krijg ik niks achter entry: te zien :'(

Mijn gok is dat het ligt aan de namespace van het body element? Klopt dit zoja, hoe kan ik die dan nogsteeds selecten?

Alvast bedankt

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:56 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
stylee: Een geralateerde vraag, wou geen nieuwe topic openen :)
Heeft er inderdaad veel mee te maken :) .
Als ik select op date dan krijg ik wel netjes de uitvoer te zien. Maar als ik select op body dan krijg ik niks achter entry: te zien :'(
Inderdaad... helaas (?) is het zo dat je gewoon geen waarde ziet als een select mislukt. Dat kan dus vervelende effecten opleveren...

Allereerst is je select niet helemaal correct (afgezien van namespaces).Je body bevat namelijk sub-elementen en niet alleen text. Ik neem aan dat je dit mee wilt nemen, en dan kan je geen gebruik maken van value-of (volgens mij).
The xsl:value-of element is instantiated to create a text node in the result tree. The required select attribute is an expression; this expression is evaluated and the resulting object is converted to a string as if by a call to the string function. The string specifies the string-value of the created text node. If the string is empty, no text node will be created. The created text node will be merged
with any adjacent text nodes.
Gaan we dus bij de string function kijken:
The string function converts an object to a string as follows: A node-set is converted to a string by returning the string-value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned.
Je kunt in dit geval twee dingen doen: (1) een identiteits-template maken voor HTML content en ipv value-of apply-templates gebruiken of (2) kiezen voor copy-of. Merk op dat er dan geen garantie is dat non-html content er niet door komt....

Copy-of:
The xsl:copy-of element can be used to insert a result tree fragment into the result tree, without first converting it to a string as xsl:value-of does (see [7.6.1 Generating Text with xsl:value-of]). The required select attribute contains an expression. When the result of evaluating the expression is a result tree fragment, the complete fragment is copied into the result tree. When the result is a node-set, all the nodes in the set are copied in document order into the result tree; copying an element node copies the attribute nodes, namespace nodes and children of the element node as well as the element node itself;
Mijn gok is dat het ligt aan de namespace van het body element? Klopt dit zoja, hoe kan ik die dan nogsteeds selecten?
Dan nu het probleem waar je op stuitte. Inderdaad, het komt door de namespaces. Je doet daar een select op een 'body' zonder een namespace. De body heeft echter wel een namespace en is dus een ander element. Je moet dus aangeven in welke namespace body zit. Het antwoord daarop staat in de stylesheet hierboven:
code:
1
<xsl:apply-templates select="n:item"/>

Of voor HTML:
code:
1
<xsl:template match="html:*">

Zo moet het lukken denk ik :) .

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:57 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Zie hier het verschil:

Met deze input:
code:
1
2
3
4
5
<?xml version="1.0"?>

<body>
   Hey dit is een test met <i>mixed</i> content.
</body>

en deze transformatie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>
          
    <xsl:template match="/">
      <result>
        <xsl:value-of select="body"/>
      </result>
    </xsl:template>
</xsl:transform>

Krijg je dus dit als resultaat:
code:
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<result>
   Hey dit is een test met mixed content.
</result>

Als je echter deze stylesheet neemt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>
          
    <xsl:template match="/">
      <result>
        <xsl:copy-of select="body"/>
      </result>
    </xsl:template>
</xsl:transform>

Krijg je dit resultaat:
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<result>
   <body>
   Hey dit is een test met <i>mixed</i> content.
   </body>
</result>

Duidelijk? :) .

Ik vind zelf overigens de HTML indentiteits template van hierboven een nettere oplossing dan een copy-of :) .

[ Voor 1% gewijzigd door Kees op 22-02-2003 14:57 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Mbravenboer bedankt voor je uitgebreide en verlichtende uitleg :P

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
stylee: Mbravenboer bedankt voor je uitgebreide en verlichtende uitleg :P
Graag gedaan :P .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

Ik heb zojuist dit topic stap voor stap gevolgd en iets in dit topic ([rml][ XSL] <xsl:cdata>[/rml]) is begonnen is nu in dit topic geindigd :) mijn dank is enorm groot... niet alleen snap ik nu hoe dat XSL gedoe in elkaar steekt (beetje omgekeerde wereld) maar ik snap tevens wat ik al die tijd fout zat te doen... CDATA is inderdaad een vieze oplossing :)

(ps dit is niet bedoeld als topic kick)
Pagina: 1