2010-11-21 7 views
1

Dans le fichier .xml, j'ai comme ceci:avec sortie xslt

<function>true</function> 

Dans le schéma ile, je l'ont défini comme une valeur booléenne. Alors maintenant, ça fonctionne correctement. MAIS pour le fichier XSLT-à-dire .xsl,

+0

Pouvez-vous ajouter un exemple xsl décrivant ce que vous voulez faire? – wimh

+0

plz vérifier la partie mise à jour – user507087

+0

Bonne question, +1. Voir ma réponse pour une solution complète et courte qui n'utilise aucune instruction conditionnelle XSLT. Aussi attendre un hack encore plus court, à venir ... :) –

Répondre

3

Vous pouvez utiliser xsl:choose:

<td> 
    <xsl:choose> 
    <xsl:when test="function = 'true'">@</xsl:when> 
    <xsl:otherwise>&#32;</xsl:otherwise> 
    </xsl:choose> 
</td> 
+0

son ne fonctionne pas ... & 32 est ce que?/Il jette une erreur? – user507087

+0

@ user507087 - désolé, il est supposé être l'entité pour l'espace (' '). J'ai raté le #. – Oded

+0

Cette entité spatiale sera supprimée de la feuille de style. –

0

Cela peut se faire très simplement, pas du tout exigeant des instructions XSLT conditionnelles, et tout à fait dans l'esprit du XSLT (push-style):

Cette transformation:

<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:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="function/text()[.='true']">@</xsl:template> 
<xsl:template match="function/text()[not(.='true')]"> 
    <xsl:text> </xsl:text> 
</xsl:template> 

<xsl:template match="function"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML suivant:

<function>true</function> 

produit le résultat souhaité, correct:

<td>@</td> 

Lorsque la même transformation est appliquée sur le document XML suivant:

<function>false</function> 

à nouveau la bonne, résultat recherché est produit:

<td> </td> 

Enfin, en utilisant un hack (en XSLT 2.0/XPath 2.0 est pas nécessaire), on peut utiliser un seul modèle:

<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:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="function"> 
    <td> 
    <xsl:value-of select= 
    "concat(substring('@', 1 div (.='true')), 
      substring(' ', 1 div not(.='true')) 
     ) 
    "/> 
    </td> 
</xsl:template> 
</xsl:stylesheet> 
+0

Je pense que l'utilisation de conditions est préférable que d'avoir à écrire la condition deux fois. – svick

+0

@svick: L'alternative que vous pensez est meilleure a une composition beaucoup plus basse (probablement proche de zéro). En outre, il a une complexité beaucoup plus grande et est nettement plus enclin à commettre des erreurs. –