Hi,
Ich verwende in einem xml für einige Elemente (namens event) das id-Attribut (ok, nix ungewöhnliches hier).
Für andere Elemente (namens participant) benutze ich ein Attribut vom Typ IDREFS, das dann eine Liste von id-Werten enthält.
Damit hab ich eine 1:n-Beziehung vom participant zu den events hergestellt.
Bei der XSL-Transformation will ich jetzt zu einem der Elemente mit IDREFS-Attribut alle referenzierten Elemente auflisten.
Bisher mach ich das so:
<data>
<events>
<event id="e01" name="bla"/>
<event id="e02" name="blubb"/>
<event id="e03" name="laber"/>
</events>
<participants>
<participant events="e01,e03" name="Alpha"/>
<participant events="e02" name="Bravo"/>
<participant events="e02,e03" name="Charlie"/>
</participants>
</data>
<xsl:template match="participant">
<xsl:variable name="eventids" select="@eventrefs"/>
<xsl:apply-templates select="//event[contains($eventids, @id)]"/>
</xsl:template>
event sind die Elemente, die die id-Attribute enthalten.
eventrefs ist das IDREFS Attribut.
3 Fragen dazu:
1.) geht das auch ohne Variable eventids?
Wenn ich <xsl:apply-templates select="//event[contains(./@eventrefs, @id)]"/> schreibe, bezieht sich das ./eventrefs doch auf das event, nicht auf den participant - oder täusche ich mich da?
2.) Gibt es eine fertige Funktion, die mir die Anzahl der ids in einem idref liefert?
3.) die wichtigste Frage: im Moment hab ich das so gelöst, daß die id-Werte mit einem Buchstaben beginnen und mit einer festen Anzahl von Ziffern aufhören.
Damit funktioniert die contains-Abfrage. Ok, damit kann ich in diesem Fall leben.
Aber: gibt es eine Funktion, die mir für beliebige id-Werte und ein idref-Attribut true oder false zurückliefert, je nachdem, ob die id nicht nur im Sinne der String-contains, sondern als echte ID im idrefs steckt?
Denn wenn ich die id-Werte ohne führende Nullen machen würde, also e1, e2, ... e10, e11, ... würde ja e1 mit contains auch gefunden werden, wenn das idrefs-Attribut "e10,e20" wäre.
Falls das eine Rolle spielt: ich verwende msxml 4.0 SDK und das msxsl-Commandline-Tool (gibt es was besseres nicht-Java-basiertes? Java braucht bei mir immer viel zu lange, um die VM zu starten)
Vielen Dank im Voraus
cu,
Andreas
MudGuard? Siehe http://www.Mud-Guard.de/
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.