Tobel: Eltern Element von Attribut

Hallo

Mein XML Dokument sieht folgender Maßen aus:

<Seite>
  <Kapitel>
    <Überschrift1 id="id1">Text<Überschrift2>
    <Absatz>Text</Absatz>
    <Unterkapitel>
      <Überschrift2 id="id2">Text<Überschrift2>
      <Absatz>Text</Absatz>
    </Unterkapitel>
  </Kapitel>
</Seite>

Nun durchlaufe ich alle "id" Attribute mit

<xsl:for-each "//@id">

</xsl:for-each>

Wie sieht das Elternelement von "id" aus (gibt es das überhaupt)? Und wie stell ich fest ob "Unterkapitel" ein Vorfahr von "id" ist?

Gruß,

Tobel

  1. Hallo Tobel,

    Mein XML Dokument sieht folgender Maßen aus:

    <Seite>
      <Kapitel>
        <Überschrift1 id="id1">Text<Überschrift2>
        <Absatz>Text</Absatz>
        <Unterkapitel>
          <Überschrift2 id="id2">Text<Überschrift2>
          <Absatz>Text</Absatz>
        </Unterkapitel>
      </Kapitel>
    </Seite>

    Nun durchlaufe ich alle "id" Attribute mit

    <xsl:for-each "//@id">

    </xsl:for-each>

    Wie sieht das Elternelement von "id" aus (gibt es das überhaupt)?

    Gute Frage ;-).
    Attribute haben immer ein Element als Elternknoten (also einen parent node), so hat auch @id ein Elternelement, aber - und jetzt kommts - Attribute werden nicht als Kinder des Elements betrachtet. Hier ist also das Verhältnis parent::node <-> child::node nicht ein 1:1 Verhältnis.

    »»Und wie stell ich fest ob "Unterkapitel" ein Vorfahr von "id" ist?

    Das kommt ganz darauf an was du machen möchtest: es ginge z.B. so auch: <xsl:if test="Unterkapitel[*[@id]]">. Damit testest du ob Kindelemente von Unterkapitel ein "id" Attribute haben.
    Wenn du diesen Ausdruck erweiterst: <xsl:if test="Unterkapitel[//*[@id]]"> testest du ob irgendein Element innerhalb vom <Unterkapitel> ein "id" Attribute hat.

    Mit <xsl:for-each "//@id"> selektiertst du alle "id" Attribute, ich vermute du möchtest alle Elemente die ein "id" Attribute haben selektieren, das ginge so: <xsl:for-each "//*[@id]">.
    Wenn du im Kontext von diesem for-each bist kannst du folgenden Test machen: <xsl:if test="ancestor::Unterkapitel">.
    Damit testest du ob das aktuelle Element ein "Unterkapitel" Vorfahren hat.

    Grüße
    Thomas

    1. Alles Klar, Danke!