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