Frederik: position() bringt das doppelte des erwarteten Wertes

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

  1. 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
       Startseite

    4: 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

      1. 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

        1. 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