mit dem folgenden XML-Dokument mit:Auswahl der ersten Elemente der Elementgruppen XSLT 1.0
<foo>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
</foo>
Die XML-Elemente bar
Listenelemente sind, logisch nach Typ und ID gruppiert. Das Beispieldokument enthält daher zwei geordnete Listen (Typ = 1 und ID = 1 und Typ = 1 und ID = 2) mit jeweils zwei Elementen. Im realen Dokument gibt es viel mehr Listen (mit verschiedenen Typen und IDs) unterschiedlicher Länge.
Jetzt muss ich das erste Element a1
jeder Liste mit einem anderen Wert, z. in folgendem Dokument:
<foo>
<bar>
<type>1</type>
<id>1</id>
<a1>-100</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>-100</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
</foo>
In Pseudo-SQL würde dies wahrscheinlich so aussehen:
update bar set a1 = -100 where position() = 1 group by type, id
Ist dies möglich mit XSLT 1.0? Ich denke, es läuft darauf hinaus, einen XPath-Ausdruck schreiben zu können, der das gleiche Ergebnis liefert wie meine Pseudo-SQL-Anweisung.
Nur für mein Verständnis: Der 'xsl: key' erzeugt einen Schlüssel für alle' bar' Elemente mit der String-Verkettung der Inhalte der Kindelemente 'type' und'd'. Und der 'generate-id (...)' Funktionsaufruf regeneriert dann diesen Schlüssel und prüft, ob er mit dem aktuellen Element übereinstimmt. Dadurch wird für jeden Typ ein ID-Paar erstellt, von dem das erste ausgewählt wird. Ist das mehr oder weniger korrekt? – Markus
@Markus, ich habe einige Erklärungen über den verwendeten Ansatz hinzugefügt, ich habe einen Weg durch XSLT 2.0 genommen, da dort der Ausdruck leichter auszudrücken ist und näher an der natürlichen Sprache liegt. –