position() bringt das doppelte des erwarteten Wertes
Frederik
- xsl
0 Cheatah0 Frederik0 Thomas J.S.0 Frederik
Hallo!
Gerade bin ich dabei, für eine Website ein XSLT zu schreiben, dass einfache HTML-Seiten mit einem Menü und etwas drumherum anreichert. Die Informationen über das Menü sind in einer Datei structure.xml gespeichert, die wie folgt aufgebaut ist:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE site SYSTEM "/usr/local/share/dtds/site.dtd">
<site>
<pages>
<page id="index">
<title>Startseite</title>
</page>
<page id="nrzwei">
<title>Eine zweite Seite</title>
<pages>
<page id="unterseite">
<title>Erste Unterseite</title>
</page>
<page id="unterseitezwo">
<title>Zweite Unterseite</title>
</page>
</pages>
</page>
<page id="nrdrei">
<title>Und die dritte Seite</title>
</page>
</pages>
</site>
Nun wollte ich auslesen, an welcher Stelle eine Menüeintrag steht, weil der erste etwas anders formatiert werden soll. Mein Problem: Der ausgegebene Wert ist genau doppelt so hoch, wie ich es erwarten würde.
Ich habe zum Testen mal ein minimal-XSLT geschrieben, das das Verhalten auch zeigt:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="#default">
<xsl:output
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
indent="yes"
method="xml"
omit-xml-declaration="yes"
encoding="iso-8859-1" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="page">
<xsl:value-of select="position()"/><xsl:text>: </xsl:text><xsl:value-of select="@id"/>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
Das Ergebnis ist:
2: index
Startseite
4: nrzwei
Eine zweite Seite
2: unterseite
Erste Unterseite
4: unterseitezwo
Zweite Unterseite
6: nrdrei
Und die dritte Seite
Dabei hätte ich jetzt 1, 2, 1, 2, 3 erwartet.
Kann mir vielleicht jemand auf die Sprünge helfen, was ich da falsch mache? Dafür wäre ich sehr dankbar!
Liebe Grüße
Frederik
Hi,
Nun wollte ich auslesen, an welcher Stelle eine Menüeintrag steht, weil der erste etwas anders formatiert werden soll. Mein Problem: Der ausgegebene Wert ist genau doppelt so hoch, wie ich es erwarten würde.
ehrlich? Schau'n mer mal:
<pages>
Hier haben wir das erste Kind des <pages>-Elements, eine Textnode, aus Whitespaces bestehend.
<page id="index">
Dieses Kind endet hier. Es folgt das zweite Kind, ein <page>-Element.
[...]</page>
<page id="nrzwei">
Anschließend eine Textnode, und wieder ein <page>-Element. Das vierte Kind.
Das Ergebnis ist:
[code]
2: index
Startseite4: nrzwei
Eine zweite Seite
Tja, exakt das, was die Theorie verlangt.
Kann mir vielleicht jemand auf die Sprünge helfen, was ich da falsch mache? Dafür wäre ich sehr dankbar!
Jetzt klarer?
Cheatah
Hi Cheatah!
Ah, ok, irgendwie hatte ich gedacht, dass nur die Elemente der gleichen Art gezählt werden. Jetzt ist mir das klarer, danke!
Nun wundert mich nur eines: /site/pages/page[position() = 2] gibt mir den zweiten page-Knoten (nrzwei) zurück. Wenn position() aber alle Knoten der gleichen Ebene zählt, müsste doch auch hier wieder der erste page-Knoten (der ja, wie ich gelernt habe, der zweite Kindknoten des pages-Elements ist :-) ) zurückgegeben werden, oder?
Anders: Kann ich denn überhaupt mit position() eine Zählung nur der page-Knoten erziehlen?
Liebe Grüße
Frederik
Hallo,
Ah, ok, irgendwie hatte ich gedacht, dass nur die Elemente der gleichen Art gezählt werden. Jetzt ist mir das klarer, danke!
Das ist abhängig vom XSLT-Prozessor.
Anders: Kann ich denn überhaupt mit position() eine Zählung nur der page-Knoten erziehlen?
Ja, mache z.B. eine http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#strip_space auf pages.
Grüße
Thomas
Hi!
Ah, ok, irgendwie hatte ich gedacht, dass nur die Elemente der gleichen Art gezählt werden. Jetzt ist mir das klarer, danke!
Das ist abhängig vom XSLT-Prozessor.
Zur Sicherheit hatte ich es mit Saxon und Xalan probiert, und beide haben sich so verhalten. Was nicht heißt, dass andere es nicht anders machen...
Anders: Kann ich denn überhaupt mit position() eine Zählung nur der page-Knoten erziehlen?
Ja, mache z.B. eine http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#strip_space auf pages.
Oh, toll, das kannte ich noch nicht. Scheint aber genau das zu sein, was ich gesucht habe, danke!
Liebe Grüße
Frederik