Wenn Sie meinen, alle Knoten folgende <A>
übereinstimmen, aber kommen, bevor die nächste <A>
, ich glaube, Sie so etwas wie diese verwenden:
<xsl:template match="A">
<xsl:copy>
<!-- start of range -->
<xsl:variable name="start" select="count(preceding-sibling::*) + 1" />
<!-- end of range -->
<xsl:variable name="stop">
<xsl:choose>
<!-- either just before the next A node -->
<xsl:when test="following-sibling::A">
<xsl:value-of select="count(following-sibling::A[1]/preceding-sibling::*) + 1" />
</xsl:when>
<!-- or all the rest -->
<xsl:otherwise>
<xsl:value-of select="count(../*) + 1" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- this for debugging only -->
<xsl:attribute name="range">
<xsl:value-of select="concat($start + 1, '-', $stop - 1)" />
</xsl:attribute>
<!-- copy all nodes in the calculated range -->
<xsl:for-each select="../*[position() > $start and position() < $stop]">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
Für Ihre Eingabe:
<root>
<A />
<ab />
<ac />
<A />
<ab />
<ac />
</root>
Ich bekomme (ich ließ das Attribut "Bereich" in, um die Berechnungen sichtbar zu machen):
<A range="2-3">
<ab />
<ac />
</A>
<A range="5-6">
<ab />
<ac />
</A>
Sie haben noch konkreter werden, was besondere macht? – Diadistis
@Hugo Dies ist eine Lösung für das beschriebene Problem, und es erzeugt das gewünschte Ergebnis. Falls Sie ein anderes Problem haben, posten Sie es bitte, damit es gelöst werden kann. Sie sollten keine Probleme haben, diese Lösung auf das aktuelle Problem anzuwenden - es produziert nur das gewünschte Ergebnis –