2009-07-10 7 views
2

Ce qui suit ne fonctionne pas comme prévu:XSLT: attribut conditionnel Valeur manipulation

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

    <xsl:if test="$prefix='core'"> 
    <xsl:variable name="prefix" select=""/> 
    </xsl:if> 

    <xs:complexType name="{concat($prefix, @name)}"> 
    <xsl:apply-templates select="node()" /> 
    </xs:complexType> 
    <xsl:apply-templates select=".//xs:element" /> 
</xsl:template> 

L'idée est que si la valeur de la variable préfixe est « core », je ne veux pas qu'il soit ajouté sur la nom valeur d'attribut. Toute autre valeur, j'aimerais être ajouté. IE:

<xs:complexType name="coreBirthType"> 

... est pas acceptable, alors que le suivant serait:

<xs:complexType name="BirthType"> 

Mais je dois permettre que cela se produise:

<xs:complexType name="AcRecHighSchoolType"> 

J'ai essayé ceci dans un bloc, mais saxon se plaint de ne pas trouver un noeud de fermeture:

<xsl:choose> 
    <xsl:when test="starts-with(.,'core')"> 
    <xs:complexType name="{@name)}"> 
    </xsl:when> 
    <xsl:otherwise> 
    <xs:complexType name="{concat($prefix, @name)}"> 
    </xsl:otherwise> 
</xsl:choose> 
    <xsl:apply-templates select="node()" /> 
</xs:complexType> 

Quelle est la meilleure façon de gérer cela?

Répondre

5

En XSLT, comme une langue pure, sans effets secondaires, les variables sont immuables. Vous ne pouvez pas modifier une valeur de variable. Si vous en déclarez un autre <xsl:variable> avec le même nom, vous définissez une nouvelle variable qui ombrera l'ancienne.

Voilà comment vous pouvez le faire:

<xsl:param name="prefix" /> 

<xsl:variable name="prefix-no-core"> 
    <xsl:if test="$prefix != 'core'"> 
    <xsl:value-of select="$prefix" /> 
    </xsl:if> 
</xsl:variable> 

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

Oui, une fois défini, vous ne pouvez pas reasign une valeur de préfixe. –

1

Eh bien, vous pouvez utiliser un if à l'intérieur de la variable; mais dans ce cas, je pense que je vais essayer <xsl:attribute>:

<xs:complexType> 
    <xsl:attribute name="name"><xsl:if test="$prefix != 'core'"><xsl:value-of select-"$prefix"/></xsl:if><xsl:value-of select="@name"/></xsl:attribute> 
    <!-- etc --> 
</xs:complexType> 

l'approche if:

<xsl:variable name="finalPrefix"><xsl:if test="$prefix != 'core'"><xsl:value-of select="$prefix"/></xsl:if></xsl:variable> 
... 
<xs:complexType name="{$finalPrefix}{@name}"> 
    <!-- etc --> 
</xs:complexType>