IDREFS aufdröseln in einzelne Ids...
MudGuard
- xsl
0 Thomas J.S.0 MudGuard
Hi,
Folgendes Problem(chen):
Ich hab eine XML-Datei mit einer Liste von Events (diese haben alle eine id).
Außerdem enthält die XML-Datei auch eine Liste von Personen.
Jede der Personen hat ein Attribut vom Typ IDREFS, indem eine Liste der Events enthalten ist, bei denen diese Person dabei war:
<?xml version="1.0" encoding="utf-8"?>
<people>
<events>
<event id="e1" name="1. Treffen" year="2001"/>
<event id="e3" name="2. Treffen" year="2001"/>
<event id="e4" name="3. Treffen" year="2002"/>
<event id="e5" name="4. Treffen" year="2002"/>
</events>
<persons>
<person id="p1" names="Adam" events="e1" />
<person id="p2" names="Eva" events="e2" />
<person id="p3" names="Kain" events="e1,e2,e3,e4,e5" />
</persons>
</people>
Ziel ist es, eine Auflistung zu erstellen, bei der zu jeder Person die besuchten Events aufgezählt werden.
(das ganze wird in eine dl gepackt, in dt soll der Personenname stehen, in dd für jedes Event ein Absatz).
Für die Personen, die nur eines der Events besucht haben, krieg ich das auch wunderbar hin mit folgenden 2 Templates
(den Rest - Erzeugung der kompletten HTML-Datei bis hin zur dl - hab ich weggelassen, weil er hier irrelevant sein sollte):
<!-- Template, das den Absatz mit den Event-Daten erzeugt -->
<xsl:template match="event">
<p><xsl:value-of select="@name"/>, <xsl:value-of select="@year"/></p>
</xsl:template>
<!-- Template, das den Eintrag für jede Person erzeugen sollte -->
<xsl:template match="person">
<xsl:variable name="eventids"><xsl:value-of select="@events"/></xsl:variable>
<dt><xsl:value-of select="@names"/></dt>
<dd><xsl:apply-templates select="//event[@id=$eventids]" /></dd>
</xsl:template>
Gibt es ein einfacheres Verfahren, daß ich hier nicht selbst den im Attribut events enthaltenen String in Einzelteile zerlegen muß (mit Rekursion und was so dazugehört)?
An der XML-Definition kann ich nichts ändern, ich kann nur das XSL nach meinen Wünschen gestalten.
Vielen Dank im Voraus!
cu,
Andreas
Hallo Andreas,
Gibt es ein einfacheres Verfahren, daß ich hier nicht selbst den im Attribut events enthaltenen String in Einzelteile zerlegen muß (mit Rekursion und was so dazugehört)?
In etwa:
<xsl:template match="person">
<xsl:variable name="eventids" select="@events" />
<dt><xsl:value-of select="@names"/></dt>
<dd><xsl:apply-templates select="//event[@id[contains($eventids, .)]]" /></dd>
</xsl:template>
Grüße
Thomas
Hi,
In etwa:
<xsl:template match="person">
<xsl:variable name="eventids" select="@events" />
<dt><xsl:value-of select="@names"/></dt>
<dd><xsl:apply-templates select="//event[@id[contains($eventids, .)]]" /></dd>
</xsl:template>
Genial, das funktioniert!
Dankeschön!
Also wenn ich das jetzt richtig verstehe
selektiert
//event[@id[contains($eventids, .)]]
alle event-Elemente, die ein id-Attribut haben
das wäre //event[@id]
, welches wiederum die Bedingung
contains($eventids,.)
erfüllen muß, sprich, der id-Attribut-Wert muß in der Variablen stringmäßig enthalten sein.
Wenn ich das richtig verstehe, funktioniert das in meinem Fall, weil die Ids alle mit e beginnen und danach nur Ziffern kommen.
Wäre es aber so, daß es auch ids der Form e1e2 gäbe, hätte ich wieder ein Problem, da z.B: "e3,e4,e1e2,e5" eben auch die Zeichenkette "e2" enthält, obwohl es nicht die id "e2" enthält...
Ok, zumindest für meinen Fall funktioniert es.
Nochmals Danke für die Hilfe!
cu,
Andreas
Hallo Andreas,
Wäre es aber so, daß es auch ids der Form e1e2 gäbe, hätte ich wieder ein Problem, da z.B: "e3,e4,e1e2,e5" eben auch die Zeichenkette "e2" enthält, obwohl es nicht die id "e2" enthält...
Ja und Ja.
Hier in deinem Falls war es eine 'einfache' Lösung.
Sonst gäbe es nur der Weg über die Recursion und der Zerlegung auf einzelene Werte, denn auch key() würde da leider nicht greifen.
Grüße
Thomas