XSLT Distinct Kindsliste

anwendungsentwickl

Grünschnabel
Hallo,

ich habe mich bereits durch einige Foren gehangelt, bin aber leider in meinem speziellen Problem noch zu keiner Lösung gekommen.

Ich habe beispielhaft folgendes XML Dokument.

<root>
<child>
<sub2></sub2>
<sub3></sub3>
<sub1></sub1>
<sub1></sub1>
<sub3></sub3>
<sub1></sub1>
<sub1></sub1>
</child>

dieses XML bekomme ich in dieser Form, leider kann ich das Ausgangsdesign nicht manipulieren.

Nun habe ich folgende Anforderung an die Darstellelung in HTML. Ich möchte mit XSLT 1.0 nur jeweils ein Element sub1, sub2, sub3 aus dem XML Dokument auslesen.

Dabei besteht das Problem, dass das Ausgangsdokument sehr groß ist und ich auch nur über die sub Elemennte iterieren möchte, welche Eindeutig sind. Das heißt wiederrum das ich das XPath Statement im <xsl:for-each select="Statement"> einstellen möchte.

Die Möglichkeit über select="child/*[not(preceding-sibling::*[.] = .)]" hat nicht den gewünschten erfolg gebacht da die unterelemente nicht sortiert sind und somit der preceding-sibling nicht zwangsläufig vom gleichen Knotentyp ist.

Ich hoffe ich habe mein Anliegen verständlich ausgedrückt und kann mich schon bald über eine erfolgbringende Antwort freuen :)

MfG Thomas
 
Hallo,

nur mal so zum Verständis. Als Ausgabe wäre es jetzt bei deinem Beispiel nur sub2, oder?

MFG

zEriX
 
Hallo,

ich habe die Erwartung, dass ähnlich wie bei MySqL (SELECT DISTINCT FROM...) aus der Liste der Kindselemente ein distinct herausgefiltert wird und dies bestenfalls bereits im template select.

Somit sollte bei dem obigen Beispiel dann sub1, sub2 und sub3 aus dem template hervortreten.

Vielen dank schonmal für deine Mühe!

MfG Thomas
 
Hi.

Schau mal hier:
XML:
<xsl:template match="/root/child/*">
    <xsl:variable name="name" select="name()" />
    <xsl:if test="not(preceding-sibling::*[name() = $name])">
      <xsl:call-template name="print" />
    </xsl:if>
</xsl:template>

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo deepthroat ;-),

schönen dank ich ich dachte immer beim preceding-sibling werden nur die vorgänger beachtet, aber so wie du es mir geschickt hast funktioniert es nun wirklich. Also herzlichen Dank nochmal!

MfG Thomas
 

Neue Beiträge

Zurück