diff --git a/libxslt/variables.c b/libxslt/variables.c
index 3224116..886a80b 100644
--- a/libxslt/variables.c
+++ b/libxslt/variables.c
@@ -1427,6 +1427,7 @@ xsltProcessUserParamInternal(xsltTransformContextPtr ctxt,
     xsltStackElemPtr elem;
     int res;
     void *res_ptr;
+    int len = 0;
 
     if (ctxt == NULL)
 	return(-1);
@@ -1445,13 +1446,25 @@ xsltProcessUserParamInternal(xsltTransformContextPtr ctxt,
     /*
      * Name lookup
      */
+    href = NULL;
 
+    if (name[0] == '{') {
+        while ((name[len] != 0) && (name[len] != '}')) len++;
+        if (name[0] == 0) {
+	    xsltTransformError(ctxt, style, NULL,
+	    "user param : malformed parameter name : %s\n", name);
+        } else {
+	    href = xmlDictLookup(ctxt->dict, &name[1], len-1);
+	    name = xmlDictLookup(ctxt->dict, &name[len + 1], -1);
+	}
+    }
+    else {
 	name = xsltSplitQName(ctxt->dict, name, &prefix);
-    href = NULL;
 	if (prefix != NULL) {
 	    xmlNsPtr ns;
 
-	ns = xmlSearchNs(style->doc, xmlDocGetRootElement(style->doc),
+	    ns = xmlSearchNs(style->doc, 
+			     xmlDocGetRootElement(style->doc),
 			     prefix);
 	    if (ns == NULL) {
 		xsltTransformError(ctxt, style, NULL,
@@ -1461,6 +1474,7 @@ xsltProcessUserParamInternal(xsltTransformContextPtr ctxt,
 		href = ns->href;
 	    }
 	}
+    }
 
     if (name == NULL)
 	return (-1);
diff --git a/xsltproc/xsltproc.c b/xsltproc/xsltproc.c
index e39552a..8a79375 100644
--- a/xsltproc/xsltproc.c
+++ b/xsltproc/xsltproc.c
@@ -520,6 +520,7 @@ static void usage(const char *name) {
 #endif
     printf("\t--encoding: the input document character encoding\n");
     printf("\t--param name value : pass a (parameter,value) pair\n");
+    printf("\t       name is an QName or string of the form {URI}LocalPart.\n");
     printf("\t       value is an UTF8 XPath expression.\n");
     printf("\t       string values must be quoted like \"'string'\"\n or");
     printf("\t       use stringparam to avoid it\n");
