From 891681e3e948f31732229f53cb6db7215f740fc7 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Mon, 28 Mar 2016 16:02:18 +0200 Subject: [PATCH] Allow {URI}NCName syntax for user parameters Thanks to Richard Smith for the patch. Applied with minor changes. Fixes bug #764195. https://bugzilla.gnome.org/show_bug.cgi?id=764195 --- libxslt/variables.c | 40 +++++++++++++++++++++++++++------------- xsltproc/xsltproc.c | 1 + 2 files changed, 28 insertions(+), 13 deletions(-) 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");