http://gitorious.org/libxslt/libxslt/commit/ecb6bcb8d1b7e44842edde3929f412d46b40c89f?format=patch --- libxslt/functions.c 2012-10-08 12:49:09.000000000 +0000 +++ libxslt/functions.c.oden 2012-10-08 12:49:21.000000000 +0000 @@ -654,8 +654,9 @@ xsltFormatNumberFunction(xmlXPathParserC void xsltGenerateIdFunction(xmlXPathParserContextPtr ctxt, int nargs){ xmlNodePtr cur = NULL; - unsigned long val; - xmlChar str[20]; + long val; + xmlChar str[30]; + xmlDocPtr doc; if (nargs == 0) { cur = ctxt->context->node; @@ -694,9 +695,24 @@ xsltGenerateIdFunction(xmlXPathParserCon * Okay this is ugly but should work, use the NodePtr address * to forge the ID */ - val = (unsigned long)((char *)cur - (char *)0); - val /= sizeof(xmlNode); - sprintf((char *)str, "id%ld", val); + if (cur->type != XML_NAMESPACE_DECL) + doc = cur->doc; + else { + xmlNsPtr ns = (xmlNsPtr) cur; + + if (ns->context != NULL) + doc = ns->context; + else + doc = ctxt->context->doc; + + } + + val = (long)((char *)cur - (char *)doc); + if (val >= 0) { + sprintf((char *)str, "idp%ld", val); + } else { + sprintf((char *)str, "idm%ld", -val); + } valuePush(ctxt, xmlXPathNewString(str)); }