Werte der Attribute im Ausgabedokument erhöhen
tt
- xsl
0 Stefan Eickhoff0 tt
Hallo,
weiß jemand zufällig, wie man bei einer Umwandlung von XML zu XML mittels XSLT im generierten XML-Dokument ein ID-Attribut mit unterschiedlichen Werten erzeugt. Der ID Wert ist abhängig von auftreten der ID im erzeugten Dokument.
Zum Beispiel:
Ausgangsdokument:
<A >
<B/>
<C name="x"/>
<C name="y"/>
<C name="z"/>
</A>
Zu erzeugentes Dokument:
<M id="1">
<B id="2">
<C name="x" id="3"/>
</B>
<B id="4">
<C name="y" id="5"/>
</B>
<B id="6">
<C name="y" id="7"/>
</B>
<A id="8"/>
</M>
Da XSLT keine Programmiersprache ist, könnte man dies vielleicht mit Unterstützung von Java realisieren?
Vielen Dank schon mal im voraus.
Viele Grüße, Tini
Hallo Tini,
wenn Du einfach die Elemente fortlaufend im Attribut ID durchnummerieren möchtest sollte es ungefähr wie folgt funktionieren:
<xsl:template match="@*|node()">
xsl:copy
<xsl:attribute name="id"><xsl:number count="//*" level="any"/>
</xsl:attribute>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
Da XSLT keine Programmiersprache ist,
Doch ist es.
Viele Grüße
Stefan
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" />
Viele Grüße, Tini