Es kommt oft vor, daß Daten auf verschieden XML Dateien verstreut sind. Bestullungen hier, Kundedaten da. Desöfteren höre ich dann die Frage, wie man in einer XSL mit zwei XML Dateien arbeiten kann. Denken wir daran, daß beispw. die XSL Datei aus einer XML Datei aufgerufen wird.
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="bestell.xsl"?> |
Dann ist es gut zu wissen, daß eine einfache Methode gibt, um 2 XML Daten für eine Abfrage zu kombinieren.
Es geht einfacher als Sie glauben. Das Stichwort heißt hier <xsl:variable>. Wir weisen zu Beginn des XSL FIles ein anderes XML File als Varable hinzu.
Fertig? Variablen? Eigentlich schon...
Bereits in einem früheren Artikel http://www.developer-training.de/news.asp?artnr=461 habe ich auf die Möglichkeiten mit Variablen beschrieben. Neu ist heute, daß sie einer Variablen um ein weiteres XML Dokument zuweisen.
Unser Beispiel soll folgendes machen. Wir habe eine Bestelliste im XML Format mit Kunden IDs und eine XML Datei mit Kundendaten.
Kunden mit XSL-Verweis
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="members.xsl"?> <root> <members> <name kdid="1">Tobi Terror</name> </members> <members> <name kdid="3">Berny Sesam</name> </members> <members> <name kdid="2">Wolle Knolle</name> </members> </root> |
Die Bestellungen dazu:
<?xml version="1.0" encoding="UTF-8"?> <root> <order kdid="1"> <art>70</art> <art>44</art> <art>234</art> </order> <order kdid="2"> <art>73</art> <art>45</art> <art>2323</art> </order> <order kdid="3"> <art>72</art> <art>46</art> <art>2323</art> </order> </root> |
Nun passen wir unsere XSL Datei an, um mit beiden XML Dateien arbeiten zu können. Durch den
<xsl:variable name="Texts" select="document('mitglieder.xml')"/> |
Tag belegen wir die Varable mit unserem 2-ten XML Dokument- unseren Kundendaten.
Nun wollen wir beispielsweise alle Namen von Kundenhaben, die auch in einer Bestelliste vorkommen. Mit Hilfe einer for each Anweisung und einem geeigneten pattern finden wir alle übereinstimmenden Namen.
< TD> <xsl:for-eachselect="(//members[name/@id=$Texts//Bestellung/@id])">
Unsere gesamte XSL Datei:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:variable name="Texts" select="document('mitglieder.xml')"/> <xsl:template match="/"> <html><body>< BR> <table><BR> <xsl:for-eachselect="(//members[name/@kdid=$Texts//order/@kdid])"> <tr> <td bgcolor="red"><xsl:value-of select="name"/></td> </tr> </xsl:for-each> </table> </body></html> </xsl:template> </xsl:stylesheet> |
Ergebnis:
Tobi Terror |
Berny Sesam |
Wolle Knolle |
Viel Spaß damit!