2009-07-13 9 views
7

J'ai une situation où le param ne sera pas défini, mais mes tentatives de capture & ne fonctionnent pas.XSLT: Paramètre de test pour savoir si elle a été définie

J'utilise les éléments suivants:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" /> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="not($prefix)"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>    
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

J'ai aussi essayé $ prefix = '' dans le premier test - ni travail. mais si j'utilise:

<xsl:value-of select="not($prefix)" /> 

... la valeur est vraie. Mais l'utiliser dans mon xsl: choose ne produit aucune sortie.

Répondre

0

Parmi les suggestions faites à ce jour, la seule solution qui a fonctionné était de mettre toujours la valeur du paramètre lorsqu'un appel au modèle est fait. Par exemple, auparavant j'avais:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

Cela a dû être changé à:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" select="'AcRec'" /> 
</xsl:apply-templates> 

Je voudrais vraiment savoir pourquoi ($ param) et $ param = '' ne pas travailler dans un test WHEN, mais je peux obtenir la valeur de not ($ param) dans une instruction xsl: value-of.

1

Remarque: ancienne réponse remplacée, vérifiez l'historique si vous le souhaitez.

L'entrée suivante:

<test xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="something"/> 
    <xs:complexType name="somethingElse"/> 
</test> 

Fed à XSLT suivante:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:template match="/"> 
     <xsl:for-each select="node()"> 
      <xsl:apply-templates/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="xs:complexType"> 
     <xsl:param name="prefix" /> 
     <xsl:variable name="prefix-no-core"> 
      <xsl:choose> 
       <xsl:when test="not($prefix)">AcRec</xsl:when> 
       <xsl:when test="$prefix = 'core'"/> 
       <xsl:when test="$prefix = 'AcRec'">AcRec</xsl:when>      
      </xsl:choose> 
     </xsl:variable> 

     <xs:complexType name="{concat($prefix-no-core, @name)}"/> 
    </xsl:template> 
</xsl:transform> 

donne le résultat suivant:

<xs:complexType name="AcRecsomething" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 
<xs:complexType name="AcRecsomethingElse" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

Je ne suis pas sûr de ce que vous êtes plus Vous cherchez ...

+0

Je dois soutenir la possibilité d'autres préfixes. –

+0

Je l'ai essayé - le xsl: sinon, il me donne des faux positifs, en appliquant le préfixe à ceux qu'il ne devrait pas. –

+0

Quand ne voulez-vous pas appliquer le préfixe? Encore une fois, donnez-nous le cas d'utilisation complet. Si prefix = core, vous ne voulez pas de préfixe. Si le préfixe n'est pas défini, vous voulez AcDec comme préfixe. Quel est l'autre cas? Voulez-vous utiliser le préfixe fourni ou souhaitez-vous ajouter manuellement un cas pour chaque préfixe "autorisé". Si oui, que se passe-t-il si l'appelant fournit un préfixe que vous ne reconnaissez pas? –

1

C'est un hack, mais j'ai réussi en enveloppant d'abord le paramètre avec la fonction normalize-space() avant de tester un param vide.

<xsl:value-of select="not(normalize-space($prefix))" /> 
+0

J'ai essayé cela comme une clause when - il gérait les faux positifs. –

8

Vous pouvez spécifier une valeur par défaut pour le paramètre, de cette façon, lorsqu'il n'est pas transmis, vous pouvez le vérifier.

Bien que dans votre exemple, il semblerait qu'une simple valeur par défaut simplifierait grandement les choses.

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'default-value'" /> <!-- SET default --> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="$prefix = 'default-value'"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

Appel comme celui-ci, et la valeur sera 'valeur par défaut':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

Appel comme celui-ci, et la valeur sera 'valeur passée':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" value="'passed-value'"/> 
</xsl:apply-templates> 

EDIT: Pour être complet, la forme simplifiée de l'exemple original est:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'AcRec'"/> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- defaults to 'AcRec' --> 
     <xsl:otherwise> 
     <xsl:value-of select="$prefix" /> 
     </xsl:otherwise>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 
+0

Si vous avez besoin d'une valeur par défaut d'un paramètre qui ne provient d'aucun élément XML (c'est-à-dire une valeur littérale codée en dur), utilisez la valeur littérale ' ici' –

Questions connexes