SLAX 매개 변수 개요
매개 변수는 명명되거나 명명되지 않은 템플릿 또는 함수에 전달될 수 있습니다. 매개 변수를 선언한 후 매개 변수 이름 앞에 달러 기호($)를 붙여 참조할 수 있습니다.
매개 변수 선언
SLAX 스크립트에서 명령문을 사용하여 매개 변수를 선언합니다 param
. 필요에 따라 선언의 각 매개 변수에 대한 초기 값을 정의할 수 있습니다. 예를 들어:
param $dot = .;
매개 변수의 범위는 로컬 또는 전역일 수 있습니다. 지역 매개 변수는 블록의 시작 부분에 선언되어야 하며 해당 범위는 선언된 블록으로 제한됩니다. 스크립트 초기화 시 Junos OS에 의해 값이 설정되는 매개 변수는 전역 매개 변수로 정의해야 합니다. 전역 매개 변수 선언은 스타일시트 선언 바로 뒤에 배치됩니다. 스크립트는 전역 매개 변수에 기본값을 할당할 수 있으며, 이는 Junos OS가 매개 변수에 값을 제공하지 않는 경우에 사용됩니다.
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";
템플릿에서는 매개 변수 목록에서 또는 template 블록의 문을 사용하여 param
매개 변수를 선언합니다. 필요에 따라 각 템플릿 매개 변수에 대한 기본값을 선언할 수 있습니다. 매개 변수 없이 템플릿을 호출하면 매개 변수는 기본값을 사용합니다. 템플릿에서 기본값을 정의하지 않으면 매개 변수는 기본적으로 빈 문자열로 설정됩니다.
다음과 같은 명명된 템플릿 print-host-name
은 매개 변수를 message
선언하고 기본값을 정의합니다.
template print-host-name ($message = "host name: " _ system/host-name) { <xnm:warning> { <message> $message; } }
대안적이지만 동등한 선언은 다음과 같습니다.
template print-host-name () { param $message = "host name: " _ system/host-name; <xnm:warning> { <message> $message; } }
SLAX 템플릿에서는 매개 변수를 선언하고 해당 값에 액세스할 때 매개 변수 앞에 달러 기호($)를 붙입니다. XSLT에서는 매개 변수 이름에 액세스할 때 달러 기호를 접두사로 붙이지만 선언할 때는 그렇지 않습니다.
함수에서는 매개 변수 목록에서 또는 함수 블록의 param
문을 사용하여 매개 변수를 선언합니다. 선택적으로 후행 매개 변수에 대한 기본값을 선언할 수 있습니다. 후행 파라미터 없이 함수를 호출하면 파라미터는 기본값을 사용합니다. 기본값을 정의하지 않으면 매개 변수 값은 기본적으로 빈 문자열로 설정됩니다.
다음 예제에서는 , , 및 라는 세 개의 매개 변수가 width
height
scale
있는 라는 함수를 size
정의합니다. 에 대한 scale
기본값은 1입니다. 함수 호출의 인수 목록에 인수가 scale
포함되지 않은 경우 계산은 해당 인수에 대해 기본값 1을 사용합니다. 함수의 반환 값은 요소에 포함된 , height
, 변수 scale
의 width
곱입니다<size>
.
function my:size ($width, $height, $scale = 1) { result <size> { expr $width * $height * $scale; } }
명령문을 사용하는 대안적이지만 동등한 선언은 param
다음과 같습니다.
function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } }
템플릿에 매개 변수 전달
템플릿을 호출할 때는 인수 목록에서 또는 문을 사용하여 with
템플릿에 인수를 전달합니다. 호출 환경에 제공된 매개 변수의 이름은 실제 템플릿에 정의된 매개 변수의 이름과 일치해야 합니다. 그렇지 않으면 매개 변수가 무시됩니다. 선택적으로, 템플릿에 전달하는 각 매개 변수에 대해 등호(=)와 값 표현식을 사용하여 값을 정의할 수 있습니다. 다음 예제에서는 명명된 템플릿 print-host-name
에 대한 두 호출이 동일합니다.
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; } }
템플릿에서 사용되는 매개 변수 값은 템플릿이 호출되는 방식에 따라 달라집니다. 템플릿을 호출 print-host-name
하는 다음 세 가지 예는 가능한 호출 환경을 보여 줍니다.
템플릿을 호출하지만 특정 매개 변수를 포함하지 않는 경우 매개 변수는 해당 매개 변수에 대해 템플릿에 정의된 기본값을 사용합니다. 템플릿에 해당 매개 변수에 대한 기본값이 없는 경우 매개 변수 값은 기본적으로 빈 문자열로 설정됩니다. 다음 예제에서는 명명된 템플릿을 print-host-name
호출하지만 호출에 매개 변수를 포함하지 않습니다. 이 경우 명명된 템플릿은 템플릿에 정의된 매개 변수의 message
기본값을 사용하거나 기본값이 없는 경우 빈 문자열을 print-host-name
사용합니다.
match configuration { call print-host-name(); }
템플릿을 호출하고 매개 변수를 포함하지만 호출 환경에서 매개 변수에 대한 값을 정의하지 않으면 스크립트는 매개 변수의 현재 값(이전에 초기화된 경우)을 전달합니다. 매개 변수가 선언되지 않은 경우 스크립트에서 오류가 발생합니다.
다음 예제에서는 명명된 템플릿을 print-host-name
호출하고 매개 변수를 전달 message
하지만 값은 포함하지 않습니다. 스크립트가 를 선언 및 초기화 message
하고 범위가 블록에 표시되는 경우 템플릿은 현재 값 message
을 사용합니다. 스크립트가 매개 변수를 선언 message
하지만 초기화하지 않는 경우 의 message
값은 빈 문자열입니다. 스크립트에서 를 선언 message
하지 않으면 호출에서 오류가 발생합니다.
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. */ }
템플릿을 호출하고, 매개 변수를 포함하고, 매개 변수에 대한 값을 정의하면 템플릿은 제공된 값을 사용합니다. 다음 예제에서는 매개 변수와 정의된 값을 사용하여 message
명명된 템플릿을 print-host-name
호출하므로 템플릿은 새 값을 사용합니다.
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); }
예: 매개 변수 및 일치 템플릿
다음 예제는 최상위 계층 configuration
요소와 일치시킨 다음 Junos OS 관리 프로세스(mgd)에 템플릿을 하위 트리에 재귀적으로 적용하도록 지시합니다 system/host-name
. 매개 변수 message
및 domain
은(는) 일치하는 노드의 처리에 사용됩니다.
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 _ ")"; }
XSLT에 해당하는 것은 다음과 같습니다.
<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>
함수에 매개 변수 전달하기
SLAX는 SLAX 버전 1.1부터 기능을 지원합니다. 문을 사용하여 param
함수 매개 변수를 정의할 수 있지만 문을 사용하여 with
호출 환경에서 함수로 매개 변수 값을 전달할 수는 없습니다. 함수를 호출할 때 쉼표로 구분된 목록의 함수에 인수를 전달합니다. 함수 인수는 템플릿에서와 같이 이름이 아닌 위치로 함수에 전달됩니다.
함수 선언은 후행 인수에 대한 기본값을 정의할 수 있습니다. 함수 호출에 정의보다 인수 수가 적으면 모든 후행 인수에 기본값이 사용됩니다. 함수 호출에 정의보다 인수가 더 많으면 함수 호출에서 오류가 발생합니다.
다음 일치 템플릿에서 함수 호출은 원본 XML 파일의 각 graphic/dimension
요소에서 선택한 너비 및 높이 데이터를 사용합니다. 스크립트는 함수를 평가하고 문은 copy-of
결과 트리에 반환 값을 요소의 내용 <out>
으로 내보냅니다. 함수 호출에는 및 height
에 대한 인수가 포함되지만 에 대한 width
scale
인수는 포함되지 않습니다. 기본값 1은 함수 블록 내에서 사용됩니다scale
.
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/.)); } } }