Hallom Andreas,
Für andere Elemente (namens participant) benutze ich ein Attribut vom Typ IDREFS, das dann eine Liste von id-Werten enthält.
Ein als IDREFS deklariertes Attribut muss eine duch _Leerzeichen_ getrennte Liste von IDs enthalten. So ist dein events-Attribute kein gültiger IDREFS Typ.
Bei der XSL-Transformation will ich jetzt zu einem der Elemente mit IDREFS-Attribut alle referenzierten Elemente auflisten.
3 Fragen dazu:
1.) geht das auch ohne Variable eventids?
Ja, aber nur wenn du auch eine DTD hast wo zumindest das Attribut id als Typ ID deklariert ist (events muss du dann nicht unbedingt als Typ IDREFS deklarieren).
Dann geht es z.B. so:
<xsl:template match="participant">
<xsl:apply-templates select="id(@events)" />
</xsl:template>
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?
Ja, Bezug wird hier auf das <event>-Element selbst genommen.
2.) Gibt es eine fertige Funktion, die mir die Anzahl der ids in einem idref liefert?
Ja. id() behandelt eine durch Leerzeichen getrennte Liste von IDs auf einmal. Also sie findet Knoten deren ID in der Liste vorkommt.
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?
Siehe oben.
Voraussetzung ist aber wirkich, dass dein XML valide ist (sprich DTD!)
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.
Ja.
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)
Vielleicht http://www.elcel.com/products/xmlvalid.html oder http://xml.apache.org/xerces-c/index.html
sonst http://www.xmlsoftware.com/parsers.html
Grüße
Thomas