2 votes

Equivalent pour Variable avec expression de sélection et contenu non vide dans XSLT 1.0

J'ai un modèle (que je ne peux pas changer mais que je dois utiliser), qui traite le nœud actuellement sélectionné, il pourrait ressembler à ceci (fortement simplifié) :

<xsl:template name="foreignTemplate">
    <xsl:value-of select="." />
</xsl:template>

En XSLT 2.0, je pourrais faire quelque chose comme ceci pour lier "." dans ce modèle à une variable arbitraire :

<xsl:template match="dummyNode">
    <xsl:variable name="inputString">foobar</xsl:variable>
    <xsl:variable name="result" select="$inputString">
        <xsl:call-template name="foreignTemplate" />
    </xsl:variable>
</xsl:template>

Étant donné ce document source :

<?xml version="1.0"?>
<dummyNode>DUMMY TEXT</dummyNode>

L'application de la transformation ci-dessus avec un processeur XSLT 2.0 donnerait "foobar".

Cependant, dans XSLT 1.0, xsl:variable-Elements ne peut pas avoir un attribut select et être non vide en même temps. Comment puis-je obtenir le même résultat en XSLT 1.0 ?

1voto

dans XSLT 1.0 xsl:variable-Elements ne peuvent pas avoir un attribut select et être non vide en même temps

D'abord, il en va de même pour XSLT 2.0 (et pour toutes les instructions qui ont un @select et permettent un constructeur de séquence dans XSLT 2.0)

Deuxièmement, si vous souhaitez modifier le nœud de contexte (ou l'élément de contexte dans XSLT 2.0) avant d'appeler un modèle de nom, vous devez le faire :

<xsl:for-each select="$here-the-context-you-want"> 
    <xsl:call-template name="foreignTemplate" /> 
</xsl:for-each>

1voto

Dimitre Novatchev Points 147842

En XSLT 2.0, je pouvais faire quelque chose comme ceci pour lier "." dans ce modèle à une variable arbitraire :

<xsl:template match="dummyNode"> 
    <xsl:variable name="inputString">foobar</xsl:variable>

    <xsl:variable name="result" select="$inputString"> 
        <xsl:call-template name="foreignTemplate" /> 
    </xsl:variable> 
</xsl:template>

Ce n'est pas vrai. .

Dans les versions 1.0 et 2.0 de XSLT, l'option <xsl:variable> peut avoir soit un select ou un corps (constructeur de séquence), mais avoir les deux en même temps est une erreur.

Dans le document XSLT 2.0 spec : "[ERR XTSE0620] C'est une erreur statique si un élément de liaison de variable a un attribut select et a un contenu non vide ."

Je recommande le style d'écriture suivant :

Dans XSLT 1.0 : Ne vous fiez pas au nœud de contexte comme paramètre implicite. Utilisez des paramètres explicites :

<xsl:template name="foreignTemplate">  
  <xsl:param name="pElement" />
  <xsl:value-of select="$pElement" />       
</xsl:template>

et dans un autre modèle, appelez-le comme ceci :

<xsl:call-template name="foreignTemplate">
 <xsl:with=param name="pElement" select="someExpression"/>
</xsl:call-template>

Dans XSLT 2.0 : Utilisez <xsl:function> au lieu de <xsl:template> :

<xsl:function name="my:foo" as="xs:string">
  <xsl:param name="pElement" as="element()"/>

  <xsl:sequence select="string($pElement)"/>
</xsl:function>

et l'appeler comme ceci dans le cadre de toute expression XPath :

  my:foo(someElement)

0voto

Jörn Horstmann Points 18118

Pour appliquer le modèle à une chaîne constante, vous pouvez utiliser un nodeset contenu dans votre feuille de style et y accéder à l'aide de la balise document fonction. Avec une chaîne vide comme paramètre, le résultat est le document de la feuille de style lui-même.

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://stackoverflow.com/questions/3423923/">
    <xsl:output method="xml" indent="yes" encoding="utf-8" />

    <foo:data>foobar</foo:data>

    <xsl:template name="foreignTemplate">
        <xsl:value-of select="." />
    </xsl:template>

    <xsl:template match="/">
        <xsl:for-each select="document('')/xsl:stylesheet/foo:data">
            <xsl:call-template name="foreignTemplate" />
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X