2010-06-27 16 views
46

Ich lerne gerade XML und wie man XSL-Dateien verwendet. In einer XSL-Datei fand ich den folgenden Ausdruck:XSL xsl: Vorlage match = "/"

xsl:template match="/" 

Was für diesen Stand tut? Und was könnte ich anstelle der / verwenden? Könnte ich table oder ein anderes HTML-Tag anstelle von / schreiben?

Antwort

7

Das Übereinstimmungsattribut gibt an, auf welche Teile die Template-Transformation angewendet wird. In diesem speziellen Fall bedeutet "/" die Wurzel des XML-Dokuments. Der Wert, den Sie dem Übereinstimmungsattribut angeben müssen, sollte ein XPath-Ausdruck sein. XPath ist die Sprache, die Sie verwenden müssen, um bestimmte Teile der Ziel-XML-Datei zu verweisen.

Um ein sinnvolles Verständnis darüber zu erhalten, was Sie sonst noch in das Attribut match eingeben können, müssen Sie verstehen, was xpath ist und wie es verwendet wird. Ich schlage vor, dass Sie sich die Links ansehen, die ich am Ende der Antwort für Sie bereitgestellt habe.

Konnte ich "Tabelle" oder irgendein anderes HTML-Tag anstelle von "/" schreiben?

Ja, Sie können. Aber das hängt davon ab, was genau Sie tun wollen. Wenn Ihre Ziel-XML-Datei HMTL-Elemente enthält und Sie diese xsl: template anwenden, ist es sinnvoll, table, div oder anything else zu verwenden.

Hier ein paar Links:

+2

Diese Antwort ist eigentlich nicht korrekt. Nicht jeder XPath-Ausdruck kann als legales Übereinstimmungsmuster angegeben werden. –

+1

Ich stimme zu, aber meiner Meinung nach ist es für einen Anfänger besser, das Matchmuster zu betrachten, wie es mit XPath definiert ist. – Koynov

108

Der Wert des match Attributs der <xsl:template> Anweisung muss ein Spielmuster.

Übereinstimmungsmuster bilden eine Teilmenge der Menge aller möglichen XPath-Ausdrücke. Die erste, natürliche Einschränkung besteht darin, dass ein Übereinstimmungsmuster eine Gruppe von Knoten auswählen muss. Es gibt auch andere Einschränkungen. Insbesondere sind umgekehrte Achsen in den Lokationsschritten nicht erlaubt (können aber innerhalb der Prädikate angegeben werden). Außerdem sind in XSLT 1.0 keine Variablen- oder Parameterverweise zulässig, diese sind jedoch in XSLT 2.x zulässig.

/ in XPath bezeichnet die Wurzel oder Dokumentknoten. In XPath 2.0 (und damit XSLT 2.x) kann dies auch als document-node() geschrieben werden.

Ein Übereinstimmungsmuster kann die // abbreviation enthalten.

Beispiele für Spiel-Muster:

<xsl:template match="table"> 

kann auf jedem Element table genannt angewandt werden.

<xsl:template match="x/y"> 

kann auf jedem Element y deren Mutter genannt angewandt werden soll, ein Element namens x.

<xsl:template match="*"> 

kann auf jedes Element angewendet werden.

<xsl:template match="/*"> 

kann nur auf das oberste Element eines XML-Dokuments angewendet werden.

<xsl:template match="@*"> 

kann auf jedes Attribut angewendet werden.

<xsl:template match="text()"> 

kann auf jeden Textknoten angewendet werden.

<xsl:template match="comment()"> 

kann auf einen Kommentarknoten angewendet werden.

<xsl:template match="processing-instruction()"> 

kann auf jeden Verarbeitungsanweisungsknoten angewendet werden.

kann auf jeden Knoten angewendet werden: Element, Text, Kommentar oder Verarbeitungsanweisung.

+0

Das war hilfreich zu wissen und wird selten in anderen Quellen erwähnt: "Ein Knoten entspricht einem Muster, wenn der Knoten ein Mitglied des Ergebnisses der Bewertung des Musters als Ausdruck in Bezug auf einen möglichen Kontext ist; die möglichen Kontexte sind solche, deren Kontext Knoten ist der Knoten, der gefunden wird oder einer seiner Vorfahren. " (https://www.w3.org/TR/xslt#patterns) –

+0

@NiklasPeter, Ja, hier erklärt die Spezifikation ein wenig, wie XPath-Ausdrücke ausgewertet werden - also müssen wir erwähnen, dass jeder XSLT-Programmierer erwartet wird XPath kennen? Ich denke, dass sich diese Voraussetzung jeder sehr bewusst ist. –

+0

Der Grund, warum ich dieses Zitat hinzugefügt habe, ist der letzte Teil davon: "Die möglichen Kontexte sind diejenigen, deren Kontextknoten der Knoten ist, der gefunden wird oder einer seiner Vorfahren."Ich denke, alle Ahnen-Knoten zu testen ist spezifisch für XSLT und keine Tatsache, die nicht jeder, der mit XPath vertraut ist, kennt. –

34

Es ist erwähnenswert, da es für Leute, die neu in XML sind, verwirrend ist, dass der Stamm (oder Dokumentknoten) eines XML-Dokuments nicht das oberste Element ist. Es ist das übergeordnete Element des obersten Elements. Dies ist verwirrend, da es nicht so aussieht, als ob das Top-Level-Element ein Elternelement haben könnte. Ist es nicht die oberste Ebene?

Aber dies betrachten, ein wohlgeformtes XML-Dokument:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?> 
<!-- Comments and processing instructions are XML nodes too, remember. --> 
<TopLevelElement/> 

Die Wurzel dieses Dokuments hat drei Kinder: eine Verarbeitungsanweisung, ein Kommentar und ein Element.

So zum Beispiel, wenn Sie eine Transformation, die losgeworden dieses Kommentars, ließ aber in allen möglichen Anmerkungen erscheinen anderswo im Dokument schreiben wollen, dann würden Sie diese auf die Identität verwandeln hinzufügen:

<xsl:template match="/comment()"/> 

Noch einfacher (und häufiger nützlich), hier ist ein XPath-Muster, das mit dem Element der obersten Ebene des Dokuments unabhängig von seinem Namen übereinstimmt: /*.

+3

Ich habe einen guten Teil dieses Morgens damit verbracht, völlig verwirrt zu sein von diesem Dokument/Wurzelelement Dichotomie. Ich benutze seit Jahren XML und das DOM, stolpere aber immer noch über solche Dinge! –

+1

Vielen Dank, dass Sie mich zu dieser subtilen aber elementaren Unterscheidung, die ich zu lange nicht bemerkt habe, hereingelassen haben! :) – Chris