Ausschliessen von Knoten bei for-each
Tobel
- xsl
0 sonja0 Thomas J.S.
Hallo
Ich habe ein XML Dokument, das folgendermaßen aufgebaut ist:
<Seite>
<Kapitel>
<Block> 1. Text </Block>
<Unterkapitel>
<Block> 2. Text</Block>
</Unterkapitel>
<Seite>
<Unterkapitel>
<Block> 3. Text </Block>
</Unterkapitel>
</Seite>
</Kapitel>
</Seite>
Ich befinde mich jetzt im 1. <Seite> Tag und möchte jetzt gerne die Blöcke mit dem 1. und 2. Text auslesen, aber nicht der mit dem 3. Text. Konkret will ich, dass er das untergeordnete <Seite> Tag komplett ignoriert! Wie ist das möglich? Gibt es sowas ähnliches wie <xsl:for-each select"not(Seite)">???
Gruß,
Tobel
Hallo
Ich habe ein XML Dokument, das folgendermaßen aufgebaut ist:
<Seite>
<Kapitel>
<Block> 1. Text </Block>
<Unterkapitel>
<Block> 2. Text</Block>
</Unterkapitel>
<Seite>
<Unterkapitel>
<Block> 3. Text </Block>
</Unterkapitel>
</Seite>
</Kapitel>
</Seite>Ich befinde mich jetzt im 1. <Seite> Tag und möchte jetzt gerne die Blöcke mit dem 1. und 2. Text auslesen, aber nicht der mit dem 3. Text. Konkret will ich, dass er das untergeordnete <Seite> Tag komplett ignoriert! Wie ist das möglich? Gibt es sowas ähnliches wie <xsl:for-each select"not(Seite)">???
Hallo
ich hoffe du arbeitest in der xsl auch mit apply template aufrufen oder?
naja jedenfalls sollte das in der xsl dann so aussehen:
<xsl:template match="Seite">
<xsl:apply-templates select="Kapitel" />
<xsl:apply-templates select="Unterkapitel" />
</xsl:template>
<xsl:template match="Kapitel">
<xsl:apply-templates select="Block" />
<xsl:apply-templates select="Unterkapitel" />
<xsl:apply-templates select="Seite" />
</xsl:template>
<xsl:template match="Unterkapitel">
<xsl:apply-templates select="Block" />
</xsl:template>
<xsl:template match="Block">
xsl:choose
<!-- damit frägst du ab ob das "übernächst-höhere" Element kapitel ist, das wort test ist festgelegt und bleibt so stehen -->
<xsl:when test="name(../..)='Kapitel'">
<xsl:value-of select="." />
</xsl:when>
</xsl:choose>
</xsl:template>
Sonja
Hallo,
naja jedenfalls sollte das in der xsl dann so aussehen:
Darf ich ein paar leise Zweifel anmelden?
<xsl:template match="Seite">
<xsl:apply-templates select="Kapitel" />
<xsl:apply-templates select="Unterkapitel" />
</xsl:template>
Tja, damit hat er auch in der inneren <Seite> _alle_ Kapitel und somit (nach deiner Templatestruktur) wiederum _alle_ Seite(n) dabei. Du hast damit eine wunderschöne Endlosschleife erzeugt, das ist kaum gewollt.
<xsl:template match="Kapitel">
<xsl:apply-templates select="Block" />
<xsl:apply-templates select="Unterkapitel" />
<xsl:apply-templates select="Seite" />
</xsl:template>
Gilt das selbe wie oben:
Seite ruft Kapitel auf --> Kapitel ruft Seite auf --> Seite ruft Kapitel auf -->usw. usf.
<xsl:template match="Block">
xsl:choose
<!-- damit frägst du ab ob das "übernächst-höhere" Element kapitel ist, das wort test ist festgelegt und bleibt so stehen -->
<xsl:when test="name(../..)='Kapitel'">
<xsl:value-of select="." />
</xsl:when>
</xsl:choose>
</xsl:template>
Da fehlt die Bedingung für Blocks deren parent::node() nicht Kapitel ist.
Irgendwie nicht das Wahre. Was meinst du?
Grüße
Thomas
Hallo,
Konkret will ich, dass er das untergeordnete <Seite> Tag komplett ignoriert! Wie ist das möglich? Gibt es sowas ähnliches wie <xsl:for-each select"not(Seite)">???
Was hast du denn bisher versucht bzw. wie sieht dein Kontext aus?
Theoretisch!! wäre sowas denkbar: <xsl:for-each select="Seite[not(child::Unterkapitel)]"> aber ohne deinen Kontext zu kennen kann man das nicht sagen.
Ich würde empfehlen, dass due hier mit Templates mit "mode" arbeitest.
Grüße
Thomas