Return a xmlNodePtr on a node referenced by a XLink or NULL otherwise.
260{
261 char *id;
262 xmlNsPtr *ns, *n;
263 xmlXPathContext *ctx;
264 xmlXPathObject *xpath;
265 xmlNodePtr node, ret_node;
266 xmlChar *href, *p, *node_id;
267
268 href = xmlGetNsProp(xnode, (xmlChar *)
"href", (xmlChar *)
XLINK_NS);
269 id =
lwalloc((xmlStrlen(xnode->ns->prefix) * 2 + xmlStrlen(xnode->name)
270 + xmlStrlen(href) + sizeof("//:[@:id='']") + 1));
271 p = href;
272 p++;
273
274
275 sprintf(id, "//%s:%s[@%s:id='%s']", (char *) xnode->ns->prefix,
276 (char *) xnode->name,
277 (char *) xnode->ns->prefix,
278 (char *) p);
279
280 ctx = xmlXPathNewContext(xnode->doc);
281 if (ctx == NULL)
282 {
283 xmlFree(href);
285 return NULL;
286 }
287
288
289 ns = xmlGetNsList(xnode->doc, xnode);
290 for (n=ns ; *n; n++) xmlXPathRegisterNs(ctx, (*n)->prefix, (*n)->href);
291 xmlFree(ns);
292
293
294 xpath = xmlXPathEvalExpression((xmlChar *) id, ctx);
296 if (xpath == NULL || xpath->nodesetval == NULL || xpath->nodesetval->nodeNr != 1)
297 {
298 xmlFree(href);
299 xmlXPathFreeObject(xpath);
300 xmlXPathFreeContext(ctx);
301 return NULL;
302 }
303 ret_node = xpath->nodesetval->nodeTab[0];
304 xmlXPathFreeObject(xpath);
305 xmlXPathFreeContext(ctx);
306
307
308 for (node = xnode ; node != NULL ; node = node->parent)
309 {
310 if (node->type != XML_ELEMENT_NODE) continue;
312 if (node_id != NULL)
313 {
314 if (!xmlStrcmp(node_id, p))
316 xmlFree(node_id);
317 }
318 }
319
320 xmlFree(href);
321 return ret_node;
322}
void * lwalloc(size_t size)
static xmlChar * gmlGetProp(xmlNodePtr xnode, const char *charProp)
Retrieve a GML property from a node or NULL otherwise Respect namespaces if presents in the node elem...
static void gml_lwpgerror(char *msg, __attribute__((__unused__)) int error_code)