2009-08-28 5 views
1

Existe-t-il un moyen d'utiliser les données du contexte actuel pour filtrer les nœuds ailleurs dans la source de statistiques.Dans XPATH, utilisez les données du contexte actuel pour filtrer d'autres données.

Par exemple, si j'ai XML:

<root> 
    <group1> 
     <inst> 
      <type>Foo</type> 
      <value>First Foo</value> 
     </inst> 
     <inst> 
      <type>Bar</type> 
      <value>The Bar</value> 
     </inst> 
     <inst> 
      <type>Foo</type> 
      <value>Second Foo</value> 
     </inst> 
    </group1> 
    <group2> 
     <Filter> 
      <FilterType>Foo</FilterType> 
     </Filter> 
     <Filter> 
      <FilterType>Bar</FilterType> 
     </Filter> 
    </group2> 
</root> 

En supposant que mon contexte est l'une des balises de filtre, je veux retourner obtenir le nombre d'instances du type spécifié dans groupe1. Je voudrais écrire XPath qui ressemble à ceci:

count(/root/group1/inst[type = **FilterType**]) 

Est-ce que je peux utiliser pour obtenir le FilterType dans le contexte original?

Répondre

1

Cela peut se faire facilement dans XPath 2.0:

for $type in /*/*/Filter[1]/FilterType 
    return 
    count(/*/group1/*[type eq $type]) 

Lorsque cette expression XPath est évaluée par rapport au document XML fourni, le résultat correct est retourné:

Dans XPath 1.0, si le nombre d'éléments group1/inst est connu à l'avance, et $ vType représente le FilterType en question, alors on pourrait co nstruct l'expression suivante XPath 1.0:

($vType = /*/group1/inst[1]/type) 
+ 
    ($vType = /*/group1/inst[2]/type) 
+ 
    ($vType = /*/group1/inst[3]/type) 

qui produit à nouveau:

2.

Enfin, si l'expression XPath 1.0 est nécessaire XSLT et le "filtre" est le noeud courant,

alors l'expression XPath suivante calcule le nombre exact de matches:

count(/*/group1/inst[type = curent()/FilterType]) 
0

Je suis à la recherche d'une solution au même problème. À l'heure actuelle, j'utilise une variable pour la route autour de cette ... ce serait ressembler à quelque chose comme ce qui suit

<xsl:variable name='FilterType'><xsl:value-of select='FilterType'/></xsl:variable> 
<xsl:value-of select='count(/root/group1/inst[type = $FilterType])'/> 

Mais il doit y avoir une meilleure façon.

Questions connexes