2010-08-16 3 views
1

J'essaie d'effectuer une vérification sur les nœuds individuels d'un fichier XML, et en fonction du contenu d'un nœud spécifique faire quelque chose, par exemple si le type est bool une case à cocher ou si le type est texte affiche une zone de texte ou une zone d'options déroulantes.Effectuer une vérification dans XSL

Par exemple:

<Questions> 
<Question> 
<Data>What gender are you?</Data> 
<Type>pulldown</Type> 
</Question> 
<Question> 
<Data>Do you like Chocolate?</Data> 
<Type>checkbox</Type> 
</Question> 
</Questions> 

Merci à l'avance

Je ne suis pas sûr si je devrais utiliser xsl:choose/xsl:when ou xsl:if

+0

Très bonne question (+1). Voir ma réponse pour la "manière XSLT" de faire ce que vous voulez - c'est la manière la plus simple et la plus recommandée de traiter des nœuds de types différents et cela ne nécessite aucune logique conditionnelle codée en dur. :) –

Répondre

3

<xsl:choose>peut et devrait toujours être évitée si possible.

Cette transformation XSLT montre comment traiter différents types Question d'une manière différente, sans aucune logique conditionnelle câblée:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="Question[Type='pulldown']"> 
    <!-- Implement pull-down here --> 
</xsl:template> 

<xsl:template match="Question[Type='checkbox']"> 
    <!-- Implement checkbox here --> 
</xsl:template> 
</xsl:stylesheet> 

<xsl:choose>devrait être aboided en raison de la même raison qui nous fait en POO éviter la bascule l'instruction (type) et utilise les fonctions virtuelles à la place. Cela rend le code plus court, réduit la possibilité de faire une erreur, est considérablement plus extensible et maintenable, prend en charge le code futur avant même qu'il ne soit écrit.

+0

+1. Oui, le "pattern matching" est le chemin à suivre avec le langage déclaratif. –

+0

pourquoi xsl: choisir devrait être évité? – Julio

+0

@Dan: '

1

La construction qui semble être le mieux adapté à vos besoins est xsl:choose:

<xsl:template match="Question"> 
<xsl:choose> 
    <xsl:when test="Type = 'checkbox'"> 
     <!-- output checkbox code --> 
    </xsl:when> 
    <xsl:when test="Type = 'pulldown'"> 
     <!-- output pulldown code --> 
    </xsl:when> 
    <xsl:otherwise> 
     <!-- output default code --> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
+0

désolé c'était juste une faute de frappe – Julio

+0

@Dan - assez juste :) – Oded

Questions connexes