+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>
* libxslt/extensions.c: fixed bug #73791 related to extension
comp->steps[comp->nbStep].lenExtra =
xsltAllocateExtra(ctxt->style);
}
+ if (op == XSLT_OP_PREDICATE) {
+ comp->steps[comp->nbStep].comp = xmlXPathCompile(value);
+ }
comp->nbStep++;
return (0);
}
if (j > 0) {
register xmlChar *tmp;
register xsltOp op;
+ register xmlXPathCompExprPtr expr;
i = j - 1;
tmp = comp->steps[i].value;
comp->steps[i].value = comp->steps[j].value;
op = comp->steps[i].op;
comp->steps[i].op = comp->steps[j].op;
comp->steps[j].op = op;
+ expr = comp->steps[i].comp;
+ comp->steps[i].comp = comp->steps[j].comp;
+ comp->steps[j].comp = expr;
}
}
while (j > i) {
register xmlChar *tmp;
register xsltOp op;
+ register xmlXPathCompExprPtr expr;
tmp = comp->steps[i].value;
comp->steps[i].value = comp->steps[j].value;
comp->steps[j].value = tmp;
op = comp->steps[i].op;
comp->steps[i].op = comp->steps[j].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--;
i++;
}
if (step->value == NULL)
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,
comp->nsNr))
goto wrong_index;
xsltTransformContextPtr runtime) {
xsltParserContextPtr ctxt = NULL;
xsltCompMatchPtr element, first = NULL, previous = NULL;
- int current, start, end, level;
+ int current, start, end, level, j;
if (pattern == NULL) {
xsltPrintErrorContext(NULL, NULL, node); /* TODO */
goto error;
ctxt->cur = &(ctxt->base)[current - start];
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
xsltGenericDebug(xsltGenericDebugContext,
case XML_XINCLUDE_END:
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->doc = ctxt->output;
if (copy != NULL) {
xsltTemplatePtr template;
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);
/*
* If no template is found, apply the default rule.
case XML_HTML_DOCUMENT_NODE:
break;
case XML_ELEMENT_NODE:
+ if (xmlStrEqual(node->name, BAD_CAST "fake node libxslt"))
+ return;
+
#ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext,
"xsltCopy: node %s\n", node->name);
}
}
/* no break on purpose */
+ case XML_ELEMENT_NODE:
case XML_DOCUMENT_NODE:
case XML_HTML_DOCUMENT_NODE:
- case XML_ELEMENT_NODE:
case XML_CDATA_SECTION_NODE:
case XML_PI_NODE:
case XML_COMMENT_NODE:
xmlNodePtr oldInsert;
container = xmlNewDocNode(ctxt->document->doc, NULL,
- (const xmlChar *) "fake", NULL);
+ (const xmlChar *) "fake node libxslt", NULL);
if (container == NULL)
return(NULL);
xmlNodePtr oldInsert;
container = xmlNewDocNode(ctxt->document->doc, NULL,
- (const xmlChar *) "fake", NULL);
+ (const xmlChar *) "fake node libxslt", NULL);
if (container == NULL)
return(NULL);
$(top_builddir)/libxslt/libxslt.la \
$(top_builddir)/libexslt/libexslt.la
-all: libxsltmod.so libxslt.py $(PYTHONSODV)
-
LDADD = -lxslt -lexslt
CFLAGS = -Wall -g
libxsltmod_so_LDFLAGS = $(mylibs) $(LIBS) -shared -Wl,-soname,libxsltmod.so
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
+
+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
-libxsltmod.so: $(libxsltmodule_la_OBJECTS)
+all: $(GENERATED) libxsltmod.so libxslt.py $(PYTHONSODV)
+
+libxsltmod.so: $(libxsltmodule_la_OBJECTS) libxsltmodule.la
-(rm -f .libs/libxsltmod.so; \
$(LINK) -o $@ $(libxsltmodule_la_OBJECTS) $(libxsltmod_so_LDFLAGS);\
if [ -r .libs/libxsltmod.so ] ; then cp .libs/libxsltmod.so . ; fi)
-@(for doc in $(DOCS) ; \
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)
cd $(srcdir) && $(PYTHON) $(GENERATE)