请解释我如何使用最佳XSLT参数。
在<xsl:param>
&amp; <xsl:with-param>
示例LOC:
<xsl:call-template name="ABC">
<xsl:with-param name="title" />
</xsl:call-template>
答案 0 :(得分:35)
请解释我如何使用最佳XSLT参数。就......而言
<xsl:param>
&amp;<xsl:with-param>
<xsl:param>
可以在全局级别指定(作为xsl:stylesheet
的子级),或者如果它位于模板中,则它必须是其子级,并且必须位于任何非{{1}之前。 } xsl:param
的孩子。
这是允许模板或整个转换(在全局xsl:template
的情况下)分别从模板的调用者/发起者或整个转换接收不同数据的工具。
在模板/转换的调用者/启动者一侧,使用xsl:param
指令传递参数。它可以是xsl:with-param
或xsl:apply-templates
的孩子。
xsl:call-template
或name
的{{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>
</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>
<强>解释强>:
<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
被pText
替换。
请注意,全局参数"love"
和"like"
的值会通过。如果转换的发起者决定传递这些全局参数的其他值(不是此代码中使用的默认值),则这些值将传递给$pTarget
模板,而不是默认值$pReplacement
和replace
。
第二次调用根本不提供任何参数值,因此使用"love"
模板中的所有默认值 - 字符串"like"
被字符串{{1}替换}。
请注意,replace
模板以递归方式调用自身,以便替换时替换所有出现的模式。
此外,递归调用的"hate"
参数值不是静态的,而是动态计算的。
第三次从外部发起"disapprove"
模板是通过replace
。在这里,我们还显示模板可以同时具有pText
和replace
属性,并且可以使用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>