Hallo Stefan,
vielen Dank für deine schnelle Hilfe, es funktioniert.
Nun soll folgende Erweiterung eingebaut werden:
Nicht alle Elemente sollen das Attribut id besitzen, sondern nur ausgewählte Elemente. Das habe ich in zwei Transformationsschritten gelöst und es funktioniert ebenfalls.
Jetzt möchte ich gerne ein weiteres Attribut type in das Zählen mit einbeziehen, aber nur dann wenn der Wert des Attributes das erste Mal auftritt. Tritt das Attribut ein zweites Mal mit diesem Wert auf soll es nicht mehr gezählt werden und ihm soll der gleichen Wert wie beim ersten Auftreten zugewiesen werden.
Zum Beispiel:
XML-Dokument nach der ersten Transformation:
<F>
<A>
<Z/>
<G/>
</A>
<B id="1">
<C name="x" id="1" type="text"/>
</B>
<B>
<C name="y" id="1" type="zahl"/>
</B>
<B id="1" type="text">
<C name="y" id="1"/>
</B>
<A id="1" type="zahl"/>
</F>
Nach der zweiten Transformation soll das wie folgt aussehen:
<F>
<A>
<Z/>
</A>
<B id="1">
<C name="x" id="2" type="3"/>
</B>
<B>
<C name="y" id="4" type="5"/>
</B>
<B id="6" type="3">
<C name="y" id="7"/>
</B>
<A id="8" type="5"/>
</F>
Mit folgenden Stylesheet wollte ich dies realisieren, klappt aber nicht.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="copy.xsl" /> <!-- Kopier - Stylesheet-->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
- <xsl:template match="@id">
- <xsl:param name="countxmi"><xsl:number count="//*[@id]" level="any" /></xsl:param>
- <xsl:param name="counttype">
<xsl:number count="//*[not(@type=preceding::F/@type)]" level="any" /></xsl:param>
xls:choose
<xsl:when test="type"><xsl:attribute name="id"><xsl:value-of select="$countxmi + 1" /></xsl:attribute></xsl:when>
xsl:otherwise<xsl:attribute name="id"><xsl:value-of select="$countxmi" /></xsl:attribute> </xsl:otherwise>
</xls:choose> - <xsl:attribute name="id"><xsl:value-of select="$countxmi + $counttype" /></xsl:attribute>
<xsl:apply-templates />
</xsl:template> - <xsl:template match="@type">
- <xsl:param name="countxmi"><xsl:number count="//*[@id]" level="any" /></xsl:param>
- <xsl:param name="counttype"><xsl:number count="//*[not(@type=preceding::F/@type)]" level="any" /></xsl:param>
- <xsl:attribute name="type">
<xsl:value-of select="$countxmi + $counttype" />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Viele Grüße, Tini