2010-07-14 8 views
5

J'ai un problème.Comment passer des paramètres à XSLT?

J'ai un fichier XML qui contient des informations sur 100 cours.

J'ai un fichier XSL qui affiche joliment la liste de 100 cours.

Mais que faire si je veux afficher seulement 1 cours. Puis-je passer un paramètre au fichier XSLT pour lui dire d'afficher uniquement "ENGL 100"?

Le XML ressemble à ceci:

<document> 
<menu> 
    <item> 
     <name>MTH 300</name> 
     <brief>Mathematics Skill Development</brief> 
     <description>A course in the fundamentals of ...</description> 
    </item> 
    <item> 
     <name>MTH 301</name> 
     <brief>Basic Algebra</brief> 
     <description>An introduction to algebra, ...</description> 
    </item> 
... 

Je sais que je pourrais écrire un fichier XSLT appelé « eng100.xsl » en boucle à travers le XML et afficher uniquement ENG 100 mais je ne veux pas avoir écrire des dizaines de ces fichiers.

Le XML est dynamique et je suis capable de le contrôler. Je veux que le fichier XSLT soit statique et ne change jamais.

Y at-il un moyen de transmettre des paramètres dans le XSLT?

+1

Veuillez noter que la réponse dépend en partie du moteur XSLT que vous utilisez et de la façon dont vous l'invoquez. –

Répondre

6

Vous pouvez passer des paramètres à XSLT, cela dépend de votre processeur XSLT, mais généralement en tant qu'arguments de commande supplémentaires, s'il s'agit d'un processeur de ligne de commande.

Vous déclarez les paramètres à l'aide

<xsl:param name="courseName" select"initialValue"/> 

Vous pouvez ensuite tester ce paramètre dans votre XSLT, et invoquer un autre modèle en fonction de sa valeur. Par exemple, si le paramètre est vide, appelez le modèle courant qui traite tous les éléments, sinon appelez un modèle qui traite uniquement les éléments lorsque le nom de l'élément est égal à la valeur du paramètre. Vous pouvez le faire avec un test

<xsl:template match="item"> 
     <xsl:if test="$courseName=name(./name)"> 
     <xsl:call-template name="yourOriginalTemplate"/> 
     </xsl:if> 
    </xsl:template> 

Mais par filtrage et formatage, vous mélangez deux problèmes dans un seul fichier. Je voudrais séparer la sélection des éléments XML de la mise en forme - avoir deux fichiers xslt pour cela et les exécuter comme un pipeline.

+0

Bonne réponse. +1 –

+0

En outre, pour certains scénarios, vous pouvez utiliser un document d'entrée "métadonnées" qui commande la transformation et accéder au document "données" avec la fonction 'document()'. Cela coûtera en efficacité. –

+3

Que faire si le document XML a une instruction de traitement Est-il possible de passer le paramètre xsl au fichier xml par url-encoded name = value paramètre? Je veux dire, puis-je faire quelque chose comme ça alors: mycontent.xml? CourseName = MTH300 – brighty

Questions connexes