Tobel: Eltern Element eines bestimmten Typs finden

Hallo

Ich habe folgendes XML Konstrukt:

<Seite>
  <Überschrift>Bla</Überschrift>
  <Text>Blabla</Text>
  <Seite>
    <Überschrift>Blub</Überschrift>
    <Text>Blabla</Text>
    <Fußnote>Bla</Fußnote>
  </Seite>
</Seite>

Per XSL möchte ich jetzt feststellen auf welche Seite sich meine Fußnote befindet, wenn das Element Fußnote gemacht wurde.
Wenn ich mit

<xsl:for-each select="/root//Seite">
  <xsl:for-each select=".//Fußnote">
    Mach was...
  </xsl:for-each>
</xsl:for-each>

suche bekomme ich einen Treffen für die erste und für die in der ersten Seite geschachtelten zweiten Seite....

Weiß jemand Rat?

Gruß,

Tobel

  1. Hallo,

    <Seite>
      <Überschrift>Bla</Überschrift>
      <Text>Blabla</Text>
      <Seite>
        <Überschrift>Blub</Überschrift>
        <Text>Blabla</Text>
        <Fußnote>Bla</Fußnote>
      </Seite>
    </Seite>

    Per XSL möchte ich jetzt feststellen auf welche Seite sich meine Fußnote befindet, wenn das Element Fußnote gemacht wurde.
    Wenn ich mit

    <xsl:for-each select="/root//Seite">
      <xsl:for-each select=".//Fußnote">
        Mach was...
      </xsl:for-each>
    </xsl:for-each>

    <xsl:template match="Seite">
    <xsl:for-each select="Fußnote">
       <xsl:value-of select="../Seite/Überschrift" />
    </xsl:for-each>
    </xsl:template>
    Würde dir zur Fußnote gehörende Seitenüberschrift wiedergeben.
    Auf ein Elternelement kannst du mit "parent::" oder mit "../" zugreifen.

    Aber ich würde es eher so machen:
    <xsl:template match="Seite">
    ...
    <xsl:apply-temlates select="Fußnote" />
    </xsl:template>

    <xsl:template match="Fußnote">
       <xsl:value-of select="../Seite/Überschrift" />
    </xsl:for-each>
    </xsl:template>

    Was genau möchtest du erreichen?

    Grüße
    Thomas

    1. <xsl:template match="Seite">
      <xsl:for-each select="Fußnote">
         <xsl:value-of select="../Seite/Überschrift" />
      </xsl:for-each>
      </xsl:template>
      Würde dir zur Fußnote gehörende Seitenüberschrift wiedergeben.
      Auf ein Elternelement kannst du mit "parent::" oder mit "../" zugreifen.

      Aber ich würde es eher so machen:
      <xsl:template match="Seite">
      ...
      <xsl:apply-temlates select="Fußnote" />
      </xsl:template>

      <xsl:template match="Fußnote">
         <xsl:value-of select="../Seite/Überschrift" />
      </xsl:for-each>
      </xsl:template>

      Was genau möchtest du erreichen?

      Das Element Fußnote wurde gemacht (gemätscht) (wie oben in deinem Beispiel), also befinde ich mich jetzt im XML Baum beim Knoten "Fußnote". Nun möchte ich von hier aus festellen, welches das erste Seite Element ist, das sich oberhalb von mir befindet:

      Seite
                                    |
                                 /  |   \                  Überschrift Text  Seite (die Seite will ich haben (z.B. die Position)
                                           |
                                        /  |   \                         Überschrift Text  Fußnote (hier befinde ich mich)

      Allerding muss der Baum nicht immer so aussehen, zwischen Fußnote und Seite können auch nocht andere Elemente sein, daher kann ich nicht einfach parent::Seite oder so vorgehen, oder?

      1. Hallo,

        Seite
                                      |
                                   /  |   \                  Überschrift Text  Seite (die Seite will ich haben (z.B. die Position)

        Allerding muss der Baum nicht immer so aussehen, zwischen Fußnote und Seite können auch nocht andere Elemente sein, daher kann ich nicht einfach parent::Seite oder so vorgehen, oder?

        Doch, genau das macht parent::Seite
        Es ist egal wieviele Elemente sich auf der selben Hierarchiebene wie Fußnote befinden (ob vor oder nach Fußnote im 'document oder' spielt auch keine Rolle). Mit parant:: kommst du immer zum Elternelement.
        Wenn du zu einem Element der vor oder nach Fußnote auf der selben Hierarchiebene zugreifen möchtest, müsstest du preceding-sibling::  bzw. following-sibling:: verwenden.

        Allerdings es ist "schlecht" wenn du die Position von Seite im Fußnote haben willst, da sowas wie <xsl:value-of select="../Seite/postion()" /> nicht funktioniert.

        Eine Möglichkeit wäre:
        <xsl:template match="Fußnote">
         <xsl:param name="position" />
         Seite Position: <xsl:value-of select="$position" />
        </xsl:template>

        <xsl:template match="Seite">
         <xsl:param name="seitenposition" select="position()" />
        ...
         <xsl:apply-temlates select="Fußnote">
          <xsl:with-param name="position" select="$seitenposition" />
         </xsl:apply-templates>
        </xsl:template>

        Grüße
        Thomas

        1. Doch, genau das macht parent::Seite
          Es ist egal wieviele Elemente sich auf der selben Hierarchiebene wie Fußnote befinden (ob vor oder nach Fußnote im 'document oder' spielt auch keine Rolle). Mit parant:: kommst du immer zum Elternelement.

          Ich meinte allerdings eher, dass mein Baum auch so aussehen kann:

          Seite
                                        |
                                     /  |   \                  Überschrift Text  Seite
                                               |
                                            /  |   \                         Überschrift Text  Fußnotencontainer
                                                     \                                            Fußnote

          oder
                                      Seite
                                        |
                                     /  |   \                  Überschrift Text  Seite
                                               |
                                            /  |   \                         Überschrift Text  AnderesElement
                                                     \                                            AnderesElement
                                                      \                                             Fußnote

          Das Element Seite muss sich nicht zwangsläufig auf einer Hierachieebene über Fußnote befinden. (Das Beispiel macht gerad nicht viel Sinn. Das XML an dem ich arbeite würde aber die Problembeschreibung noch komplexer machen.)
          Hintergrund ist der, dass die Fussnote verlinkt werden soll (es dreht sich also um HTML Dokumente) und ich dazu die Seitenzahl brauch.

          1. Hallo,

            Ich meinte allerdings eher, dass mein Baum auch so aussehen kann:
            Das Element Seite muss sich nicht zwangsläufig auf einer Hierachieebene über Fußnote befinden.
            Hintergrund ist der, dass die Fussnote verlinkt werden soll (es dreht sich also um HTML Dokumente) und ich dazu die Seitenzahl brauch.

            Mein Beispiel mit den Parameter sollte auch in diesem Fall funktionieren, es ist unabhängig von Eltern-Kind-Verhältnis.
            Allerdings muss ich sagen, dass ich eine Verschachtelung von Seite/Seite für keine gute Entscheidung/Struktur halte.

            Grüße
            Thomas

            1. Mein Beispiel mit den Parameter sollte auch in diesem Fall funktionieren, es ist unabhängig von Eltern-Kind-Verhältnis.

              Das Problem ist aber andersrum, ich befinde mich bereits im Knoten Fußnote und möchte jetzt die Nummer (Position) der übergeordneten Seite rausfinden. Ich kann also nicht Seite matchen und dann mit apply-templates select="Fußnote" aufrufen.

              Allerdings muss ich sagen, dass ich eine Verschachtelung von Seite/Seite für keine gute Entscheidung/Struktur halte.

              Warum?

              Gruß,
              Tobel

              1. Hallo,

                Das Problem ist aber andersrum, ich befinde mich bereits im Knoten Fußnote und möchte jetzt die Nummer (Position) der übergeordneten Seite rausfinden. Ich kann also nicht Seite matchen und dann mit apply-templates select="Fußnote" aufrufen.

                Deshalb habe ich dir auch diese Lösung epmfohlen:
                ------------------------------
                <xsl:template match="Seite">
                 <xsl:param name="seitenposition" select="position()" />
                ...
                 <xsl:apply-temlates select="Fußnote">
                  <xsl:with-param name="position" select="$seitenposition" />
                 </xsl:apply-templates>
                </xsl:template>

                <xsl:template match="Fußnote">
                 <xsl:param name="position" />
                 Seite Position: <xsl:value-of select="$position" />
                </xsl:template>
                ------------------------------

                Allerdings muss ich sagen, dass ich eine Verschachtelung von Seite/Seite für keine gute Entscheidung/Struktur halte.

                Warum?

                Weil, wich ich mit der Zeit deine Doc.-Struktur in deinen verschiedenen Fragen mitverfolgt habe, versuchst du für <Seite> zwei ganz unterschiedliche semantische Bedeutungen zuzuordnen und das halte ich für keine gute Idee.

                Grüße
                Thomas

                PS: schaue bitte in deine mailbox

                1. Hallo,

                  PS: schaue bitte in deine mailbox

                  vergiss das.
                  -------------
                  ----- The following addresses had permanent fatal errors ----- tobel@web.de
                      (reason: 550 {mx033-rz3} tobel@web.de... User unknown or not available - Empfaenger unbekannt oder nicht erreichbar)

                  Grüße
                  Thomas