SUR CETTE PAGE
Présentation des modèles SLAX
Un script SLAX se compose d’un ou plusieurs ensembles de règles appelés modèles. Chaque modèle est un segment de code qui contient des règles à appliquer lorsqu’un nœud spécifié est mis en correspondance.
La version 1.2 du langage SLAX, prise en charge dans les versions 14.2 et ultérieures de Junos OS, prend en charge les éléments SLAX comme arguments pour les modèles et les fonctions.
Il existe deux types de modèles, nommés et sans nom (ou correspondance), décrits dans les sections suivantes.
Modèles sans nom (correspondance)
Les modèles sans nom, également appelés modèles de correspondance, contiennent une match
déclaration avec une expression XPath pour spécifier les critères des nœuds sur lesquels le modèle doit être invoqué. Dans l’exemple de script de validation suivant, le modèle correspond à l’élément de niveau supérieur de la hiérarchie de configuration :
match configuration { /* ...body of the template goes here */ }
Par défaut, le processeur traverse l’ensemble de la hiérarchie des documents de manière récursive, inspectant chaque nœud et recherchant un modèle correspondant au nœud actuel. Lorsqu’un modèle correspondant est trouvé, le contenu de ce modèle est évalué.
L’instruction apply-templates
peut être utilisée dans un modèle sans nom pour limiter et contrôler la traversée hiérarchique par défaut des nœuds. Cette instruction accepte une expression XPath en option, qui est équivalente à l’attribut select
d’un <xsl:apply-templates>
élément. Si une expression XPath est incluse en option, seuls les nœuds correspondant à l’expression XPath sont traversés. Sinon, tous les enfants du nœud de contexte sont traversés. Si l’expression XPath est incluse mais ne correspond à aucun nœud, rien n’est traversé et rien ne se passe.
Dans l’exemple suivant, la règle de modèle correspond à l’élément <route>
de la hiérarchie XML. Tous les nœuds contenant un changed
attribut sont traités. Tous les route
éléments contenant un changed
attribut sont remplacés par un new
élément.
match route { <new> { apply-templates *[@changed]; } }
L’équivalent XSLT :
<xsl:template match="route"> <new> <xsl:apply-templates select="*[@changed]"/> </new> </xsl:template>
L’utilisation de modèles sans nom permet au script d’ignorer l’emplacement d’une balise dans la hiérarchie XML. Par exemple, si vous souhaitez convertir toutes les <author>
balises en <div class="author">
balises, l’utilisation de modèles vous permet d’écrire une règle unique qui convertit toutes les <author>
balises, quel que soit leur emplacement dans le document XML d’entrée.
Modèles nommés
Les modèles nommés fonctionnent comme des fonctions dans les langages de programmation traditionnels. Lorsque la complexité d’un script augmente ou qu’un segment de code apparaît à plusieurs endroits, vous pouvez modulariser le code et créer des modèles nommés. Comme les fonctions, les modèles nommés acceptent les arguments et ne s’exécutent que lorsqu’ils sont explicitement appelés.
Dans SLAX, la définition du modèle nommé se compose du template
mot-clé, du nom du modèle, d’un ensemble de paramètres et d’un bloc de code délimité par des broches. Les déclarations de paramètres peuvent être inline et se composer du nom du paramètre et, éventuellement, d’une valeur par défaut. Vous pouvez également déclarer les paramètres dans le bloc de modèle à l’aide de l’instruction param
. Si une valeur par défaut n’est pas définie, le paramètre s’applique par défaut à une chaîne vide.
L’exemple suivant crée un modèle nommé my-template
et définit trois paramètres, dont l’un par défaut pour la chaîne false
et l’un par défaut le contenu du nœud d’élément nommé name
qui est un enfant du nœud de contexte actuel. Si le script appelle le modèle et ne passe pas dans un paramètre, la valeur par défaut est utilisée.
template my-template ($a, $b = "false", $c = name) { /* ... body of the template ... */ }
Une autre méthode consiste à déclarer les paramètres dans le modèle à l’aide de l’instruction param
. Le code suivant est identique à l’exemple précédent :
template my-template { param $a; param $b = "false"; param $c = name; /* ... body of the template ... */ }
Dans SLAX, vous appelez des modèles nommés à l’aide de l’instruction call
, qui se compose du mot-clé et du call
nom du modèle, suivi d’un ensemble de liaisons de paramètres. Ces liaisons sont une liste de noms de paramètres séparés par des virgules qui sont transmises au modèle à partir de l’environnement d’appel. Les attributions de paramètres sont effectuées par nom et non par position dans la liste. Vous pouvez également déclarer les paramètres dans le call
bloc à l’aide de l’instruction with
. Les paramètres transmis dans un modèle doivent correspondre à un paramètre défini dans le modèle réel ; dans le cas contraire, le paramètre est ignoré. Vous pouvez éventuellement définir une valeur pour chaque paramètre. Si vous ne définissez pas de valeur pour le paramètre dans l’environnement d’appel, le script transmet la valeur actuelle du paramètre s’il a été initialisé précédemment, ou il génère une erreur si le paramètre n’a jamais été déclaré. Pour plus d’informations sur la transmission des paramètres, consultez la présentation des paramètres SLAX.
Dans l’exemple suivant, le modèle my-template
est appelé avec le paramètre c
contenant le contenu du nœud d’élément nommé other-name
qui est un enfant du nœud de contexte actuel :
call my-template { with $c = other-name; }
Dans l’exemple suivant, la name-servers-template
déclaration de deux paramètres : name-servers
et size
. Le size
paramètre reçoit une valeur par défaut de zéro. Le modèle de correspondance, qui déclare et initialise name-servers
, appelle les name-servers-template
trois fois.
Le premier appel au modèle n’inclut aucun paramètre. Ainsi, name-servers
par défaut, une chaîne vide et size
une valeur de zéro définie dans le modèle. Le deuxième appel inclut les name-servers
paramètres et size
, mais ne fournit qu’une valeur pour le size
paramètre. Ainsi name-servers
, la valeur définie par son initialisation dans le script size
est égale au nombre d’éléments dans la hiérarchie de name-servers
configuration. Le dernier appel est identique au deuxième appel, mais il fournit les paramètres à l’aide de la syntaxe de l’instruction with
.
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; }
L’équivalent XSLT est :
<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>