Пожалуйста, объясните мне, как лучше использовать XSLT param.
в терминах <xsl:param>
и <xsl:with-param>
Пример LOC:
<xsl:call-template name="ABC">
<xsl:with-param name="title" />
</xsl:call-template>
Пожалуйста, объясните мне, как лучше использовать XSLT param.
в терминах <xsl:param>
и <xsl:with-param>
Пример LOC:
<xsl:call-template name="ABC">
<xsl:with-param name="title" />
</xsl:call-template>
Пожалуйста, объясните мне, как лучше использовать 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
.
Он использовал для передачи параметра, определенного в другом шаблоне:
<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>