mirror of
https://gitlab.gnome.org/GNOME/libxslt
synced 2025-07-29 15:41:13 +03:00
Fixes the problems exposed by #73880 those ought to be computed at
* libxslt/pattern.c: Fixes the problems exposed by #73880 those ought to be computed at stylesheet compile time, not at run-time, and the computation was wrong. * libxslt/transform.c: get rid of fake nodes coming from node-set transformations. At least if they are still produced they will become easy to spot as resulting document won't be well-formed. Daniel
This commit is contained in:
@ -1,3 +1,12 @@
|
|||||||
|
Fri Mar 8 14:51:59 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* libxslt/pattern.c: Fixes the problems exposed by #73880
|
||||||
|
those ought to be computed at stylesheet compile time, not
|
||||||
|
at run-time, and the computation was wrong.
|
||||||
|
* libxslt/transform.c: get rid of fake nodes coming from node-set
|
||||||
|
transformations. At least if they are still produced they will
|
||||||
|
become easy to spot as resulting document won't be well-formed.
|
||||||
|
|
||||||
Thu Mar 7 17:01:21 CET 2002 Daniel Veillard <daniel@veillard.com>
|
Thu Mar 7 17:01:21 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* libxslt/extensions.c: fixed bug #73791 related to extension
|
* libxslt/extensions.c: fixed bug #73791 related to extension
|
||||||
|
@ -268,6 +268,9 @@ xsltCompMatchAdd(xsltParserContextPtr ctxt, xsltCompMatchPtr comp,
|
|||||||
comp->steps[comp->nbStep].lenExtra =
|
comp->steps[comp->nbStep].lenExtra =
|
||||||
xsltAllocateExtra(ctxt->style);
|
xsltAllocateExtra(ctxt->style);
|
||||||
}
|
}
|
||||||
|
if (op == XSLT_OP_PREDICATE) {
|
||||||
|
comp->steps[comp->nbStep].comp = xmlXPathCompile(value);
|
||||||
|
}
|
||||||
comp->nbStep++;
|
comp->nbStep++;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -286,6 +289,7 @@ xsltSwapTopCompMatch(xsltCompMatchPtr comp) {
|
|||||||
if (j > 0) {
|
if (j > 0) {
|
||||||
register xmlChar *tmp;
|
register xmlChar *tmp;
|
||||||
register xsltOp op;
|
register xsltOp op;
|
||||||
|
register xmlXPathCompExprPtr expr;
|
||||||
i = j - 1;
|
i = j - 1;
|
||||||
tmp = comp->steps[i].value;
|
tmp = comp->steps[i].value;
|
||||||
comp->steps[i].value = comp->steps[j].value;
|
comp->steps[i].value = comp->steps[j].value;
|
||||||
@ -296,6 +300,9 @@ xsltSwapTopCompMatch(xsltCompMatchPtr comp) {
|
|||||||
op = comp->steps[i].op;
|
op = comp->steps[i].op;
|
||||||
comp->steps[i].op = comp->steps[j].op;
|
comp->steps[i].op = comp->steps[j].op;
|
||||||
comp->steps[j].op = op;
|
comp->steps[j].op = op;
|
||||||
|
expr = comp->steps[i].comp;
|
||||||
|
comp->steps[i].comp = comp->steps[j].comp;
|
||||||
|
comp->steps[j].comp = expr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -313,6 +320,7 @@ xsltReverseCompMatch(xsltCompMatchPtr comp) {
|
|||||||
while (j > i) {
|
while (j > i) {
|
||||||
register xmlChar *tmp;
|
register xmlChar *tmp;
|
||||||
register xsltOp op;
|
register xsltOp op;
|
||||||
|
register xmlXPathCompExprPtr expr;
|
||||||
tmp = comp->steps[i].value;
|
tmp = comp->steps[i].value;
|
||||||
comp->steps[i].value = comp->steps[j].value;
|
comp->steps[i].value = comp->steps[j].value;
|
||||||
comp->steps[j].value = tmp;
|
comp->steps[j].value = tmp;
|
||||||
@ -322,6 +330,9 @@ xsltReverseCompMatch(xsltCompMatchPtr comp) {
|
|||||||
op = comp->steps[i].op;
|
op = comp->steps[i].op;
|
||||||
comp->steps[i].op = comp->steps[j].op;
|
comp->steps[i].op = comp->steps[j].op;
|
||||||
comp->steps[j].op = op;
|
comp->steps[j].op = op;
|
||||||
|
expr = comp->steps[i].comp;
|
||||||
|
comp->steps[i].comp = comp->steps[j].comp;
|
||||||
|
comp->steps[j].comp = expr;
|
||||||
j--;
|
j--;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -800,22 +811,9 @@ xsltTestCompMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||||||
|
|
||||||
if (step->value == NULL)
|
if (step->value == NULL)
|
||||||
goto wrong_index;
|
goto wrong_index;
|
||||||
|
if (step->comp == NULL)
|
||||||
|
goto wrong_index;
|
||||||
|
|
||||||
if (step->comp == NULL) {
|
|
||||||
step->comp = xmlXPathCompile(step->value);
|
|
||||||
if (step->comp == NULL)
|
|
||||||
goto wrong_index;
|
|
||||||
}
|
|
||||||
if (comp->nsList == NULL) {
|
|
||||||
int j = 0;
|
|
||||||
|
|
||||||
comp->nsList = xmlGetNsList(node->doc, node);
|
|
||||||
if (comp->nsList != NULL) {
|
|
||||||
while (comp->nsList[j] != NULL)
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
comp->nsNr = j;
|
|
||||||
}
|
|
||||||
if (!xsltEvalXPathPredicate(ctxt, step->comp, comp->nsList,
|
if (!xsltEvalXPathPredicate(ctxt, step->comp, comp->nsList,
|
||||||
comp->nsNr))
|
comp->nsNr))
|
||||||
goto wrong_index;
|
goto wrong_index;
|
||||||
@ -1618,7 +1616,7 @@ xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
|
|||||||
xsltTransformContextPtr runtime) {
|
xsltTransformContextPtr runtime) {
|
||||||
xsltParserContextPtr ctxt = NULL;
|
xsltParserContextPtr ctxt = NULL;
|
||||||
xsltCompMatchPtr element, first = NULL, previous = NULL;
|
xsltCompMatchPtr element, first = NULL, previous = NULL;
|
||||||
int current, start, end, level;
|
int current, start, end, level, j;
|
||||||
|
|
||||||
if (pattern == NULL) {
|
if (pattern == NULL) {
|
||||||
xsltPrintErrorContext(NULL, NULL, node); /* TODO */
|
xsltPrintErrorContext(NULL, NULL, node); /* TODO */
|
||||||
@ -1677,6 +1675,14 @@ xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
|
|||||||
goto error;
|
goto error;
|
||||||
ctxt->cur = &(ctxt->base)[current - start];
|
ctxt->cur = &(ctxt->base)[current - start];
|
||||||
element->pattern = ctxt->base;
|
element->pattern = ctxt->base;
|
||||||
|
element->nsList = xmlGetNsList(doc, node);
|
||||||
|
j = 0;
|
||||||
|
if (element->nsList != NULL) {
|
||||||
|
while (element->nsList[j] != NULL)
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
element->nsNr = j;
|
||||||
|
|
||||||
|
|
||||||
#ifdef WITH_XSLT_DEBUG_PATTERN
|
#ifdef WITH_XSLT_DEBUG_PATTERN
|
||||||
xsltGenericDebug(xsltGenericDebugContext,
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
@ -654,6 +654,13 @@ xsltCopyTree(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||||||
case XML_XINCLUDE_END:
|
case XML_XINCLUDE_END:
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
if (xmlStrEqual(node->name, (const xmlChar *) "fake node libxslt")) {
|
||||||
|
if (node->children != NULL)
|
||||||
|
copy = xsltCopyTreeList(ctxt, node->children, insert);
|
||||||
|
else
|
||||||
|
copy = NULL;
|
||||||
|
return(copy);
|
||||||
|
}
|
||||||
copy = xmlCopyNode(node, 0);
|
copy = xmlCopyNode(node, 0);
|
||||||
copy->doc = ctxt->output;
|
copy->doc = ctxt->output;
|
||||||
if (copy != NULL) {
|
if (copy != NULL) {
|
||||||
@ -1009,6 +1016,16 @@ xsltProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||||||
xsltTemplatePtr template;
|
xsltTemplatePtr template;
|
||||||
xmlNodePtr oldNode;
|
xmlNodePtr oldNode;
|
||||||
|
|
||||||
|
if (xmlStrEqual(node->name, BAD_CAST "fake node libxslt")) {
|
||||||
|
xmlNodePtr children;
|
||||||
|
|
||||||
|
children = node->children;
|
||||||
|
while (children != NULL) {
|
||||||
|
xsltProcessOneNode(ctxt, children, params);
|
||||||
|
children = children->next;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
template = xsltGetTemplate(ctxt, node, NULL);
|
template = xsltGetTemplate(ctxt, node, NULL);
|
||||||
/*
|
/*
|
||||||
* If no template is found, apply the default rule.
|
* If no template is found, apply the default rule.
|
||||||
@ -1951,6 +1968,9 @@ xsltCopy(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||||||
case XML_HTML_DOCUMENT_NODE:
|
case XML_HTML_DOCUMENT_NODE:
|
||||||
break;
|
break;
|
||||||
case XML_ELEMENT_NODE:
|
case XML_ELEMENT_NODE:
|
||||||
|
if (xmlStrEqual(node->name, BAD_CAST "fake node libxslt"))
|
||||||
|
return;
|
||||||
|
|
||||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||||
xsltGenericDebug(xsltGenericDebugContext,
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
"xsltCopy: node %s\n", node->name);
|
"xsltCopy: node %s\n", node->name);
|
||||||
@ -2717,9 +2737,9 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* no break on purpose */
|
/* no break on purpose */
|
||||||
|
case XML_ELEMENT_NODE:
|
||||||
case XML_DOCUMENT_NODE:
|
case XML_DOCUMENT_NODE:
|
||||||
case XML_HTML_DOCUMENT_NODE:
|
case XML_HTML_DOCUMENT_NODE:
|
||||||
case XML_ELEMENT_NODE:
|
|
||||||
case XML_CDATA_SECTION_NODE:
|
case XML_CDATA_SECTION_NODE:
|
||||||
case XML_PI_NODE:
|
case XML_PI_NODE:
|
||||||
case XML_COMMENT_NODE:
|
case XML_COMMENT_NODE:
|
||||||
|
@ -359,7 +359,7 @@ xsltEvalVariable(xsltTransformContextPtr ctxt, xsltStackElemPtr elem,
|
|||||||
xmlNodePtr oldInsert;
|
xmlNodePtr oldInsert;
|
||||||
|
|
||||||
container = xmlNewDocNode(ctxt->document->doc, NULL,
|
container = xmlNewDocNode(ctxt->document->doc, NULL,
|
||||||
(const xmlChar *) "fake", NULL);
|
(const xmlChar *) "fake node libxslt", NULL);
|
||||||
if (container == NULL)
|
if (container == NULL)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ xsltEvalGlobalVariable(xsltStackElemPtr elem, xsltTransformContextPtr ctxt) {
|
|||||||
xmlNodePtr oldInsert;
|
xmlNodePtr oldInsert;
|
||||||
|
|
||||||
container = xmlNewDocNode(ctxt->document->doc, NULL,
|
container = xmlNewDocNode(ctxt->document->doc, NULL,
|
||||||
(const xmlChar *) "fake", NULL);
|
(const xmlChar *) "fake node libxslt", NULL);
|
||||||
if (container == NULL)
|
if (container == NULL)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
|
||||||
|
@ -27,8 +27,6 @@ mylibs = \
|
|||||||
$(top_builddir)/libxslt/libxslt.la \
|
$(top_builddir)/libxslt/libxslt.la \
|
||||||
$(top_builddir)/libexslt/libexslt.la
|
$(top_builddir)/libexslt/libexslt.la
|
||||||
|
|
||||||
all: libxsltmod.so libxslt.py $(PYTHONSODV)
|
|
||||||
|
|
||||||
LDADD = -lxslt -lexslt
|
LDADD = -lxslt -lexslt
|
||||||
CFLAGS = -Wall -g
|
CFLAGS = -Wall -g
|
||||||
|
|
||||||
@ -39,9 +37,18 @@ libxsltmod_so_SOURCES =
|
|||||||
libxsltmod_so_LDFLAGS = $(mylibs) $(LIBS) -shared -Wl,-soname,libxsltmod.so
|
libxsltmod_so_LDFLAGS = $(mylibs) $(LIBS) -shared -Wl,-soname,libxsltmod.so
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libxsltmodule.la
|
noinst_LTLIBRARIES = libxsltmodule.la
|
||||||
libxsltmodule_la_SOURCES = libxslt.c types.c libxslt-py.c
|
libxsltmodule_la_SOURCES = $(srcdir)/libxslt.c $(srcdir)/types.c $(srcdir)/libxslt-py.c
|
||||||
|
|
||||||
libxsltmod.so: $(libxsltmodule_la_OBJECTS)
|
GENERATE = generator.py
|
||||||
|
API_DESC = $(top_srcdir)/doc/libxslt-api.xml $(srcdir)/libxslt-python-api.xml
|
||||||
|
GENERATED= $(srcdir)/libxsltclass.py \
|
||||||
|
$(srcdir)/libxslt-export.c \
|
||||||
|
$(srcdir)/libxslt-py.c \
|
||||||
|
$(srcdir)/libxslt-py.h
|
||||||
|
|
||||||
|
all: $(GENERATED) libxsltmod.so libxslt.py $(PYTHONSODV)
|
||||||
|
|
||||||
|
libxsltmod.so: $(libxsltmodule_la_OBJECTS) libxsltmodule.la
|
||||||
-(rm -f .libs/libxsltmod.so; \
|
-(rm -f .libs/libxsltmod.so; \
|
||||||
$(LINK) -o $@ $(libxsltmodule_la_OBJECTS) $(libxsltmod_so_LDFLAGS);\
|
$(LINK) -o $@ $(libxsltmodule_la_OBJECTS) $(libxsltmod_so_LDFLAGS);\
|
||||||
if [ -r .libs/libxsltmod.so ] ; then cp .libs/libxsltmod.so . ; fi)
|
if [ -r .libs/libxsltmod.so ] ; then cp .libs/libxsltmod.so . ; fi)
|
||||||
@ -57,13 +64,6 @@ install-data-local:
|
|||||||
-@(for doc in $(DOCS) ; \
|
-@(for doc in $(DOCS) ; \
|
||||||
do @INSTALL@ -m 0644 $$doc $(DESTDIR)$(DOCS_DIR) ; done)
|
do @INSTALL@ -m 0644 $$doc $(DESTDIR)$(DOCS_DIR) ; done)
|
||||||
|
|
||||||
GENERATE = generator.py
|
|
||||||
API_DESC = $(top_srcdir)/doc/libxslt-api.xml $(srcdir)/libxslt-python-api.xml
|
|
||||||
GENERATED= $(srcdir)/libxsltclass.py \
|
|
||||||
$(srcdir)/libxslt-export.c \
|
|
||||||
$(srcdir)/libxslt-py.c \
|
|
||||||
$(srcdir)/libxslt-py.h
|
|
||||||
|
|
||||||
$(GENERATED): $(srcdir)/$(GENERATE) $(API_DESC)
|
$(GENERATED): $(srcdir)/$(GENERATE) $(API_DESC)
|
||||||
cd $(srcdir) && $(PYTHON) $(GENERATE)
|
cd $(srcdir) && $(PYTHON) $(GENERATE)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user