diff --git a/libxslt/variables.c b/libxslt/variables.c index 3224116a..345123d6 100644 --- a/libxslt/variables.c +++ b/libxslt/variables.c @@ -1445,21 +1445,35 @@ xsltProcessUserParamInternal(xsltTransformContextPtr ctxt, /* * Name lookup */ - - name = xsltSplitQName(ctxt->dict, name, &prefix); href = NULL; - if (prefix != NULL) { - xmlNsPtr ns; - ns = xmlSearchNs(style->doc, xmlDocGetRootElement(style->doc), - prefix); - if (ns == NULL) { - xsltTransformError(ctxt, style, NULL, - "user param : no namespace bound to prefix %s\n", prefix); - href = NULL; - } else { - href = ns->href; - } + if (name[0] == '{') { + int len = 0; + + while ((name[len] != 0) && (name[len] != '}')) len++; + if (name[len] == 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); + if (prefix != NULL) { + xmlNsPtr ns; + + ns = xmlSearchNs(style->doc, xmlDocGetRootElement(style->doc), + prefix); + if (ns == NULL) { + xsltTransformError(ctxt, style, NULL, + "user param : no namespace bound to prefix %s\n", prefix); + href = NULL; + } else { + href = ns->href; + } + } } if (name == NULL) diff --git a/xsltproc/xsltproc.c b/xsltproc/xsltproc.c index ead38930..3c83abda 100644 --- a/xsltproc/xsltproc.c +++ b/xsltproc/xsltproc.c @@ -523,6 +523,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 a QName or a string of the form {URI}NCName.\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");