Пожалуйста, объясните мне, как лучше всего использовать 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:param
, либо xsl:with-param
является обязательным.Он идентифицирует параметр.
Атрибут select xsl:with-param
может использоваться для указания любого выражения 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>
... theрезультат ...
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"
.
Второй вызов вообще не предоставляет никаких значений параметров, поэтому используются все значения по умолчанию в шаблоне replace
- строка "hate"
заменяется строкой "disapprove"
.
Обратите внимание, что шаблон replace
вызывает себя рекурсивно, так что все вхождения шаблона заменяются заменой.
Кроме того, значения параметра pText
рекурсивных вызовов не являются статическими, а рассчитываются динамически.
В третий раз шаблон replace
инициируется извне черезxsl:apply-templates
.Здесь мы также показываем, что шаблон может иметь одновременно атрибут match
и name
, и возможно, что такой шаблон может быть инициирован как с использованием xsl:apply-templates
, так и xsl:call-template
.
* 1109.*