[XSL] Namespaces

Pagina: 1
Acties:

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Men neme dit stukje xml van freshmeat.net:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">
  <item>
    <title>phpSlash 0.65-pre1</title>
    <link>http://freshmeat.net/releases/70713/</link>
    <description>Originally a port of slashcode to PHP, it's now more of a CMS.</description>
    <date>2002-02-23T14:56-06:00</date>
  </item>
  <item>
    <title>mod_ssl 2.8.7-1.3.23</title>
    <link>http://freshmeat.net/releases/70714/</link>
    <description>Apache Interface to OpenSSL</description>
    <date>2002-02-23T14:55-06:00</date>
  </item>
</rdf:RDF>

Men probere met dit sukje xsl het te transformeren naar een test html'etje
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" ?>
<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <html>
            <head>
                <title>RDF test</title>
            </head>
            <body>
                <table>
                    <xsl:apply-templates/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="item">
        <tr>
            <td>
                <a>
                    <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
                    <xsl:attribute name="alt"><xsl:value-of select="title"/></xsl:attribute>
                    <xsl:value-of select="title"/>
                </a>
            </td>
        </tr>
    </xsl:template>

</xsl:transform>

Maar helaas.., het werkt niet. Ik krijg (uiteraard) wel het stuke wat matched met de root, maar niet ieder item dat ik wil hebben. Wel de text zonder tags, maar dat wil ik nie!

Ik heb het ook al met een call-template geprobeerd, en tevens met een for-each loopje, maar het mag allemaal niet baten. Hoe selecteer ik nou een item?

* rdf:item
* rdf:RDF/item
* /rdf:RDF//item
* //item
* /RDF/item

Heeft nog iemand een idee wat ik wel moet hebben? En dan gaarne een uitegje bij wat ik nou verkeerd doe/denk?

The box said 'requires Windows 95 or better', so I installed Linux...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
item, link, title en dergelijke zitten in je bron in de default namespace van dat document:
code:
1
xmlns="http://my.netscape.com/rdf/simple/0.9/

Je matched in je XSL Transformatie op link en title zonder namespace. Dat gaat dus niet goed :) .

Je kunt in je stylesheet de default namespace hetzelfde zetten als in je bron of je moet met een namespace prefix werken en een xmlns:blaat declaratie toevoegen. De eerste aanpak is het makkelijkst denk ik.

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


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Op zondag 24 februari 2002 19:33 schreef mbravenboer het volgende:
item, link, title en dergelijke zitten in je bron in de default namespace van dat document:
code:
1
xmlns="http://my.netscape.com/rdf/simple/0.9/
Dus je wilt zeggen dat de default namespace in m'n xml document de namspace van die netscape url heeft?
Je matched in je XSL Transformatie op link en title zonder namespace. Dat gaat dus niet goed :)
Daar was ik al achter, wist alleen de oorzaak nie... :P
Je kunt in je stylesheet de default namespace hetzelfde zetten als in je bron of je moet met een namespace prefix werken en een xmlns:blaat declaratie toevoegen. De eerste aanpak is het makkelijkst denk ik.
Dus dan moet ik in m'n header van het xsl bestand de default namespace opgeven met die netscape url? Dus ditte:
code:
1
2
3
4
5
6
<?xml version="1.0" ?>
<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://my.netscape.com/rdf/simple/0.9/">
<xsl:output method="xml" indent="yes" />

Mmm... had ik ook al geprobeerd, maar ook dat werkt niet. Misschien handig om te vermelden dat ik het met PHP doe, en dus Sablotron gebruik. Natuurlijk heb ik dit ook al op de commandline geprobeerd met sabcmd, maar ook dat gaf hetzelfde negatieve resultaat.

Kan je anders een voorbeeld kunnen geven hoe het volgens jou zou moeten/kunnen? En ook eentje met een prefix?

The box said 'requires Windows 95 or better', so I installed Linux...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier werkt het gewoon, maar wellicht dat je ergens een klein foutje het gemaakt. Ik ken de kuren van Sabletron verder niet ;) .

