diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | libxslt.spec.in | 6 | ||||
-rw-r--r-- | libxslt/templates.c | 75 | ||||
-rw-r--r-- | python/Makefile.am | 10 |
4 files changed, 80 insertions, 18 deletions
@@ -1,3 +1,10 @@ +Wed Aug 21 21:27:29 CEST 2002 Daniel Veillard <daniel@veillard.com> + + * libxslt/templates.c: fixed a bug w.r.t. namespace context when + doing the evaluation of attribute value templates + * libxslt.spec.in python/Makefile.am: fixed some troubles + with "make rpm" + Wed Aug 21 18:59:28 CEST 2002 Daniel Veillard <daniel@veillard.com> * python/libxslt.c: fixed the parameter order when calling diff --git a/libxslt.spec.in b/libxslt.spec.in index 569c9031..c56f92c9 100644 --- a/libxslt.spec.in +++ b/libxslt.spec.in @@ -79,7 +79,8 @@ rm -rf $RPM_BUILD_ROOT install -d $RPM_BUILD_ROOT%{_mandir}/man1 install -d $RPM_BUILD_ROOT%{_mandir}/man4 -make prefix=$RPM_BUILD_ROOT%{prefix} mandir=$RPM_BUILD_ROOT%{_mandir} install +make prefix=$RPM_BUILD_ROOT%{prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \ + install # # this is a bit ugly but tries to generate the bindings for all versions @@ -96,7 +97,8 @@ do make PYTHON="%{prefix}/bin/python$py_version" \ PYTHON_VERSION="$py_version" \ prefix=$RPM_BUILD_ROOT%{prefix} \ - mandir=$RPM_BUILD_ROOT%{_mandir} install) + mandir=$RPM_BUILD_ROOT%{_mandir} \ + install) fi done %clean diff --git a/libxslt/templates.c b/libxslt/templates.c index 221f6949..85aefd90 100644 --- a/libxslt/templates.c +++ b/libxslt/templates.c @@ -100,17 +100,21 @@ xsltEvalXPathPredicate(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp, } /** - * xsltEvalXPathString: + * xsltEvalXPathStringNs: * @ctxt: the XSLT transformation context * @comp: the compiled XPath expression + * @nsNr: the number of namespaces in the list + * @nsList: the list of in-scope namespaces to use * - * Process the expression using XPath and get a string + * Process the expression using XPath, allowing to pass a namespace mapping + * context and get a string * * Returns the computed string value or NULL, must be deallocated by the * caller. */ xmlChar * -xsltEvalXPathString(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp) { +xsltEvalXPathStringNs(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp, + int nsNr, xmlNsPtr *nsList) { xmlChar *ret = NULL; xmlXPathObjectPtr res; xmlNodePtr oldInst; @@ -128,8 +132,8 @@ xsltEvalXPathString(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp) { ctxt->xpathCtxt->node = ctxt->node; /* TODO: do we need to propagate the namespaces here ? */ - ctxt->xpathCtxt->namespaces = NULL; - ctxt->xpathCtxt->nsNr = 0; + ctxt->xpathCtxt->namespaces = nsList; + ctxt->xpathCtxt->nsNr = nsNr; res = xmlXPathCompiledEval(comp, ctxt->xpathCtxt); if (res != NULL) { if (res->type != XPATH_STRING) @@ -160,6 +164,21 @@ xsltEvalXPathString(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp) { } /** + * xsltEvalXPathString: + * @ctxt: the XSLT transformation context + * @comp: the compiled XPath expression + * + * Process the expression using XPath and get a string + * + * Returns the computed string value or NULL, must be deallocated by the + * caller. + */ +xmlChar * +xsltEvalXPathString(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp) { + return(xsltEvalXPathStringNs(ctxt, comp, 0, NULL)); +} + +/** * xsltEvalTemplateString: * @ctxt: the XSLT transformation context * @node: the stylesheet node @@ -202,20 +221,26 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt, xmlNodePtr node, } /** - * xsltAttrTemplateValueProcess: + * xsltAttrTemplateValueProcessNode: * @ctxt: the XSLT transformation context * @str: the attribute template node value + * @node: the node hosting the attribute + * @nsList: the list of in-scope namespaces to use * - * Process the given node and return the new string value. + * Process the given string, allowing to pass a namespace mapping + * context and return the new string value. * * Returns the computed string value or NULL, must be deallocated by the * caller. */ xmlChar * -xsltAttrTemplateValueProcess(xsltTransformContextPtr ctxt, const xmlChar *str) { +xsltAttrTemplateValueProcessNode(xsltTransformContextPtr ctxt, + const xmlChar *str, xmlNodePtr node) { xmlChar *ret = NULL; const xmlChar *cur; xmlChar *expr, *val; + xmlNsPtr *nsList = NULL; + int nsNr = 0; if (str == NULL) return(NULL); if (*str == 0) @@ -244,8 +269,18 @@ xsltAttrTemplateValueProcess(xsltTransformContextPtr ctxt, const xmlChar *str) { /* * TODO: keep precompiled form around */ + if (nsList == NULL) { + int i = 0; + + nsList = xmlGetNsList(node->doc, node); + if (nsList != NULL) { + while (nsList[i] != NULL) + i++; + nsNr = i; + } + } comp = xmlXPathCompile(expr); - val = xsltEvalXPathString(ctxt, comp); + val = xsltEvalXPathStringNs(ctxt, comp, nsNr, nsList); xmlXPathFreeCompExpr(comp); xmlFree(expr); if (val != NULL) { @@ -262,10 +297,28 @@ xsltAttrTemplateValueProcess(xsltTransformContextPtr ctxt, const xmlChar *str) { ret = xmlStrncat(ret, str, cur - str); } + if (nsList != NULL) + xmlFree(nsList); + return(ret); } /** + * xsltAttrTemplateValueProcess: + * @ctxt: the XSLT transformation context + * @str: the attribute template node value + * + * Process the given node and return the new string value. + * + * Returns the computed string value or NULL, must be deallocated by the + * caller. + */ +xmlChar * +xsltAttrTemplateValueProcess(xsltTransformContextPtr ctxt, const xmlChar *str) { + return(xsltAttrTemplateValueProcessNode(ctxt, str, NULL)); +} + +/** * xsltEvalAttrValueTemplate: * @ctxt: the XSLT transformation context * @node: the stylesheet node @@ -298,7 +351,7 @@ xsltEvalAttrValueTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node, * attribute content and the XPath precompiled expressions around */ - ret = xsltAttrTemplateValueProcess(ctxt, expr); + ret = xsltAttrTemplateValueProcessNode(ctxt, expr, node); #ifdef WITH_XSLT_DEBUG_TEMPLATES xsltGenericDebug(xsltGenericDebugContext, "xsltEvalAttrValueTemplate: %s returns %s\n", expr, ret); @@ -392,7 +445,7 @@ xsltAttrTemplateProcess(xsltTransformContextPtr ctxt, xmlNodePtr target, /* TODO: optimize if no template value was detected */ if (in != NULL) { - out = xsltAttrTemplateValueProcess(ctxt, in); + out = xsltAttrTemplateValueProcessNode(ctxt, in, cur->parent); ret = xmlSetNsProp(target, ns, cur->name, out); if (out != NULL) xmlFree(out); diff --git a/python/Makefile.am b/python/Makefile.am index 8e98ea35..94769446 100644 --- a/python/Makefile.am +++ b/python/Makefile.am @@ -42,11 +42,11 @@ libxslt.py: $(srcdir)/libxsl.py libxsltclass.py cat $(srcdir)/libxsl.py libxsltclass.py > libxslt.py install-data-local: - $(mkinstalldirs) $(DESTDIR)$(PYTHON_SITE_PACKAGES) - -@INSTALL@ -m 0644 libxslt.py $(DESTDIR)$(PYTHON_SITE_PACKAGES) - $(mkinstalldirs) $(DESTDIR)$(DOCS_DIR) - -@(for doc in $(DOCS) ; \ - do @INSTALL@ -m 0644 $$doc $(DESTDIR)$(DOCS_DIR) ; done) + $(mkinstalldirs) $(libdir)/python${PYTHON_VERSION}/site-packages + @INSTALL@ -m 0644 libxslt.py $(libdir)/python${PYTHON_VERSION}/site-packages + $(mkinstalldirs) $(DOCS_DIR) + @(for doc in $(DOCS) ; \ + do @INSTALL@ -m 0644 $$doc $(DOCS_DIR) ; done) GENERATE = generator.py API_DESC = $(top_srcdir)/doc/libxslt-api.xml $(srcdir)/libxslt-python-api.xml |