Bestimmte Knoten in den Nachfolger ihres Parent-Elementes verschieben

27/05/2009 - 10:50 von k-risc | Report spam
Hallo,

ich möchte die jeweils letzten Kinder bestimmter Elemente untersuchen,
und falls diese Kinder einem bestimmten Tag entsprechen, dann möchte
ich sie an den Anfang des folgenden Elements verschieben.

Beispiel: Die Parent-Elemente, die ich durchsuchen will, heißen
"level", die zu bearbeitenden Kinder "h1".
Mittels des folgenden Tempaltes kann ich diese h1 gezielt greifen:
<xsl:template match="level/*[last()]">
<xsl:if test="local-name(.)='h1'">
...
</xsl:if>
</xsl:template>

Doch ich kann sie zwar an Ort und Stelle veràndern, weiß aber nicht,
ob es möglich ist, sie nun auch "umzuhàngen".

Beispiele (vorher/nachher):

vorher:
<level>
<p>...</p>
<div>...</div>
<h1>...</h1>
</level>
<level>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

nachher (das h1 soll an den Anfang des folgenden Levels):
<level>
<p>...</p>
<div>...</div>
</level>
<level>
<h1>...</h1>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

vorher:
<level>
<p>...</p>
<h1>...</h1>
<div>...</div>
</level>
<level>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

nachher (hier soll nichts passieren, da das h1 nicht das letzte
Element im Level ist):
<level>
<p>...</p>
<h1>...</h1>
<div>...</div>
</level>
<level>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

vorher:
<level>
<p>...</p>
<div>...</div>
<h1 class="bla">...</h1>
<h1 class="blubb">...</h1>
</level>
<level>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

nachher (das h1, welches das letzte in dem level ist, wird verschoben,
das vorletzte nicht):
<level>
<p>...</p>
<div>...</div>
<h1 class="bla">...</h1>
</level>
<level>
<h1 class="blubb">...</h1>
<p>...</p>
<p>...</p>
<p>...</p>
</level>

Ist das mit XSL möglich?

Vielen Dank, viele Grüße,

Christian Kirchhoff
 

Lesen sie die antworten

#1 Martin Honnen
27/05/2009 - 12:34 | Warnen spam
wrote:

Doch ich kann sie zwar an Ort und Stelle veràndern, weiß aber nicht,
ob es möglich ist, sie nun auch "umzuhàngen".



Das "Umhàngen" muss im Template für "level" geschehen:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="level">
<xsl:copy>
<xsl:apply-templates select="@* |
preceding-sibling::level[1]/*[last()][self::h1] | *[not(position() =
last() and self::h1)]"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Martin Honnen MVP XML
http://msmvps.com/blogs/martin_honnen/

Ähnliche fragen