Vue d’ensemble des paramètres SLAX
Les paramètres peuvent être passés à des modèles nommés ou non nommés ou à des fonctions. Après avoir déclaré un paramètre, vous pouvez le référencer en préfixant le nom du paramètre par le signe dollar ($).
Déclaration de paramètres
Dans les scripts SLAX, vous déclarez les paramètres à l’aide de l’instruction param
. Si vous le souhaitez, vous pouvez définir une valeur initiale pour chaque paramètre de la déclaration. Par exemple:
param $dot = .;
La portée d’un paramètre peut être locale ou globale. Les paramètres locaux doivent être déclarés au début d’un bloc et leur portée est limitée au bloc dans lequel ils sont déclarés. Un paramètre dont la valeur est définie par Junos OS lors de l’initialisation du script doit être défini en tant que paramètre global. Les déclarations de paramètres globaux sont placées juste après les déclarations de feuille de style. Un script peut affecter une valeur par défaut au paramètre global, qui est utilisée dans le cas où Junos OS ne donne pas de valeur au paramètre.
version 1.2; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; ns ext = "http://xmlsoft.org/XSLT/namespace"; /* global parameter */ param $interface1 = "fxp0";
Dans un modèle, vous déclarez les paramètres soit dans une liste de paramètres, soit à l’aide de l’instruction param
dans le bloc de modèle. Si vous le souhaitez, vous pouvez déclarer des valeurs par défaut pour chaque paramètre de modèle. Si un modèle est appelé sans le paramètre, le paramètre utilise la valeur par défaut. Si vous ne définissez pas de valeur par défaut dans le modèle, la valeur par défaut du paramètre est une chaîne vide.
Le modèle print-host-name
nommé suivant déclare le paramètre message
et définit une valeur par défaut :
template print-host-name ($message = "host name: " _ system/host-name) { <xnm:warning> { <message> $message; } }
Une déclaration alternative, mais équivalente, est la suivante :
template print-host-name () { param $message = "host name: " _ system/host-name; <xnm:warning> { <message> $message; } }
Dans le modèle SLAX, vous faites précéder le paramètre du signe dollar ($) lorsque vous déclarez le paramètre et lorsque vous accédez à sa valeur. Dans XSLT, vous préfixez le nom du paramètre avec le signe dollar lorsque vous y accédez, mais pas lorsque vous le déclarez.
Dans une fonction, vous déclarez des paramètres soit dans une liste de paramètres, soit à l’aide de l’instruction param
dans le bloc fonction. Si vous le souhaitez, vous pouvez déclarer des valeurs par défaut pour les paramètres de fin. Si vous appelez une fonction sans ce paramètre de fin, le paramètre utilise la valeur par défaut. Si vous ne définissez pas de valeur par défaut, la valeur par défaut du paramètre est une chaîne vide.
L’exemple suivant définit une fonction nommée size
, qui a trois paramètres : width
, height
, et scale
. La valeur par défaut de scale
est 1. Si la liste d'arguments de l'appel de fonction n'inclut pas l' scale
argument, le calcul utilise la valeur par défaut de 1 pour cet argument. La valeur de retour de la fonction est le produit des width
variables , height
, et scale
enfermées dans un <size>
élément.
function my:size ($width, $height, $scale = 1) { result <size> { expr $width * $height * $scale; } }
Une déclaration alternative, mais équivalente, qui utilise l’instruction param
, est :
function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } }
Passage de paramètres à des modèles
Lorsque vous appelez un modèle, vous passez des arguments dans le modèle, soit dans une liste d’arguments, soit à l’aide de l’instruction with
. Le nom du paramètre fourni dans l’environnement appelant doit correspondre au nom d’un paramètre défini dans le modèle réel. Dans le cas contraire, le paramètre est ignoré. Si vous le souhaitez, pour chaque paramètre que vous transmettez à un modèle, vous pouvez définir une valeur à l’aide d’un signe égal (=) et d’une expression de valeur. Dans l’exemple suivant, les deux appels au modèle print-host-name
nommé sont identiques :
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); } match configuration { call print-host-name() { with $message = "passing in host name: " _ system/host-name; } }
La valeur du paramètre utilisé dans un modèle dépend de la façon dont le modèle est appelé. Les trois exemples suivants, qui appellent le print-host-name
modèle, illustrent les environnements appelants possibles.
Si vous appelez un modèle, mais que vous n’incluez pas de paramètre spécifique, le paramètre utilise la valeur par défaut définie dans le modèle pour ce paramètre. S’il n’y a pas de valeur par défaut pour ce paramètre dans le modèle, la valeur par défaut du paramètre est une chaîne vide. L’exemple suivant appelle le modèle print-host-name
nommé, mais n’inclut aucun paramètre dans l’appel. Dans ce cas, le modèle nommé utilisera la valeur par défaut du message
paramètre qui a été défini dans le print-host-name
modèle, ou une chaîne vide s’il n’existe pas de valeur par défaut.
match configuration { call print-host-name(); }
Si vous appelez un modèle et incluez un paramètre, mais que vous ne définissez pas de valeur pour le paramètre dans l’environnement appelant, le script transmet la valeur courante du paramètre, si elle a été précédemment initialisée. Si le paramètre n’a jamais été déclaré, le script génère une erreur.
L’exemple suivant appelle le modèle print-host-name
nommé et transmet le paramètre, mais n’inclut pas de message
valeur. Si le script déclare et initialise message
, et que la portée est visible par le bloc, le modèle utilise la valeur courante de message
. Si le script déclare message
mais n’initialise pas le paramètre, la valeur de message
est une chaîne vide. Si le script ne déclare message
pas, l’appel génère une erreur.
match configuration { call print-host-name($message); /* If $message was initialized previously, the current value is used; * If $message was declared but not initialized, an empty string is used; * If $message was never declared, the call generates an error. */ }
Si vous appelez un modèle, incluez le paramètre et définissez une valeur pour le paramètre, le modèle utilise la valeur fournie. L’exemple suivant appelle le modèle print-host-name
nommé avec le paramètre et une message
valeur définie, de sorte que le modèle utilise la nouvelle valeur :
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); }
Exemple : Paramètres et modèles de correspondance
L’exemple suivant correspond à l’élément hiérarchique de niveau configuration
supérieur, puis demande au processus de gestion de Junos OS (mgd) d’appliquer récursivement des modèles à la system/host-name
sous-arborescence. Les paramètres message
et domain
sont utilisés dans le traitement de tous les noeuds correspondants.
match configuration { var $domain = domain-name; apply-templates system/host-name { with $message = "Invalid host-name"; with $domain; } } match host-name { param $message = "Error"; param $domain; <hello> $message _ ":: " _ . _ " (" _ $domain _ ")"; }
L’équivalent XSLT est :
<xsl:template match="configuration"> <xsl:apply-templates select="system/host-name"> <xsl:with-param name="message" select="'Invalid host-name'"/> <xsl:with-param name="domain" select="$domain"/> </xsl:apply-templates> </xsl:template> <xsl:template match="host-name"> <xsl:param name="message" select="'Error'"/> <xsl:param name="domain"/> <hello> <xsl:value-of select="concat($message, ':: ', ., ' (', $domain, ')')"/> </hello> </xsl:template>
Passage de paramètres à des fonctions
SLAX prend en charge des fonctions à partir de la version 1.1 de SLAX. Bien que vous puissiez utiliser l’instruction pour définir des param
paramètres de fonction, vous ne pouvez pas l’utiliser with
pour transmettre des valeurs de paramètre à la fonction à partir de l’environnement appelant. Lorsque vous appelez une fonction, vous lui transmettez des arguments dans une liste séparée par des virgules. Les arguments de fonction sont passés à la fonction par position plutôt que par nom comme dans un modèle.
Une déclaration de fonction peut définir des valeurs par défaut pour les arguments de fin. S’il y a moins d’arguments dans l’appel de fonction que dans la définition, les valeurs par défaut sont utilisées pour tous les arguments de fin. S’il y a plus d’arguments dans l’appel de la fonction que dans la définition, l’appel de la fonction génère une erreur.
Dans le modèle de correspondance suivant, l’appel de fonction utilise les données de largeur et de hauteur sélectionnées à partir de chaque graphic/dimension
élément du fichier XML source. Le script évalue la fonction, et l’instruction copy-of
émet la valeur de retour à l’arborescence des résultats en tant que contenu de l’élément <out>
. L’appel de fonction inclut des arguments pour width
et , height
mais pas pour scale
. La valeur par défaut de 1 est utilisée dans scale
le bloc fonction.
version 1.2; ns my = "http://www.example.com/myfunctions"; function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } } match / { for-each (graphic/dimension) { <out> { copy-of my:size((width/.), (height/.)); } } }