Bonjour,

Je souhaite appliquer deux transformation xpath successivement. L'idée générale est la suivante. Avec la première expression je récupère un ensemble de node. Ensuite pour chaque node de mon ensemble j'applique la seconde expression. Mon soucis est la suivant. Lors de la seconde évaluation, le node courant semble ne pas être pris en compte, je pense que c'est la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
subCtx->node = xpathNodes->nodesetval->nodeTab[row];
qui pose problème. Qu'est ce que vous en pensez ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
int xt_parseXmlResult(xmlDocPtr doc, const char *xpath, assoc_arrayc_t expr, arrayc_t *result)
{
    xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
 
    // Register namespaces ...
 
    /*
     * Evaluate main xpath expression
     */
   	xmlXPathObjectPtr xpathNodes = xmlXPathEvalExpression((xmlChar *)xpath, xpathCtx);
 
    /*
     * Now we apply the xpath expressions on each node returned by the first xpath request
     */
    // First loop is on the XML document as we have to create a new context each
    // time we change the document
    int nbDocs = xpathNodes->nodesetval->nodeNr;
 
    for (row = 0; row < nbDocs; row++)
    {
    	xmlXPathContextPtr  subCtx = xmlXPathNewContext(doc);
 
		// Register namespaces ...
 
    	// Update context to use the nodeset related to this row
    	subCtx->node = xpathNodes->nodesetval->nodeTab[row];
 
	    for (col = 0; col < expr.nbItems; col++)
	    {
	        // Evaluate expression
	        xpathRows = xmlXPathEvalExpression((xmlChar *)expr.itemList[col].val, subCtx);
 
	        result->data[(row + 1) * result->nbCols + col] = strdup((char *)xmlXPathCastToString(xpathRows)); 
	        xmlXPathFreeObject(xpathRows);
	    }
	    xmlXPathFreeContext(subCtx);
	    subCtx = NULL;
    }
 
    xmlFreeDoc(doc); 
    xmlXPathFreeContext(xpathCtx);
    xmlXPathFreeObject(xpathNodes);
    return 0;
}
ChaF