2011-11-24 5 views
-1

jexslt attribuer une valeur variable chaîne littérale

<xsl:for-each select="ancestor-or-self::*"> 
    <xsl:variable name="expression" select="name()" ></xsl:variable> 
</xsl:for-each> 

ci-dessous je href et je veux définir la valeur de cette variable d'expression dans href #######

<a href="/myplan?expression={$expression}" class="deleteIcon">Delete</a> 

I également essayé avec:

<a href="concat('/myplan?expression={',$expression)}" class="deleteIcon">Delete</a> 

Aucun d'entre eux travaillé.

Quelqu'un peut-il m'aider à faire cela?

Fondamentalement ma tâche est de trouver l'expression pour le noeud courant et envoyer l'expression pour le même dans href?

Ajout Plus d'info:

<br/><xsl:for-each select="ancestor-or-self::*"> 
       <xsl:variable name="expression" select="name()" /> 
      </xsl:for-each> 
     <b><a href="{concat('/admin/eapp/deleteQuestions?expression=',$expression)}"></a>Click Me</b> 

quand code ci-dessus xsl est transformé donne ci-dessous erreur:

Variable or parameter 'expression' is undefined. 
+2

Lorsque vous dites que quelque chose ne fonctionne pas, dites toujours exactement ce que vous avez fait et exactement ce que l'effet était. Nous ne pouvons pas diagnostiquer un problème sans connaître les symptômes. Et ne montrez pas seulement le code qui ne fonctionne pas: expliquez ce que vous essayiez d'accomplir. –

+0

J'ai supprimé ma réponse précédente, car les nouvelles informations l'ont rendu non pertinent. Au lieu de cela, il semble que vous vouliez que l'expression contienne une liste concaténée de tous les noms d'ancêtres, mais je ne suis pas sûr. Pouvez-vous poster un exemple de XML, et aussi votre sortie attendue, donc il n'y a pas de doute? Merci. –

+0

Ma condition est la suivante: je veux envoyer le chemin du nœud actuel du nœud racine au serveur afin que je puisse utiliser ce chemin pour supprimer le nœud. Par exemple. supprimer la 5ème sous-catégorie de la 3ème catégorie du xml. Donc ce que je fais c'est que je suis en train d'itérer sur la catagorie et dans la catagorie il y a un autre itérateur sur la subcatagorie. Maintenant, je veux trouver xpath de noeud dans cette sous-catégorie. –

Répondre

0

Très simplement, les variables sont SCOPED en XSL et existent uniquement dans l'étiquette contenant. Ainsi, la variable nommée expression existe uniquement dans le bloc for-each. De plus, les variables ne peuvent être définies qu'une seule fois. Tenter de définir une valeur de variable une deuxième fois n'a aucun effet. Par conséquent, vous devez déclarer la variable au niveau ou au-dessus du niveau où vous voulez l'utiliser et mettre tout le code pour générer la valeur dans la déclaration de variable. Si vous pouvez utiliser XSLT2, ce qui suit va faire ce que vous voulez:

string-join(for $n in ancestor-or-self::* return name($n), '/') 

Je sais que cela peut aussi se faire dans XSLT 1 avec un modèle récursif, mais je ne dispose pas d'un exemple pratique.

1

En XSLT1.0, vous pouvez essayer de régler la variable comme ceci:

<xsl:variable name="expression"> 
    <xsl:for-each select="ancestor-or-self::*"> 
     <xsl:text>/</xsl:text> 
     <xsl:variable name="name" select="name()"/> 
     <xsl:value-of select="$name"/> 
    </xsl:for-each> 
    </xsl:variable> 

Donc, en supposant que la structure XML suivant

<As> 
    <a> 
     <Bs> 
     <b>5</b> 
     </Bs> 
    </a> 
    <a> 
     <Bs> 
     <b>9</b> 
     </Bs> 
    </a> 
    <a/> 
    <a> 
     <Bs> 
     <b>12</b> 
     <b>14</b> 
     <b>15</b> 
     </Bs> 
    </a> 
</As> 

Si vous positionné sur l'élément b avec la valeur de 14, puis l'expression serait définie sur /As/a/Bs/b

Cependant, cela ne prend pas en compte plusieurs nœuds avec le même nom, et ne serait donc pas suffisant si vous vouliez que XPath précise le nœud.

Au lieu de cela, vous pouvez essayer les éléments suivants:

<xsl:variable name="expression"> 
    <xsl:for-each select="ancestor-or-self::*"> 
     <xsl:text>/</xsl:text> 
     <xsl:variable name="name" select="name()"/> 
     <xsl:value-of select="$name"/> 
     <xsl:text>[</xsl:text> 
     <xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/> 
     <xsl:text>]</xsl:text> 
    </xsl:for-each> 
    </xsl:variable> 

Cela retournerait /As [1]/a [4]/hôtes [1]/b [2], qui peut être ce que vous vouloir.

Questions connexes