Использование XSLT Params;& - PullRequest
       3

Использование XSLT Params;&

24 голосов
/ 11 сентября 2011

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

Образец LOC:

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

Ответы [ 2 ]

36 голосов
/ 11 сентября 2011

Пожалуйста, объясните мне, как лучше всего использовать 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>&#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>

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

Пояснение :

  1. Шаблон replace вызывается дважды.В обоих вызовах параметр pText опущен.Его значение по умолчанию используется вызываемым шаблоном.

  2. Первый вызов предоставляет шаблон и параметры замены, поэтому "love" заменяется на "like".

  3. Обратите внимание, что значения глобальных параметров $pTarget и $pReplacement пропущены.Если инициатор преобразования решит передать другие значения (не значения по умолчанию, используемые в этом коде) для этих глобальных параметров, эти значения будут переданы в шаблон replace, а не значения по умолчанию "love" и "like".

  4. Второй вызов вообще не предоставляет никаких значений параметров, поэтому используются все значения по умолчанию в шаблоне replace - строка "hate" заменяется строкой "disapprove".

  5. Обратите внимание, что шаблон replace вызывает себя рекурсивно, так что все вхождения шаблона заменяются заменой.

  6. Кроме того, значения параметра pText рекурсивных вызовов не являются статическими, а рассчитываются динамически.

  7. В третий раз шаблон replace инициируется извне черезxsl:apply-templates.Здесь мы также показываем, что шаблон может иметь одновременно атрибут match и name, и возможно, что такой шаблон может быть инициирован как с использованием xsl:apply-templates, так и xsl:call-template.

    * 1109.*
9 голосов
/ 11 сентября 2011

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

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