Index: third_party/libxslt/libxslt/variables.c |
diff --git a/third_party/libxslt/libxslt/variables.c b/third_party/libxslt/libxslt/variables.c |
index 3224116a13744d1600602be2b54414199d70f307..345123d6ac144b1e15e0cfb60a21373e0a29aa95 100644 |
--- a/third_party/libxslt/libxslt/variables.c |
+++ b/third_party/libxslt/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) |