Thomas J.S.: Eltern Element von Attribut

Beitrag lesen

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