web-dev-qa-db-fra.com

Utilisation des paramètres XSLT; <xsl: param> & <xsl: with-param>

Veuillez m'expliquer comment utiliser le meilleur paramètre XSLT. en terme de <xsl:param> & <xsl:with-param>

Échantillon LOC:

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

Veuillez m'expliquer comment utiliser le meilleur paramètre XSLT. en termes de <xsl:param> & <xsl:with-param>

<xsl:param> Peut être spécifié au niveau global n'importe où (en tant qu'enfant de xsl:stylesheet) Ou s'il se trouve dans un modèle, il doit être son enfant et il doit précéder tout non - xsl:param enfant de xsl:template.

C'est la fonction qui permet à un modèle ou à la transformation entière (dans le cas d'un xsl:param Global) de recevoir des données variables de l'appelant/initiateur du modèle ou de la transformation entière, respectivement.

Du côté de l'appelant/initiateur du modèle/transformation, les paramètres sont passés en utilisant une instruction xsl:with-param. il peut s'agir d'un enfant de xsl:apply-templates ou xsl:call-template.

L'attribut name de xsl:param Ou xsl:with-param Est obligatoire. Il identifie le paramètre.

L'attribut select de xsl:with-param Peut être utilisé pour spécifier toute expression XPath, dont le résultat de l'évaluation est transmis au modèle appelé/appliqué .

Alternativement, la valeur peut être spécifiée dans le contenu (corps) de xsl:with-param.

xsl:with-param Doit avoir un attribut select ou un corps. mais pas les deux.

Un xsl:param Peut également avoir un attribut ou un corps de sélection. Dans ce cas, ceux-ci spécifient la valeur par défaut du paramètre et elle est utilisée si aucun paramètre portant ce nom n'a été spécifié par l'appelant.

Enfin, voici un exemple complet illustrant la plupart de ces concepts:

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

Lorsqu'il est appliqué sur ce document XML ...

<t>Sports stars we really love, love to hate, hate</t>

... le résultat est ...

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

Explication:

  1. Le modèle replace est appelé deux fois. Dans les deux appels, le paramètre pText est omis. Sa valeur par défaut est utilisée par le modèle appelé.

  2. Le premier appel fournit le modèle et les paramètres de remplacement, donc "love" Est remplacé par "like".

  3. Notez que les valeurs des paramètres globaux $pTarget Et $pReplacement Sont transmises. Si l'initiateur de la transformation décide de passer d'autres valeurs (et non les valeurs par défaut utilisées dans ce code) pour ces paramètres globaux, ces valeurs seront transmises au modèle replace et non aux valeurs par défaut "love" et "like".

  4. Le deuxième appel ne fournit aucune valeur de paramètre, donc toutes les valeurs par défaut du modèle replace sont utilisées - la chaîne "hate" Est remplacée par la chaîne "disapprove".

  5. Notez que le modèle replace s'appelle de manière récursive, de sorte que toutes les occurrences du modèle sont remplacées par le remplacement.

  6. De plus, les valeurs du paramètre pText des appels récursifs ne sont pas statiques, mais sont calculées dynamiquement.

  7. La troisième fois que le modèle replace est lancé de l'extérieur, c'est via xsl:apply-templates. Ici, nous montrons également qu'un modèle peut avoir à la fois un attribut match et name en même temps et il est possible qu'un tel modèle puisse être lancé à la fois en utilisant xsl:apply-templates Et xsl:call-template.

36
Dimitre Novatchev

Il est utilisé pour passer un paramètre défini dans un autre modèle:

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