2009-07-14 12 views
0

Les travaux suivants pour moi:XSLT: xsl: la fonction ne fonctionne pas

<xsl:variable name="core" select="document('CoreMain_v1.4.0.xsd')" /> 
<xsl:variable name="AcRec" select="document('AcademicRecord_v1.3.0.xsd')" /> 

<xsl:template match="xs:element">  
    <xsl:variable name="prefix" select="substring-before(@type, ':')" /> 
    <xsl:variable name="name" select="substring-after(@type, ':')" /> 

    <xsl:choose> 
    <xsl:when test="$prefix = 'AcRec'">    
     <xsl:apply-templates select="$AcRec//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when> 
    <xsl:when test="$prefix = 'core'">    
     <xsl:apply-templates select="$core//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when>    
    </xsl:choose> 
</xsl:template> 

Mais j'utiliser la même logique pour gérer la recherche d'éléments dans les documents actuels ou d'autres basés sur le préfixe, correspondant à la nom de noeud à de nombreux endroits dans la feuille de style. Ainsi, après avoir changé la version 2.0 à stylesheet, j'ai essayé:

<xsl:template match="xs:element"> 
    <xsl:value-of select="my:lookup(@type)" /> 
</xsl:template> 

<xsl:function name="my:lookup"> 
    <xsl:param name="attribute" /> 

    <!-- parse the attribute for the prefix & name values --> 
    <xsl:variable name="prefix" select="substring-before($attribute, ':')" /> 
    <xsl:variable name="name" select="substring-after($attribute, ':')" /> 

    <!-- Switch statement based on the prefix value --> 
    <xsl:choose> 
    <xsl:when test="$prefix = 'AcRec'">    
     <xsl:apply-templates select="$AcRec//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when> 
    <xsl:when test="$prefix = 'core'">    
     <xsl:apply-templates select="$core//*[@name=$name]"> 
     <xsl:with-param name="prefix" select="$prefix" /> 
     </xsl:apply-templates>     
    </xsl:when>    
    </xsl:choose> 
</xsl:function> 

Dans ma lecture, je n'ai trouvé des exemples de fonctions qui renvoient texte - aucun des modèles d'appel. J'ai l'impression qu'une xsl: fonction devrait toujours retourner le texte/la sortie ...

Après plus d'investigation, il entre dans la fonction de recherche my: et les variables (préfixe & name) sont remplies. Donc, il entre dans l'instruction xsl: choose, et la frappe le test approprié. Le problème semble être avec le apply-templates-value-of affiche les valeurs enfant; copy-of fait aussi, ce que je pense est impair (la sortie ne devrait-elle pas inclure les déclarations d'éléments xml?). Pourquoi y aurait-il une différence si le code qui fonctionne dans une déclaration de modèle est déplacé vers une fonction xsl:?

+0

Quel moteur XSLT? Saxon ou Xalan ou autre chose? Notez que Xalan ne supporte pas XSLT 2.0, mais Saxon le fait. Xalan et Saxon prennent tous deux en charge les fonctions, mais ils se comportent différemment entre XSLT 1.0 et 2.0. – lavinio

+0

J'utilise Saxon. –

Répondre

2

Il a été un moment que je l'ai fait tout XSLT grave, mais IIRC votre problème n'est pas dans la fonction, mais dans votre modèle:

<xsl:template match="xs:element"> 
    <xsl:value-of select="my:lookup(@type)" /> 
</xsl:template> 

La déclaration value-of ne sera pas inline l'arbre résultat retourné par votre fonction. Au lieu de cela, il va essayer de réduire cet arbre de résultats en une sorte de chaîne, et en ligne à la place. C'est pourquoi vous voyez les valeurs de l'enfant et non les éléments eux-mêmes. Pour aligner l'arborescence des résultats renvoyée par votre fonction, vous devez utiliser certains modèles pour copier l'arborescence des résultats en place.

Ainsi, votre modèle principal devra changer à ceci:

<xsl:template match="xs:element"> 
    <xsl:apply-templates select="my:lookup(@type)" /> 
</xsl:template> 

et vous aurez besoin de quelques modèles pour faire l'appel récursif. Un google rapide trouvé a good discussion of the identity template qui devrait faire ce que vous avez besoin.

(S'il vous plaît pardonnez les erreurs de syntaxe, comme je le disais, il a été un moment ...)

+0

Rien à pardonner - vous êtes 100% correct, merci! –

Questions connexes