最適なXSLTパラメーターの使用方法を説明してください。の面では <xsl:param>
&<xsl:with-param>
サンプルLOC:
<xsl:call-template name="ABC">
<xsl:with-param name="title" />
</xsl:call-template>
最適なXSLTパラメーターの使用方法を説明してください。
<xsl:param>
および<xsl:with-param>
に関して
<xsl:param>
は、グローバルレベルでどこでも(xsl:stylesheet
の子として)指定できます。または、テンプレート内にある場合は、その子であり、xsl:param
の非xsl:template
子の前になければなりません。
これは、テンプレートまたは変換全体(グローバルxsl:param
の場合)が、それぞれテンプレートまたは変換全体の呼び出し元/イニシエーターからさまざまなデータを受信できるようにする機能です。
テンプレート/変換の呼び出し側/開始側では、xsl:with-param
命令を使用してパラメーターが渡されます。 xsl:apply-templates
またはxsl:call-template
の子にすることができます。
xsl:param
またはxsl:with-param
のname
属性は必須です。パラメータを識別します。
xsl:with-param
のselect属性は、anyXPath式を指定するために使用できます。XPath式の評価結果は、呼び出された/適用されたテンプレートに渡されます。
または、xsl:with-param
のコンテンツ(本体)で値を指定できます。
xsl:with-param
には、select
属性または本文が必要です。しかし、両方ではありません。
xsl:param
には、select属性または本文を含めることもできます。この場合、これらはパラメーターのデフォルト値を指定します。この名前のパラメーターが呼び出し元によって指定されていない場合に使用されます。
最後に、これらの概念のほとんどを示す完全な例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pTarget" select="'love'"/>
<xsl:param name="pReplacement" select="'like'"/>
<xsl:template match="/*">
<xsl:call-template name="replace">
<xsl:with-param name="pPattern" select="$pTarget"/>
<xsl:with-param name="pRep" select="$pReplacement"/>
</xsl:call-template>
<xsl:text>
</xsl:text>
<xsl:call-template name="replace"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="text()">
<xsl:with-param name="pPattern" select="$pTarget"/>
<xsl:with-param name="pRep" select="'adore'"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="text()" name="replace">
<xsl:param name="pText" select="."/>
<xsl:param name="pPattern" select="'hate'"/>
<xsl:param name="pRep" select="'disapprove'"/>
<xsl:if test="string-length($pText) >0">
<xsl:choose>
<xsl:when test="not(contains($pText, $pPattern))">
<xsl:value-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($pText, $pPattern)"/>
<xsl:value-of select="$pRep"/>
<xsl:call-template name="replace">
<xsl:with-param name="pPattern" select="$pPattern"/>
<xsl:with-param name="pRep" select="$pRep"/>
<xsl:with-param name="pText" select=
"substring-after($pText, $pPattern)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
このXMLドキュメントに適用される場合...
<t>Sports stars we really love, love to hate, hate</t>
...結果は...
Sports stars we really like, like to hate, hate
Sports stars we really love, love to disapprove, disapprove
Sports stars we really adore, adore to hate, hate
説明:
replace
テンプレートは2回呼び出されます。両方の呼び出しで、pText
パラメーターは省略されます。そのデフォルト値は、呼び出されたテンプレートによって使用されます。
最初の呼び出しではパターンと置換パラメーターが提供されるため、"love"
は"like"
に置き換えられます。
グローバルパラメータ$pTarget
および$pReplacement
の値はパススルーされることに注意してください。変換のイニシエーターがこれらのグローバルパラメーターに他の値(このコードで使用されるデフォルトではない)を渡すと決定した場合、これらの値はreplace
テンプレートに渡され、デフォルトの"love"
および"like"
ではありません。
2番目の呼び出しはパラメーター値をまったく提供しないため、replace
テンプレートのすべてのデフォルトが使用されます。文字列"hate"
は文字列"disapprove"
に置き換えられます。
replace
テンプレートはそれ自体を再帰的に呼び出すため、パターンのすべての出現が置換によって置き換えられることに注意してください。
また、再帰呼び出しのpText
パラメーターの値は静的ではありませんが、動的に計算されます。
replace
テンプレートが外部から3回目に起動されるのは、xsl:apply-templates
経由です。ここでは、テンプレートがmatch
属性とname
属性の両方を同時に持つことができ、そのようなテンプレートはxsl:apply-templates
とxsl:call-template
の両方を使用して開始できることも示しています。
別のテンプレートで定義されたパラメータを渡すために使用されます:
<xsl:param name="globalParam"></xsl:param>
<xsl:call-template name="ABC">
<xsl:with-param name="title" select="'A Title'" />
</xsl:call-template>
<xsl:template name="ABC">
<xsl:param name="title"/>
<xsl:value-of select="$title" />
<xsl:value-of select="$globalParam" />
</xsl:template>