web-dev-qa-db-ja.com

XSLTパラメータの使用。 <xsl:param>&<xsl:with-param>

最適なXSLTパラメーターの使用方法を説明してください。の面では <xsl:param><xsl:with-param>

サンプルLOC:

<xsl:call-template name="ABC">
    <xsl:with-param name="title" />
</xsl:call-template>
24
Siva Charan

最適な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-paramname属性は必須です。パラメータを識別します。

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>&#xA;</xsl:text>

  <xsl:call-template name="replace"/>

  <xsl:text>&#xA;</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

説明

  1. replaceテンプレートは2回呼び出されます。両方の呼び出しで、pTextパラメーターは省略されます。そのデフォルト値は、呼び出されたテンプレートによって使用されます。

  2. 最初の呼び出しではパターンと置換パラメーターが提供されるため、"love""like"に置き換えられます。

  3. グローバルパラメータ$pTargetおよび$pReplacementの値はパススルーされることに注意してください。変換のイニシエーターがこれらのグローバルパラメーターに他の値(このコードで使用されるデフォルトではない)を渡すと決定した場合、これらの値はreplaceテンプレートに渡され、デフォルトの"love"および"like"ではありません。

  4. 2番目の呼び出しはパラメーター値をまったく提供しないため、replaceテンプレートのすべてのデフォルトが使用されます。文字列"hate"は文字列"disapprove"に置き換えられます。

  5. replaceテンプレートはそれ自体を再帰的に呼び出すため、パターンのすべての出現が置換によって置き換えられることに注意してください。

  6. また、再帰呼び出しのpTextパラメーターの値は静的ではありませんが、動的に計算されます。

  7. replaceテンプレートが外部から3回目に起動されるのは、xsl:apply-templates経由です。ここでは、テンプレートがmatch属性とname属性の両方を同時に持つことができ、そのようなテンプレートはxsl:apply-templatesxsl:call-templateの両方を使用して開始できることも示しています。

36

別のテンプレートで定義されたパラメータを渡すために使用されます:

<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>
10
TheCodeKing