3

Comment appeler des modèles XSLT en ligne? Par exemple, au lieu de:Est-il possible d'appeler des modèles XSLT en ligne?

<xsl:call-template name="myTemplate" > 
<xsl:with-param name="param1" select="'val'" /> 
</xsl:call-template> 

Puis-je utiliser style d'appel de fonction intégrée XSLT, comme ceci:

<xls:value-of select="myTeplate(param1)" /> 

Répondre

1

La syntaxe de XSLT est correcte dans le premier exemple. Vous pouvez aussi écrire

<xsl:call-template name="myTemplate" > 
<xsl:with-param name="param1">val</xsl:with-param> 
</xsl:call-template> 

Je ne sais pas ce que vous essayez de faire dans le second extrait de code (le « val » est manquant et il y a deux fautes de frappe (xls et myTeplate)), mais il est pas valide XSLT.I n

MISE À JOUR Si je comprends maintenant votre question, ce n'était pas "existe-t-il une syntaxe alternative pour les modèles XSLT?" mais "puis-je écrire mes propres fonctions dans XSLT?".

Oui, vous pouvez. Voici une introduction utile. Notez que vous devez fournir votre code Java dans une bibliothèque et que cela peut ne pas être facile à distribuer (par exemple dans un navigateur). Essayez http://www.xml.com/pub/a/2003/09/03/trxml.html

+0

Pour appeler la fonction intégrée normalisent-espaces, nous passons le paramètre comme (param1, param2, paramN), Est-il possible d'appeler mon modèle de cette façon: < xsl: value-of select = "monModèle (param1, param2)" /> –

+0

Non. La syntaxe des fonctions intégrées (par ex. normalize-spaces) est différent de la syntaxe des templates. –

+0

Donc, il existe un moyen de créer des fonctions dans XSLT? –

4

Dans XSLT 2.0, vous pouvez définir vos propres fonctions personnalisées à l'aide xsl:function

Un article sur XML.com décrivant comment écrire vos propres fonctions XSLT 2.0: http://www.xml.com/pub/a/2003/09/03/trxml.html

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://whatever"> 

    <!-- Compare two strings ignoring case, returning same 
     values as compare(). --> 
    <xsl:function name="foo:compareCI"> 
    <xsl:param name="string1"/> 
    <xsl:param name="string2"/> 
    <xsl:value-of select="compare(upper-case($string1),upper-case($string2))"/> 
    </xsl:function> 

    <xsl:template match="/"> 
compareCI red,blue: <xsl:value-of select="foo:compareCI('red','blue')"/> 
compareCI red,red: <xsl:value-of select="foo:compareCI('red','red')"/> 
compareCI red,Red: <xsl:value-of select="foo:compareCI('red','Red')"/> 
compareCI red,Yellow: <xsl:value-of select="foo:compareCI('red','Yellow')"/> 
    </xsl:template> 

</xsl:stylesheet> 
1

Utilisez un processing-instruction et un modèle de correspondance qui applique les paramètres pour ce faire:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Self-referencing Stylesheet href --> 
<?xml-stylesheet type="text/xsl" href="dyn_template_param.xml"?> 
<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" 
      > 

<!--HTML5 doctype generator--> 
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" /> 

<!--Macro references--> 
<?foo param="hi"?> 
<?foo param="bye"?> 

<!--Self-referencing template call--> 
<xsl:template match="xsl:stylesheet"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="/"> 
    <!--HTML content--> 
    <html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
    </head> 
    <body> 
     <!--Macro template calls--> 
     <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="processing-instruction('foo')"> 
    <xsl:param name="arg" select="substring-after(.,'=')"/> 
    <xsl:if test="$arg = 'hi'"> 
    <p>Welcome</p> 
    </xsl:if> 
    <xsl:if test="$arg = 'bye'"> 
    <p>Thank You</p> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

Références