Ответ 1
Пожалуйста, объясните мне, как лучше использовать XSLT param. с точки зрения
<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
, либо тело. но не оба из них.
An xsl:param
также может иметь атрибут select или body. В этом случае они определяют значение по умолчанию для параметра, и оно используется, если вызывающий объект не указал параметр с этим именем.
Наконец, вот полный пример, иллюстрирующий большинство этих понятий:
<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>
... результат...
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
.