[XML/XSLT] XSL laat teveel zien *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Beste,

Ik heb een xml gemaakt van mijn database server zodat ik een goed overzicht krijg van al mijn database en tabellen hierin. De xml is goed aangemaakt maar wanneer ik er de xsl aan toevoeg dan gaat het fout. Hij toont altijd alle namen van de tabellen, ook die dat niet bij de database horen!

Mijn structuur is als volgt ( natuurlijk met de data in, hier staat de data wel juist):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<databaselijst>
    <database>
        <naam></naam>
        <tabel>
            <naam></naam>
            <rij>
                <naam></naam>
                <type></type>
                <flags></flags>
            </rij>
        </tabel>
    </database>
</databaselijst>

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="/databaselijst/database">
                    <h1>
                        <xsl:value-of select="naam" />
                    </h1>
                    <xsl:for-each select="/databaselijst/database/tabel">
                        <h4><xsl:value-of select="naam"></xsl:value-of></h4>
                    </xsl:for-each>
                </xsl:for-each>

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>


Hoe komt het dat hij alle tabbellen toont per database, ook al horen die er niet bij in de xml?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
moet je op regel 11 niet "/databaselijst/database/tabel" in "tabel" veranderen?

Omdat je in je select weer het volledige absolute path opgeeft lijkt het me inderdaad dat hij alle tabel elementen selecteerd. Je zult dus denk ik relatief moeten selectere.

disclaimer:
ik heb voor de rest niet echt ervaring met xslt

offtopic:
Ik heb overigens je topic titel even aangepast: *** Over topictitels in PRG - lezen voor topic openen!!! ***

[ Voor 18% gewijzigd door Woy op 22-04-2009 19:49 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
Inderdaad met hierboven,
regel 11 van je XSLT:
XML:
1
<xsl:for-each select="/databaselijst/database/tabel">

pakt ELKE <tabel> als child van <database> als child van <databaselijst> als child van / (root) en voert dat zo vaak uit als er een <database> als child van <databaselijst> als child van / wordt gevonden (omdat deze in de for-each loop daarvan staat).
Je wilt dus, regel 11:
XML:
1
<xsl:for-each select="current()/tabel">

of
XML:
1
<xsl:for-each select="./tabel">

wat hetzelfde is.

edit: met een for-each creëer je een nieuwe scope. Probeer te begrijpen dat je binnen die scope bepaalde xslt functies tot je beschikking hebt, waarmee je aan die scope (i.p.v. de global scope) kunt refereren. w3schools heeft een goede referentielijst van xslt functies en natuurlijk van xpath functies.

[ Voor 33% gewijzigd door tonyisgaaf op 23-04-2009 00:27 ]

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Het kan ook handig zijn (ordelijker) om wat meer losse templates te gebruiken en minder for-each.

Rustacean