AUF DIESER SEITE
Übersicht über SLAX-Vorlagen
Ein SLAX-Skript besteht aus einem oder mehreren Regelsätzen, die als Vorlagen bezeichnet werden. Jede Vorlage ist ein Codesegment, das Regeln enthält, die angewendet werden sollen, wenn ein bestimmter Knoten übereinstimmt.
Version 1.2 der SLAX-Sprache, die in Junos OS Version 14.2 und höheren Versionen unterstützt wird, unterstützt SLAX-Elemente als Argumente für Vorlagen und Funktionen.
Es gibt zwei Arten von Vorlagen, benannte und unbenannte (oder Übereinstimmungen), die in den folgenden Abschnitten beschrieben werden.
Unbenannte (Übereinstimmungs-)Vorlagen
Unbenannte Vorlagen, auch als Übereinstimmungsvorlagen bezeichnet, enthalten eine match
Anweisung mit einem XPath-Ausdruck , um die Kriterien für Nodes anzugeben, auf denen die Vorlage aufgerufen werden soll. Im folgenden Commitskriptbeispiel stimmt die Vorlage mit dem Element der obersten Ebene in der Konfigurationshierarchie überein:
match configuration { /* ...body of the template goes here */ }
Standardmäßig durchläuft der Prozessor rekursiv die gesamte Dokumenthierarchie, überprüft jeden Knoten und sucht nach einer Vorlage, die mit dem aktuellen Knoten übereinstimmt. Wenn eine passende Vorlage gefunden wird, wird der Inhalt dieser Vorlage ausgewertet.
Die apply-templates
Anweisung kann innerhalb einer unbenannten Vorlage verwendet werden, um das standardmäßige, hierarchische Durchlaufen von Knoten einzuschränken und zu steuern. Diese Anweisung akzeptiert einen optionalen XPath-Ausdruck, der dem select
Attribut in einem <xsl:apply-templates>
Element entspricht. Wenn ein optionaler XPath-Ausdruck enthalten ist, werden nur Nodes durchlaufen, die dem XPath-Ausdruck entsprechen. Andernfalls werden alle untergeordneten Elemente des Kontextknotens durchlaufen. Wenn der XPath-Ausdruck enthalten ist, aber mit keinem Knoten übereinstimmt, wird nichts durchlaufen und es passiert nichts.
Im folgenden Beispiel stimmt die Vorlagenregel mit dem <route>
Element in der XML-Hierarchie überein. Alle Knoten, die ein changed
Attribut enthalten, werden verarbeitet. Alle route
Elemente, die ein Attribut enthalten, werden durch ein changed
new
Element ersetzt.
match route { <new> { apply-templates *[@changed]; } }
Das XSLT-Äquivalent:
<xsl:template match="route"> <new> <xsl:apply-templates select="*[@changed]"/> </new> </xsl:template>
Durch die Verwendung unbenannter Vorlagen kann das Skript die Position eines Tags in der XML-Hierarchie ignorieren. Wenn Sie z. B. alle Tags in <div class="author">
Tags konvertieren möchten, können Sie mithilfe von Vorlagen eine einzelne Regel schreiben, die alle <author>
<author>
Tags unabhängig von ihrer Position im XML-Eingabedokument konvertiert.
Benannte Vorlagen
Benannte Vorlagen funktionieren wie Funktionen in herkömmlichen Programmiersprachen. Wenn die Komplexität eines Skripts zunimmt oder ein Codesegment an mehreren Stellen angezeigt wird, können Sie den Code modularisieren und benannte Vorlagen erstellen. Wie Funktionen akzeptieren benannte Vorlagen Argumente und werden nur ausgeführt, wenn sie explizit aufgerufen werden.
In SLAX besteht die benannte Vorlagendefinition aus dem Schlüsselwort, dem template
Vorlagennamen, einem Satz von Parametern und einem durch geschweifte Klammern getrennten Codeblock. Parameterdeklarationen können inline sein und aus dem Parameternamen und optional einem Standardwert bestehen. Alternativ können Sie Parameter innerhalb des Vorlagenblocks mit der param
Anweisung deklarieren. Wenn kein Standardwert definiert ist, wird der Parameter standardmäßig als leere Zeichenfolge verwendet.
Im folgenden Beispiel wird eine Vorlage mit dem Namen und der Definition von drei Parametern erstellt, von denen einer standardmäßig die Zeichenfolge false
und einer standardmäßig den Inhalt des Elementknotens namens name
enthält, der dem my-template
aktuellen Kontextknoten untergeordnet ist. Wenn das Skript die Vorlage aufruft und keinen Parameter übergibt, wird der Standardwert verwendet.
template my-template ($a, $b = "false", $c = name) { /* ... body of the template ... */ }
Eine alternative Methode besteht darin, die Parameter innerhalb der Vorlage mithilfe der param
Anweisung zu deklarieren. Der folgende Code ist identisch mit dem vorherigen Beispiel:
template my-template { param $a; param $b = "false"; param $c = name; /* ... body of the template ... */ }
In SLAX rufen Sie benannte Vorlagen mithilfe der call
Anweisung auf, die aus dem Schlüsselwort und dem call
Vorlagennamen besteht, gefolgt von einer Reihe von Parameterbindungen. Bei diesen Bindungen handelt es sich um eine durch Trennzeichen getrennte Liste von Parameternamen, die aus der aufrufenden Umgebung an die Vorlage übergeben werden. Die Parametrierung erfolgt nach Namen und nicht nach Position in der Liste. Alternativ können Sie Parameter innerhalb des call
Blocks mit der with
Anweisung deklarieren. Parameter, die an eine Vorlage übergeben werden, müssen mit einem Parameter übereinstimmen, der in der tatsächlichen Vorlage definiert ist. Andernfalls wird der Parameter ignoriert. Optional können Sie für jeden Parameter einen Wert festlegen. Wenn Sie in der aufrufenden Umgebung keinen Wert für den Parameter definieren, übergibt das Skript den aktuellen Wert des Parameters, wenn er zuvor initialisiert wurde, oder es generiert einen Fehler, wenn der Parameter nie deklariert wurde. Weitere Informationen zum Übergeben von Parametern finden Sie unter Übersicht über SLAX-Parameter.
Im folgenden Beispiel wird die Vorlage my-template
mit dem Parameter c
aufgerufen, der den Inhalt des Elementknotens namens other-name
enthält, der ein untergeordnetes Element des aktuellen Kontextknotens ist:
call my-template { with $c = other-name; }
Im folgenden Beispiel werden zwei Parameter deklariert: name-servers-template
name-servers
und size
. Der size
Parameter erhält den Standardwert Null. Die Übereinstimmungsvorlage, die deklariert und initialisiert name-servers
, ruft die name-servers-template
drei Male auf.
Der erste Aufruf der Vorlage enthält keine Parameter. Daher name-servers
wird standardmäßig eine leere Zeichenfolge und size
standardmäßig ein Wert von Null verwendet, wie in der Vorlage definiert. Der zweite Aufruf enthält die name-servers
Parameter and size
, liefert jedoch nur einen Wert für den size
Parameter. Somit name-servers
hat der Wert durch seine Initialisierung im Skript definiert und size
ist gleich der Anzahl der Elemente in der name-servers
Konfigurationshierarchie. Der letzte Aufruf ist identisch mit dem zweiten Aufruf, liefert jedoch die Parameter mithilfe der with
Anweisungssyntax.
match configuration { param $name-servers = name-servers/name; call name-servers-template(); call name-servers-template($name-servers, $size = count($name-servers)); call name-servers-template() { with $name-servers; with $size = count($name-servers); } } template name-servers-template($name-servers, $size = 0) { <output> "template called with size " _ $size; }
Das XSLT-Äquivalent lautet:
<xsl:template match="configuration"> <xsl:variable name="name-servers" select="name-servers/name"/> <xsl:call-template name="name-servers-template"/> <xsl:call-template name="name-servers-template"> <xsl:with-param name="name-servers" select="$name-servers"/> <xsl:with-param name="size" select="count($name-servers)"/> </xsl:call-template> <xsl:call-template name="name-servers-template"> <xsl:with-param name="name-servers" select="$name-servers"/> <xsl:with-param name="size" select="count($name-servers)"/> </xsl:call-template> </xsl:template> <xsl:template name="name-servers-template"> <xsl:param name="name-servers"/> <xsl:param name="size" select="0"/> <output> <xsl:value-of select="concat('template called with size ', $size)"/> </output> </xsl:template>