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:?
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
J'utilise Saxon. –