Tobel: Ausschliessen von Knoten bei for-each

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

  1. 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

    1. 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

  2. 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