XML/XSL, Transformation, XPath, for-each,...
Bürgle
- xml
0 Tim Tepaße0 Bürgle
0 Robert0 fjh
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
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.
Hi zusammen,
Ihr habt mich vor der Verzweiflung gerettet:)
Danke für die Hilfe!
Grüße,
Bürgle
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
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