使用XSLT参数; <xsl:param>&<xsl:with-param>

Siv*_*ran 24 xml xslt xslt-1.0

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

样品LOC:

<xsl:call-template name="ABC">
    <xsl:with-param name="title" />
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 36

请解释我如何使用最好的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.

name任何一个xsl:paramxsl:with-param必须的属性.它标识参数.

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

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

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

一个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>
Run Code Online (Sandbox Code Playgroud)

应用于此XML文档时...

<t>Sports stars we really love, love to hate, hate</t>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

说明:

  1. replace模板被称为两次.在两次调用中,pText参数都被省略.其默认值由被调用模板使用.

  2. 第一个调用提供模式和替换参数,因此"love"替换为"like".

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

  4. 第二个调用根本不提供任何参数值,因此replace使用模板中的所有默认值- 字符串"hate"由字符串替换"disapprove".

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

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

  7. 第三次replace从外部启动模板是通过xsl:apply-templates.在这里,我们还展示了一个模板可以同时具有a match和a name属性,并且可以使用xsl:apply-templates和启动这样的模板xsl:call-template.


The*_*ing 10

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

<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>
Run Code Online (Sandbox Code Playgroud)

  • 在问题的背景下这是正确的,我认为对措辞有点挑剔 (2认同)