2011-07-14 4 views
2

Voici ce que je voudrais faire:JSTL - utiliser des variables dans un xpath?

<x:forEach var="node" select="$doc//*[name()='item']"> 
    <x:out select="*[name()='${nodeName}']" /> 
</x:forEach> 

Je veux sélectionner un noeud XML en fonction de la nodeName variable.

Le code ci-dessus ne fonctionne pas. La seule solution que je peux venir avec va comme ceci:

<x:forEach var="node" select="$doc//*[name()='item']/*"> 
    <c:set var="nameTest"><x:out select="name($node)" /></c:set> 
    <c:if test="${nameTest == nodeName}> 
     <x:out select="$node" /> 
    </c:if> 
</x:forEach> 

Ce qui est pas une solution élégante et me rend en fait un peu de colère à regarder.

Quelqu'un a de meilleures idées s'il vous plaît?

Et pour des moments de plaisir supplémentaires que je suis coincé en utilisant JSTL 1.0

+0

Ce code n'est pas du tout XSLT. Pourquoi avez-vous étiqueté la question comme "xslt"? –

Répondre

2

a trouvé la réponse:

Utilisation des données JSTL comme variables XPath

les variables Scoped peuvent être utilisées dans les expressions XPath ($ implicitObject: variableName) similaires à la façon dont ils sont utilisés dans EL ($ {implicitObject .Nom de variable}). Si l'objet implicite est omis, les étendues seront recherchées dans l'ordre standard. Notez que les notations "." Et "[]" ne peuvent pas être utilisées pour accéder aux propriétés du bean.

du JSTL Quick Reference Sheet (pdf)

Alors mon code devient:

<x:set var="theNode" select="*[name()=$pageScope:nodeName]" /> 
<x:out select="$theNode" /> 
0

XSLT a des paramètres lui-même, peut-être que cela pourrait vous aider. Je l'ai trouvé un exemple ici http://www.roseindia.net/jstl/param-xml-jstl-tag.shtml

Je vais essayer d'appliquer le concept à votre exemple

... 
<x:forEach select="$doc//*[name()='item']"> 
    <x:out select="*[name()='$nodeName']" /> 
</x:forEach> 
... 

Et puis lors de l'invocation:

<x:transform xml="your.xml" xslt="your.xsl"> 
    <x:param name="nodeName" value="${nodeName}" /> 
</x:transform> 

Je ne l'ai pas essayé, je ne pas avoir les outils à proximité. Et je n'ai pas votre code complet non plus :)

Bonne chance.

Questions connexes