Michael: XSLT - Sortieren und doppelte Einträge unterdrücken

Beitrag lesen

Hallo auch,

Nachtmensch ;-)

heute bist Du aber auch mal zu recht später Stunde unterwegs ;-)

Daran wird es nicht liegen.
gernerate-id() erzeugt einen ID für eine Element, erstmal intern zu "runtime". Natürlich kann man dann diese ID auch für die Ausgabe verwenden.

Hmmm, so was hab ich mir schon gedacht.

Dazu noch eine Frage nebenbei: Könnte es in dem Kontext Konflikte geben, wenn ich in meinem Schema an mehreren Stellen Attribute namens "id" definiert habe, die allerdings nicht vom Typ ID sind?

Es wird immer wieder empfohlen id wirklich als Typ ID zu benutzen.
Aber ein Konflikt sollte es deshalb nicht geben.

Dann ist es ja gut. So sehr zufrieden bin ich damit eigentlich nicht, aber ich lasse an manchen Stellen "interaktive Elemente" generieren. Im zugehörigen JS werden diese mit getElementById angesprochen. Deshalb hab ich der Übersichtlichkeit halber die Attribute im XML auch id genannt.

Was mich noch etwas verwirrt ist folgendes:
Zum testen habe ich das Template in einem neuen und ansonsten leeren XSL probiert und da funktionierte es natürlich wie es soll.

Im XSL, in dem ich es verwenden möchte hingegen scheitert es, bei ansonsten identischen Bedingungen (gleiches Schema und XML) an der Auswertung von "li[generate-id(.) = generate-id(key('likey', .)[1])]".

Was genau passiert da?

Nix ;-)
Wenn ich es im "großen XSL" transformieren möchte, bricht er an der genannten Stelle mit der Fehlermeldung "This file is not valid: Error in XPath 2.0 Expression" ab - ohne etwas auszugeben. (Ich arbeite mit XMLSpy Home und transformiere mit der enthaltenen MS-XSL-Engine)

Gibt es eine Ausgabe - wenn auch eine falsche - oder wird nichts dargestellt?

Mit dem "einsatz" XSL gibt es keine. Mit den "Test" XSL sieht die Ausgabe so aus, wie Du es in Deinem Bsp. geschrieben hast.
Richtig seltsam ist das was der IE daraus macht, wenn ich das XML direkt damit aufrufe. Er gibt keine Texte mehr aus und zeigt nur leere Listenelemente (auch von Sachen, die mit ganz anderen Templates abgearbeitet werden).(Lediglich Hyperlinks werden noch angezeigt.)

Gegebenfalls muss du mehr von deinem "einsatzt" XSL zeigen.

Kann ich gerne machen, nur was davon?
(Das ganze kann / will ich hier nicht posten, denn a) sind knapp 1000 Zeilen und b) ist es noch in Abeit und teilweise noch etwas unschön.)

Erfolgreich hingegen ist, dass ich nun doch einen Ausdruck gefunden habe mit dem ich mit for-each die Knotenmenge so selektieren kann, dass ich nachträglich nicht mehr filtern muss:
"ul/li[not(. = preceding-sibling::li)]"

Das deutet aber darauf hin, dass du nicht im Template mit match="litlist/ul" bist, oder dass dein XML etwas anders aussieht. ;-)

Gut aufgepasst ;-) - match="litlist"

Damit funktioniert es jetzt ganz gut.

Nun, dann passt es eigentlich ;-)

Alles Weitere diene dann "nur" mehr der intellektuellen Bereicherung, denn einem pragmatischen Zweck ;-)

Ich finde den Dialog mit Dir sehr bereichernd und wäre natürlich noch brennend daran interessiert, warum das mit generate-id nicht klappt.

Viele nachtschlafende Grüße

Michael