Für ein Stylesheet, das ich schreibe (eigentlich für einen Satz von ihnen, die jeweils ein anderes Ausgabeformat erzeugen), muss ich auswerten, ob ein bestimmter Wert in einer Werteliste vorhanden ist. In diesem Fall wird der getestete Wert aus dem Attribut eines Elements genommen. Die Liste, gegen die getestet werden soll, stammt aus dem Aufruf des Stylesheets und wird als oberste Ebene <xsl:param>
verwendet (wird in der Befehlszeile angegeben, wenn ich xsltproc
oder einen sächsischen äquivalenten Aufruf aufrufen). Zum Beispiel kann der Eingabewert sein:Element-in-List-Test
v0_01,v0_10,v0_99
während die Attributwerte jeweils sehr ähnlich wie ein solchen Wert zu suchen. (Ob ein Komma zum Trennen von Werten oder ein Leerzeichen verwendet wird, ist nicht wichtig - ich habe jetzt ein Komma gewählt, weil ich den Wert über den Befehlszeilenschalter an xsltproc
übergeben möchte und für ein Leerzeichen das Argument angeben müsste. und ich bin faul - genug, um nicht die zusätzlichen zwei Zeichen einzugeben.)
Was ich suche ist etwas ähnlich wie Perls grep
, wobei ich sehen kann, ob der Wert, den ich derzeit habe, in der Liste enthalten ist. Es kann mit Sub-String-Tests durchgeführt werden, aber dies müsste clever sein, um kein falsch-positives Ergebnis zu erhalten (v0_01
sollte nicht mit einem String übereinstimmen, der v0_011
enthält). Es scheint, dass der einzige nicht-skalare Datentyp, den XSL/XSLT unterstützt, ein Knotensatz ist. Ich nehme an, dass es möglich ist, die Liste in eine Reihe von Textknoten zu konvertieren, aber das scheint wie ein Über-Kill zu sein, sogar im Vergleich zu einem Unterstring-Test mit zusätzlichen Grenzen, um falsche Übereinstimmungen zu vermeiden.
Eigentlich enthalten ist, für meine Zwecke, es sieht so aus, als würde die "contains" -Funktion funktionieren (mit dem von Ihnen vorgeschlagenen Padding). Was mich auf die Palme brachte, war, dass ich nach dieser Funktionalität in XSLT selbst suchte, als ich in XPath hätte suchen sollen. – rjray
Die contains() Funktion hinzugefügt, die mir entgangen ist. Vielen Dank. :-) – Tomalak
@Tomalak: Der Ausdruck substring-before() wird zu '' ausgewertet, auch wenn der Wert in der Liste enthalten ist (wenn es der erste Wert ist). Entsprechend wird der Ausdruck substring-after() zu '' ausgewertet, wenn der Wert der letzte in der Liste ist. Daher ist nur der Ausdruck contains() korrekt –