使用XSLT参数; <xsl:param>&amp;的<xsl:与-PARAM> </XSL:与-PARAM> </XSL:PARAM>

时间:2011-09-11 14:26:38

标签: xml xslt xslt-1.0

请解释我如何使用最佳XSLT参数。 在<xsl:param>&amp; <xsl:with-param>

示例LOC:

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

2 个答案:

答案 0 :(得分:35)

  

请解释我如何使用最佳XSLT参数。就......而言   <xsl:param>&amp; <xsl:with-param>

<xsl:param>可以在全局级别指定(作为xsl:stylesheet的子级),或者如果它位于模板中,则它必须是其子级,并且必须位于任何非{{1}之前。 } xsl:param的孩子。

这是允许模板或整个转换(在全局xsl:template的情况下)分别从模板的调用者/发起者或整个转换接收不同数据的工具。

在模板/转换的调用者/启动者一侧,使用xsl:param指令传递参数。它可以是xsl:with-paramxsl:apply-templates的孩子。

xsl:call-templatename的{​​{1}}属性是强制性的。它标识参数。

xsl:param的select属性可用于指定任何 XPath表达式,其评估结果将传递给被调用/应用的模板。

或者,可以在xsl:with-param的内容(正文)中指定值。

xsl:with-param必须具有xsl:with-param属性或正文。但不是两个。

xsl:with-param也可以有一个select属性或正文。在这种情况下,这些指定参数的默认值,如果调用者未指定具有此名称的参数,则使用它。

最后,这是一个完整的示例,说明了大多数这些概念

select

应用于此XML文档时......

xsl:param

......结果是......

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

<强>解释

  1. <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 参数。其默认值由被调用模板使用。

  2. 第一个调用提供了模式和替换参数,因此replacepText替换。

  3. 请注意,全局参数"love""like"的值会通过。如果转换的发起者决定传递这些全局参数的其他值(不是此代码中使用的默认值),则这些值将传递给$pTarget模板,而不是默认值$pReplacementreplace

  4. 第二次调用根本不提供任何参数值,因此使用"love"模板中的所有默认值 - 字符串"like"被字符串{{1}替换}。

  5. 请注意,replace模板以递归方式调用自身,以便替换时替换所有出现的模式。

  6. 此外,递归调用的"hate"参数值不是静态的,而是动态计算的。

  7. 第三次从外部发起"disapprove"模板是通过replace。在这里,我们还显示模板可以同时具有pTextreplace属性,并且可以使用xsl:apply-templates和{{1}启动此类模板}}

答案 1 :(得分:9)

它用于传递另一个模板中定义的参数:

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