Bürgle: XML/XSL, Transformation, XPath, for-each,...

Hi!
Habe ein Problem bei folgender Dateikonstellation zur Transformation:

XML-Auszug: (vereinfacht)

<haupttext>
  <haupttextueberschrift>Hallo</haupttextueberschrift>
   <haupttextblock>Text1</haupttextblock>
  <haupttextueberschrift>Wie</haupttextueberschrift>
   <haupttextblock>Text2</haupttextblock>
  <haupttextueberschrift>Gehts</haupttextueberschrift>
   <haupttextblock>Text3</haupttextblock>
 </haupttext>

XSL-Auszug: (vereinfacht)

<xsl:template match="haupttext" >
  <xsl:for-each select="haupttextueberschrift">
    <p>
    <a href="datei.htm">
     <b>
      <xsl:value-of select="." />
     </b>
    </a>
    <br/>
    <div>
     <xsl:value-of select="../haupttextblock" />
    </div>
   </p>
  </xsl:for-each>
 </xsl:template>

Ich möchte:

Hallo
Text1

Wie
Text2

Gehts
Text3

Bekomme aber das:

Hallo
Text1

Wie
Text1

Gehts
Text1

Ich vermute ein (relativen) Pfadfehler, oder ein Denkfehler in der Schleife.
Hab aber vieles versucht und komm nicht drauf.

Danke für jeden Tipp,
Bürgle

  1. Hallo Bürgle,

    <xsl:value-of select="../haupttextblock" />

    So wie ich das sehe, sagst Du nicht welchen Knoten "haupttextblock" Gott was für Namen *g*) Du adressieren willst.

    In Deiner Schleife gehst Du zwar die "haupttextueberschriften" chronologisch durch, aber um den "haupttextblock" auszugeben, gehst Du eine Ebene in der Hierarchie höher und wählst dann einfach "haupttextblock" aus und es wird natürlich immer der erste verfügbare "haupttextblock" genommen.

    Ich hätte drei Vorschläge, weiß aber nicht, wie genau die Dir in Dein Konzept passen.

    a) Eine Adressierung a la "haupttextblock[3]", was aber bestimmt nicht so gut in Deine Schleife passt.

    b) Wenn "haupttextueberschriften" und "haupttextblock" eine logische Einheit bilden, würde es sich doch anbieten, diese in ein container einzupacken:
    <hauptdingsbums>
      <hauptueberschrift> foo </hauptueberschrift>
      <haupttextblock> foo </haupttextblock>
    </hauptdingsbums>

    c) Wozu überhaupt eine Schleife? Ach ja, weil die beiden Haupttexte eine logische Einheit bilden. Ansonsten hätte ich apply-templates empfohlen.

    • Tim
    1. Hi zusammen,

      Ihr habt mich vor der Verzweiflung gerettet:)
      Danke für die Hilfe!

      Grüße,
      Bürgle

      http://www.buergle.de

  2. Halli,

    XSL-Auszug: (vereinfacht)

    <xsl:template match="haupttext" >
      <xsl:for-each select="haupttextueberschrift">
        <p>
        <a href="datei.htm">
         <b>
          <xsl:value-of select="." />
         </b>
        </a>
        <br/>
        <div>
         <xsl:value-of select="../haupttextblock" />

    select="following-sibling::haupttextblock"

    cu,
    Robert

  3. Hallo Bürgle,

    <xsl:value-of select="../haupttextblock" />

    Damit gehts du ein "Stockwerk" hoch und wählst dann von dort aus alle <haupttextblock>-Elemente als Knotenmenge aus. Liefert ein XPath-Ausdruck als Wert des select-Ausdrucks eines xsl:value-of-Elements eine Knotenmenge mit *mehreren* Knoten zurück, dann wird nur jeweils der Zeichenkettenwert des ersten Knoten ausgegeben. Der ist bei Dir immer Text1.

    Folgende Zeile - wie Robert ja bereits gepostet hat - löst Dein Problem

    <xsl:value-of select="following-sibling::haupttextblock" />

    Hier wählst du ausgehend vom Kontextknoten alle Nachbarelemente auf gleicher Ebene aus die "haupttextblock" als Namen haben.

    Gruß
    Franz