Hier mijn code:

XML document:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns="http://my.netscape.com/rdf/simple/0.9/">
    <item>
      <title>phpSlash 0.65-pre1</title>
      <link>http://freshmeat.net/releases/70713/</link>
      <description>Originally a port of slashcode to PHP, it's now more of a CMS.</description>
      <date>2002-02-23T14:56-06:00</date>
    </item>
    <item>
      <title>mod_ssl 2.8.7-1.3.23</title>
      <link>http://freshmeat.net/releases/70714/</link>
      <description>Apache Interface to OpenSSL</description>
      <date>2002-02-23T14:55-06:00</date>
    </item>
</rdf:RDF>

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

<xsl:transform version="1.0"
        xmlns:srdf="http://my.netscape.com/rdf/simple/0.9/"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns="http://www.w3.org/1999/xhtml">

    <xsl:output method="xml" indent="yes"
                doctype-public="-//W3C//DTD XHTML 1.1//EN"
                doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

    <xsl:template match="rdf:RDF">
      <html>
        <head>
            <title>RDF test</title>
        </head>
        <body>
            <table>
              <xsl:apply-templates select="srdf:item"/>
            </table>
        </body>
      </html>
    </xsl:template>

    <xsl:template match="srdf:item">
      <tr>
        <td>
            <a href="{srdf:link/text()}">
              <xsl:value-of select="srdf:title"/>
            </a>
        </td>
      </tr>
    </xsl:template>

</xsl:transform>

en het resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>RDF test</title>
    </head>
    <body>
      <table>
        <tr>
            <td>
              <a href="http://freshmeat.net/releases/70713/">phpSlash 0.65-pre1</a>
            </td>
        </tr>
        <tr>
            <td>
              <a href="http://freshmeat.net/releases/70714/">mod_ssl 2.8.7-1.3.23</a>
            </td>
        </tr>
      </table>
     </body>
</html>

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
TheMrH: Dus je wilt zeggen dat de default namespace in m'n xml document de namspace van die netscape url heeft?
Ja dus :)
Dus dan moet ik in m'n header van het xsl bestand de default namespace opgeven met die netscape url? Dus ditte
Yep, dat was een andere optie geweest, maar omdat er ook veel HTML in staat werkt dat ook weer onhandig. Ik heb nu XHTML als de default namespace gebruikt.
Mmm... had ik ook al geprobeerd, maar ook dat werkt niet.
Dat had wel moeten werken denk ik zo ...
Kan je anders een voorbeeld kunnen geven hoe het volgens jou zou moeten/kunnen? En ook eentje met een prefix?
Done :+ .

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


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Martin je bent geweldig!

Ik zat maar te klooien met die stomme namespaces, die naturlijk heel handig zijn als je weet hoe ze te gebruiken.


Nog een vraagje: wrom werkt het niet als ik ipv
code:
1
<xsl:template match="rdf:RDF">

dit doe
code:
1
2
3
<xsl:template match="rdf:/">
of
<xsl:template match="/">

Die laatste begrijp ik enigszins, maar die rdf:/ zou volgens mij ook moeten werken toch?

The box said 'requires Windows 95 or better', so I installed Linux...


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
En nog een vraagje: wat is beter/wordt aangeraden

<xsl:stylesheet> of <xsl:transform> te gebruiken? Jij gebruikt de transform, maar in principe zijn ze hetzelfde toch?

The box said 'requires Windows 95 or better', so I installed Linux...


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op zondag 24 februari 2002 19:33 schreef mbravenboer het volgende:
item, link, title en dergelijke zitten in je bron in de default namespace van dat document:
code:
1
xmlns="http://my.netscape.com/rdf/simple/0.9/

Je matched in je XSL Transformatie op link en title zonder namespace. Dat gaat dus niet goed :) .
Ik heb hem ook gevonden :) :) (snapte er in het begin helemaal niets van maar het is eigelijk niet zo ingewikkeld) :)
Pagina: 1