Подтвердить что ты не робот

Использование XSLT Params; <xsl: param> & <xsl: with-param>

Пожалуйста, объясните мне, как лучше использовать XSLT param. в терминах <xsl:param> и <xsl:with-param>

Пример LOC:

<xsl:call-template name="ABC">
    <xsl:with-param name="title" />
</xsl:call-template>
4b9b3361

Ответ 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>&#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>

При применении к этому 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.

Ответ 2

Он использовал для передачи параметра, определенного в другом шаблоне:

<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>