XSLT パラメーターの概要
パラメーターは、名前付きテンプレートまたは名前なしテンプレートに渡すことができます。テンプレート内では、パラメーターを宣言する必要があり、その名前の前にドル記号 ($) を付けることで参照できます。
パラメータの宣言
パラメーターのスコープは、グローバルまたはローカルです。スクリプトの初期化時にJunos OSで値が設定されるパラメータは、グローバルパラメータとして定義する必要があります。グローバルパラメータ宣言は、スタイルシート宣言の直後に配置されます。スクリプトは、グローバル パラメータにデフォルト値を割り当てることができます。これは、Junos OS がパラメータに値を与えない場合に使用されます。
<?xml version="1.0" standalone="yes"?> <xsl stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" xmlns:ext="http://xmlsoft.org/XSLT/namespace" version="1.0"> <!-- global parameter --> <xsl:param name="interface1"/>
ローカル パラメーターはブロックの先頭で宣言する必要があり、そのスコープは宣言されているブロックに限定されます。テンプレート内では、<xsl:param>
タグと name
属性を使用してパラメーターを宣言します。必要に応じて、XPath 式を含むことができる select
属性を含めることで、各パラメーターの既定値を宣言します。パラメーターを指定せずにテンプレートを呼び出すと、既定の式が評価され、結果がパラメーターに割り当てられます。テンプレートでデフォルト値を定義しない場合、パラメータはデフォルトで空の文字列になります。
次の名前付きテンプレート print-host-name
は、パラメーター message
を宣言し、既定値を定義します。
<xsl:template name="print-host-name"> <xsl:param name="message" select="concat('host-name: ', system/host-name)"/> <xsl:value-of select="$message"/> </xsl:template>
テンプレートは、パラメーター名の前にドル記号 ($) を付けることで、 message
パラメーターの値にアクセスします。
パラメータの受け渡し
テンプレートを呼び出すときは、 <xsl:with-param>
要素と name
属性を使用して、引数をテンプレートに渡します。 <xsl:with-param>
name
属性の値は、実際のテンプレートで定義されているパラメータの名前と一致する必要があります。一致しない場合、パラメータは無視されます。必要に応じて、テンプレートに渡すパラメーターごとに、 select
属性または <xsl:with-param>
要素の内容を使用して値を定義できます。
テンプレートで使用されるパラメーター値は、テンプレートの呼び出し方法によって異なります。 print-host-name
テンプレートを呼び出す次の 3 つの例は、考えられる呼び出し環境を示しています。
テンプレートを呼び出し、特定のパラメーターの <xsl:with-param>
要素を含めない場合、テンプレートで定義されている既定の式が評価され、結果がパラメーターに割り当てられます。テンプレートにそのパラメーターの既定値がない場合、パラメーターの既定値は空の文字列になります。次の例では、名前付きテンプレート print-host-name
を呼び出しますが、呼び出しにはパラメーターを含めません。この場合、名前付きテンプレートは、print-host-name
テンプレートで定義された message
パラメーターの既定値を使用するか、既定値が存在しない場合は空の文字列を使用します。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"/> </xsl:template>
テンプレートを呼び出してパラメーターを含め、呼び出し元の環境でパラメーターの値を定義しない場合、スクリプトはパラメーターの現在の値を渡します (以前に初期化されている場合) はパラメーターの現在の値を渡すか、パラメーターが宣言されていない場合はエラーを生成します。次の例では、名前付きテンプレート print-host-name
を呼び出し、 message
パラメーターを渡しますが、値は含まれていません。スクリプトで message
が宣言および初期化され、スコープがブロックから見える場合、 message
の現在の値が使用されます。 message
がスクリプトで宣言されているが初期化されていない場合、 message
の値は空の文字列になります。 message
が宣言されていない場合、スクリプトはエラーを生成します。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message"/> </xsl:call-template> </xsl:template>
テンプレートを呼び出し、パラメーターを含め、パラメーターの値を定義すると、テンプレートは指定された値を使用します。次の例では、message
パラメーターと定義された値を使用して名前付きテンプレート print-host-name
を呼び出すため、テンプレートは新しい値を使用します。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message" select=concat"('Host-name passed in: ', system/host-name)"/> </xsl:call-template> </xsl:template>
例:パラメータと一致テンプレート
次のテンプレートは、XML ドキュメントのルートである /
で一致します。次に、出力ドキュメントに追加される <outside>
という名前の要素を生成し、Junos OS管理プロセス (mgd) にテンプレートをconfiguration/system
サブツリーに再帰的に適用するように指示します。パラメーター host
は、一致するノードの処理に使用されます。host
パラメーターの値は、設定階層の [edit system
] レベルにある host-name
ステートメントの値です。
<xsl:template match="/"> <outside> <xsl:apply-templates select="configuration/system"> <xsl:with-param name="host" select="configuration/system/host-name"/> </xsl:apply-templates> </outside> </xsl:template>
次のテンプレートは、前の例で選択したサブツリーの最上位である <system>
要素と一致します。host
パラメーターは、既定値なしで宣言されています。前の例の <xsl:with-param>
タグで定義された host
パラメーターの値を含む <inside>
要素が生成されます。
<xsl:template match="system"> <xsl:param name="host"/> <inside> <xsl:value-of select="$host"/> </inside> </xsl:template>
例: パラメータと名前付きテンプレート
次の名前付きテンプレートreport-changed
では、現在のノードをデフォルトとする dot
と、ノード dot
の changed
属性をデフォルトとする changed
の 2 つのパラメータを宣言しています。
<xsl:template name="report-changed"> <xsl:param name="dot" select="."/> <xsl:param name="changed" select="$dot/@changed"/> <!-- ... --> </xsl:template>
次のスタンザは、report-changed
テンプレートを呼び出し、report-changed
テンプレートで定義されているデフォルト・ソースとは異なる changed
属性のソースを定義します。report-changed
テンプレートが呼び出されると、デフォルトのソースの代わりに、changed
属性に新しく定義されたソースが使用されます。
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="changed" select="../@changed"/> </xsl:call-template> </xsl:template>
同様に、次に示すように、テンプレート呼び出しに dot
パラメーターを含め、既定の現在のノード以外のソースを定義できます。
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="dot" select="../../> </xsl:call-template> </xsl:template>
その他の例
自動化スクリプトで <xsl:param>
要素を使用する完全な例については、以下を参照してください。