이 페이지의 내용
SLAX 템플릿 개요
SLAX 스크립트는 템플릿이라고 하는 하나 이상의 규칙 세트로 구성됩니다. 각 템플릿은 지정된 노드가 일치할 때 적용할 규칙이 포함된 코드 세그먼트입니다.
Junos OS 릴리스 14.2 이상에서 지원되는 SLAX 언어 버전 1.2는 템플릿과 함수 모두에 대한 인수로 SLAX 요소를 지원합니다.
템플릿에는 명명된 템플릿과 이름이 지정되지 않은(또는 일치하는) 템플릿의 두 가지 유형이 있으며, 다음 섹션에서 설명합니다.
이름이 지정되지 않은(일치) 템플릿
이름이 지정되지 않은 템플릿(일치 템플릿이라고도 함)에는 match
템플릿을 호출해야 하는 노드의 기준을 지정하는 XPath 표현식이 있는 문이 포함되어 있습니다. 다음 커밋 스크립트 샘플에서 템플릿은 구성 계층의 최상위 요소와 일치합니다.
match configuration { /* ...body of the template goes here */ }
기본적으로 프로세서는 전체 문서 계층 구조를 재귀적으로 트래버스하여 각 노드를 검사하고 현재 노드와 일치하는 템플릿을 찾습니다. 일치하는 템플릿이 발견되면 해당 템플릿의 내용이 평가됩니다.
명령문은 apply-templates
명명되지 않은 템플릿 내에서 노드의 기본 계층적 순회를 제한하고 제어하는 데 사용할 수 있습니다. 이 문은 요소의 특성 <xsl:apply-templates>
과 select
동일한 선택적 XPath 식을 허용합니다. 선택적 XPath 표현식이 포함된 경우 XPath 표현식과 일치하는 노드만 트래버스됩니다. 그렇지 않으면 컨텍스트 노드의 모든 자식이 트래버스됩니다. XPath 표현식이 포함되었지만 노드와 일치하지 않는 경우 아무 것도 트래버스되지 않고 아무 일도 일어나지 않습니다.
다음 예제에서 템플릿 규칙은 XML 계층의 <route>
요소와 일치합니다. 속성을 포함하는 changed
모든 노드가 처리됩니다. 특성을 포함하는 changed
모든 route
요소는 요소로 대체됩니다new
.
match route { <new> { apply-templates *[@changed]; } }
이에 해당하는 XSLT는 다음과 같습니다.
<xsl:template match="route"> <new> <xsl:apply-templates select="*[@changed]"/> </new> </xsl:template>
명명되지 않은 템플릿을 사용하면 스크립트가 XML 계층 구조에서 태그의 위치를 무시할 수 있습니다. 예를 들어 모든 태그를 태그로 <div class="author">
변환하려는 경우 템플릿을 사용하면 입력 XML 문서에서의 위치에 관계없이 모든 <author>
<author>
태그를 변환하는 단일 규칙을 작성할 수 있습니다.
명명된 템플릿
명명된 템플릿은 기존 프로그래밍 언어의 함수처럼 작동합니다. 스크립트의 복잡성이 증가하거나 코드 세그먼트가 여러 위치에 나타나는 경우 코드를 모듈화하고 명명된 템플릿을 만들 수 있습니다. 함수와 마찬가지로 명명된 템플릿은 인수를 수락하고 명시적으로 호출된 경우에만 실행됩니다.
SLAX에서 명명된 템플릿 정의는 키워드, 템플릿 이름, 매개 변수 집합 및 중괄호로 구분된 코드 블록으로 구성됩니다 template
. 매개 변수 선언은 인라인일 수 있으며 매개 변수 이름과 기본값(선택 사항)으로 구성됩니다. 또는 문을 사용하여 template 블록 내에서 매개 변수를 선언할 수 있습니다 param
. 기본값이 정의되지 않은 경우 매개 변수는 기본적으로 빈 문자열로 설정됩니다.
다음 예제에서는 라는 my-template
템플릿을 만들고 세 개의 매개 변수를 정의합니다. 그 중 하나는 기본적으로 string 이고, 다른 하나는 기본적으로 현재 false
컨텍스트 노드의 자식인 element 노드의 name
내용으로 기본 설정됩니다. 스크립트가 템플릿을 호출하고 매개 변수를 전달하지 않으면 기본값이 사용됩니다.
template my-template ($a, $b = "false", $c = name) { /* ... body of the template ... */ }
또 다른 방법은 문을 사용하여 템플릿 내에서 매개 변수를 선언하는 것입니다 param
. 다음 코드는 이전 예제와 동일합니다.
template my-template { param $a; param $b = "false"; param $c = name; /* ... body of the template ... */ }
SLAX에서는 키워드와 템플릿 이름으로 구성된 call
명령문을 사용하여 call
명명된 템플릿을 호출하고 그 뒤에 매개변수 바인딩 세트를 호출합니다. 이러한 바인딩은 호출 환경에서 템플릿으로 전달되는 매개 변수 이름의 쉼표로 구분된 목록입니다. 매개변수 지정은 리스트에서의 위치가 아닌 이름으로 이루어집니다. 또는 문을 사용하여 블록 내에서 call
매개 변수를 선언할 수 있습니다with
. 템플릿으로 전달된 매개 변수는 실제 템플릿에 정의된 매개 변수와 일치해야 합니다. 그렇지 않으면 매개 변수가 무시됩니다. 필요에 따라 각 매개 변수의 값을 설정할 수 있습니다. 호출 환경에서 매개 변수에 대한 값을 정의하지 않으면 스크립트가 매개 변수의 현재 값(이전에 초기화된 경우)을 전달하거나 매개 변수가 선언되지 않은 경우 오류가 발생합니다. 매개 변수 전달에 대한 자세한 내용은 SLAX 매개 변수 개요를 참조하세요.
다음 예제에서는 현재 컨텍스트 노드의 자식인 element 노드의 other-name
내용이 포함된 매개 변수를 c
사용하여 템플릿 my-template
이 호출됩니다.
call my-template { with $c = other-name; }
다음 예제에서 은(는 name-servers-template
) 두 개의 매개 변수 name-servers
및 size
. size
매개 변수에는 기본값 0이 지정됩니다. 를 선언하고 초기화 name-servers
하는 일치 템플릿은 을(를) name-servers-template
세 번 호출합니다.
템플릿에 대한 첫 번째 호출에는 매개 변수가 포함되지 않습니다. name-servers
따라서 는 기본적으로 빈 문자열로 설정되며 size
템플릿에 정의된 대로 기본적으로 0 값으로 설정됩니다. 두 번째 호출에는 및 size
매개 변수가 포함 name-servers
되지만 매개 변수에 대한 size
값만 제공합니다. name-servers
따라서 는 스크립트에서 초기화에 의해 정의된 값을 가지며size
, 구성 계층의 요소 수와 name-servers
같습니다. 마지막 호출은 두 번째 호출과 동일하지만 문 구문을 사용하여 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; }
XSLT에 해당하는 것은 다음과 같습니다.
<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>