2010-08-31 2 views
2

Comment puis-je trouver avec Xsl tout le nœud qui ont un nom alors comme la valeur d'un autre noeud comme ceux-ci:xsl trouver tout le nœud qui ont un nom alors comme la valeur d'un autre noeud

<root> 
    <data1> 
     <subdata1> 
     ... 
     <selectThese></selectThese> 
     ... 
     </subdata1> 

    </data1> 
    <nodesetFind> 
     <node1>selectThese</node1> 
    </nodesetFind> 
    </root> 

le résultat: <selectThese></selectThese>

+0

Bonne question (+1). Voyez ma réponse pour une solution facile. :) –

Répondre

3

utilisation:

/*/data1//*[name() = /*/nodesetFind/*] 

démontrée dans un XS LT transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:copy-of select="/*/data1//*[name() = /*/nodesetFind/*]"/> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le document XML fourni:

<root> 
    <data1> 
     <subdata1> 
     ... 
     <selectThese></selectThese> 
     ... 
     </subdata1> 

    </data1> 
    <nodesetFind> 
     <node1>selectThese</node1> 
    </nodesetFind> 
    </root> 

le résultat recherché, correct est produit:

<selectThese></selectThese> 
+0

+1 bonne réponse. –

+0

@Alejandro, merci! Vous semblez avoir oublié le +1? :) –

+0

Vous êtes bien! Je dois me souvenir d'abord upvote et ensuite commenter ...;) –

1
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <xsl:variable name="find" select="//nodesetFind/node1" /> 
     <root> 
      <xsl:for-each select="//*[name()=$find]"> 
       <xsl:copy-of select="." /> 
      </xsl:for-each> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Le for-each est inutile ... vous pourriez faire ' '. Mais +1 parce qu'utile et correct. – LarsH

+0

@LarsH, vous avez raison. J'ai utilisé pour chaque impression de débogage et j'ai oublié de l'enlever. – VladV

3

Une autre façon, cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kDataByName" match="*[ancestor::data1]" use="name()"/> 
    <xsl:template match="/"> 
     <xsl:copy-of select="key('kDataByName',/root/nodesetFind/node1)"/> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<selectThese></selectThese> 

Remarque: Ceci est la solution XSLT uniquement (la réponse de Dimitre est XPath générale, puis XSLT) parce que l'utilisation de fn:key. Donc, vous devez déclarer la clé pour utiliser cette expression pour sélectionner les nœuds que vous voulez:

key('kDataByName',/root/nodesetFind/node1) 
+0

+1 pour la solution "plus avancée" :) –

+0

@Alejandro, Quand vous dites "Ceci est la seule solution XSLT", vous voulez dire que cette solution ne peut pas fonctionner sans XSLT, n'est-ce pas? Au début, je pensais que vous vouliez dire que cette solution n'exigeait pas XPath. Mais cela n'a pas de sens. – LarsH

+0

@LarsH: Oui. 'fn: key' est dans la portée uniquement pour XSLT. –

Questions connexes