2010-05-13 3 views
0

La situation est que j'ai deux fichiers xslt: un est appelé à partir de mon code ASP.NET, et là, le deuxième fichier xslt est importé. Ce que je voudrais accomplir est de passer un paramètre au premier, ainsi le deuxième xslt (celui qui est importé au premier xslt) peut le lire.XSLT - Attraper les paramètres

Mon C# code ressemble à ceci:

var oArgs = new XsltArgumentList(); 
    oArgs.AddParam("fbLikeFeatureName", "", "Facebook_Like_Button"); 
    ltlContentBody.Text = xmlUtil.TransformXML(oXmlDoc, Server.MapPath(eSpaceId + "/styles/ExploringXSLT/ExploreContentObjects.xslt"), true); 

Et j'attraper le param au premier xslt ainsi:

<xsl:param name="fbLikeFeatureName" /> 

Et puis, en passant à la deuxième xslt comme celui-ci (auparavant, j'importer ce fichier):

<xsl:call-template name="Articles"> 
    <xsl:with-param name="fbLikeFeatureName"></xsl:with-param> 
    </xsl:call-template> 

Enfin, j'attrapant le deuxième sur le param fichier xslt comme suit :

<xsl:value-of select="$fbLikeButtonName"/> 

Qu'est-ce que je fais mal? Je suis un peu nouveau à xslt.

Répondre

1

Vous n'avez pas besoin de "passer" le paramètre de la première feuille de style à la feuille de style importée. Lorsque vous déclarez le paramètre au niveau supérieur de la première feuille de style, il est automatiquement visible pour toutes les feuilles de style importées. Considérez les feuilles de style suivantes:

template1.xsl:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="template2.xsl"/> 
    <xsl:param name="input-param"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="doc"/> 
    </xsl:template> 
</xsl:stylesheet> 

Ce qui importe template2.xsl:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="doc"> 
     <xsl:value-of select="$input-param"/> 
    </xsl:template> 
</xsl:stylesheet> 

je puis transformé la doc suivante:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="template1.xsl"?> 
<doc/> 

avec l'entrée le paramètre "input-param" est réglé sur "Ceci est un test". Je reçois la sortie suivante (Saxon-B 9.1.0.7):

This is a test 
+0

J'ai confirmé que le code ci-dessus fonctionne aussi sur MSXML –

+0

Je ne sais pas pourquoi Je ne peux pas le faire fonctionner ... Je fais tout ce que tu m'as dit de faire. –

+0

Eh bien, je reconnais que je suis beaucoup plus un expert XSL qu'un expert C#, mais où dans votre exemple de code attacher la liste des paramètres à la transformation? Je vois où vous créez oArgs, et je vois où vous le peupler, mais il n'est pas mentionné sur la ligne où vous faites la transformation. –

2

Vous ne définissez pas la valeur du paramètre lorsque vous le transmettez au modèle Articles. Essayez

<xsl:call-template name="Articles"> 
    <xsl:with-param name="fbLikeButtonName" select="$fbLikeFeatureName"/> 
</xsl> 

et dix

<xsl:template name="Articles"> 
    <xsl:param name="fbLikeButtonName"/> 
    ... 
    <xsl:value-of select="$fbLikeButtonName"/> 
    ... 
</xsl:template> 

Lorsque vous utilisez with-param, l'attribut name est défini sur le nom du paramètre tel qu'il est utilisé par le modèle appelé (Articles dans ce cas). Vous utilisez ensuite select (ou le corps de xsl:with-param) pour définir la valeur.

+0

Merci. Cela ne semble pas fonctionner cependant. Au moins, aucun texte ne s'affiche sur le navigateur (il est supposé afficher la valeur du param). –

+0

Le nom attrobite de with-param est-il exactement le même que l'attribut name de param? Est-ce que fbLikeFeatureName a une valeur en dehors des articles? –

+0

Eh bien, si vous regardez le code ASP.NET que j'ai écrit ci-dessus, vous verrez que sa valeur est "Facebook_Like_Button". –