1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2026-01-07 21:58:22 +03:00

updated do not dump document for which there have been no generated

* FEATURES: updated
* libxslt/xsltutils.c: do not dump document for which there have
  been no generated content
* tests/multiple/result.xml tests/namespaces/extra2.out: fixed
  test output accordingly
* libxslt/transform.c libxslt/preproc.c: added xsl:fallback support
* tests/REC/Makefile.am tests/REC/test-15-1.*: xsl:fallback test
* tests/xmlspec/Makefile.am tests/docbook/Makefile.am: cleanups
Daniel
This commit is contained in:
Daniel Veillard
2001-07-05 08:59:37 +00:00
parent ffc52efd1d
commit 15ea351154
13 changed files with 227 additions and 162 deletions

View File

@@ -1,3 +1,14 @@
Thu Jul 5 10:44:47 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
* FEATURES: updated
* libxslt/xsltutils.c: do not dump document for which there have
been no generated content
* tests/multiple/result.xml tests/namespaces/extra2.out: fixed
test output accordingly
* libxslt/transform.c libxslt/preproc.c: added xsl:fallback support
* tests/REC/Makefile.am tests/REC/test-15-1.*: xsl:fallback test
* tests/xmlspec/Makefile.am tests/docbook/Makefile.am: cleanups
Wed Jul 4 15:15:50 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
* libxslt/extension.[ch] libxslt/extra.[ch] libxslt/xsltInternals.h

View File

@@ -8,13 +8,13 @@ Stylesheet Constructs:
YES xsl:stylesheet
? id = id
NO extension-element-prefixes = tokens
YES extension-element-prefixes = tokens
NO exclude-result-prefixes = tokens
YES version = number
YES xsl:transform
? id = id
NO extension-element-prefixes = tokens
YES extension-element-prefixes = tokens
NO exclude-result-prefixes = tokens
YES version = number
@@ -181,7 +181,7 @@ YES pattern-separator = char
YES xsl:message
YES terminate = "yes" | "no"
NO xsl:fallback
YES xsl:fallback
General:
========
@@ -197,9 +197,9 @@ YES match="processing-instruction()|comment()"
YES Namespace
YES Mode
NO Extension Elements
YES Extension Elements
NO Extension Functions
YES Extension Functions
YES Attribute Value Templates
@@ -208,8 +208,8 @@ YES Result Tree Fragments
Functions:
==========
PARTIAL node-set document(object, node-set?)
PARTIAL node-set key(string, object)
YES node-set document(object, node-set?)
YES node-set key(string, object)
YES string format-number(number, string, string?)
YES node-set current()
YES string unparsed-entity-uri(string)

View File

@@ -1278,6 +1278,9 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr inst) {
} else if (IS_XSLT_NAME(inst, "decimal-format")) {
/* no computation needed */
return;
} else if (IS_XSLT_NAME(inst, "fallback")) {
/* no computation needed */
return;
} else if (IS_XSLT_NAME(inst, "document")) {
xsltDocumentComp(style, inst);
} else {

View File

@@ -865,7 +865,8 @@ xsltProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node) {
*/
void
xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
xmlNodePtr list, int real) {
xmlNodePtr list, int real)
{
xmlNodePtr cur = NULL, insert, copy = NULL;
xmlNodePtr oldInsert;
xmlNodePtr oldCurrent = NULL;
@@ -873,16 +874,16 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
xmlAttrPtr attrs;
if (list == NULL)
return;
return;
CHECK_STOPPED;
if (ctxt->templNr >= xsltMaxDepth) {
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: loop found ???\n");
xsltGenericError(xsltGenericErrorContext,
"try increasing xsltMaxDepth (--maxdepth)\n");
xsltDebug(ctxt, node, list, NULL);
return;
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: loop found ???\n");
xsltGenericError(xsltGenericErrorContext,
"try increasing xsltMaxDepth (--maxdepth)\n");
xsltDebug(ctxt, node, list, NULL);
return;
}
/*
@@ -891,8 +892,8 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
oldInsert = insert = ctxt->insert;
oldInst = ctxt->inst;
if (real) {
oldCurrent = ctxt->node;
ctxt->node = node;
oldCurrent = ctxt->node;
ctxt->node = node;
}
/*
@@ -900,159 +901,189 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
*/
cur = list;
while (cur != NULL) {
ctxt->inst = cur;
/*
* test, we must have a valid insertion point
*/
if (insert == NULL) {
ctxt->inst = cur;
/*
* test, we must have a valid insertion point
*/
if (insert == NULL) {
#ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: insert == NULL !\n");
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: insert == NULL !\n");
#endif
if (real)
ctxt->node = oldCurrent;
ctxt->inst = oldInst;
return;
}
if (real)
ctxt->node = oldCurrent;
ctxt->inst = oldInst;
return;
}
if (IS_XSLT_ELEM(cur)) {
/*
* This is an XSLT node
*/
xsltStylePreCompPtr info = (xsltStylePreCompPtr) cur->_private;
if (info == NULL) {
if (IS_XSLT_NAME(cur, "message")) {
xsltMessage(ctxt, node, cur);
} else {
xsltGenericError(xsltGenericDebugContext,
"xsltApplyOneTemplate: %s was not compiled\n",
cur->name);
}
goto skip_children;
}
if (info->func != NULL) {
ctxt->insert = insert;
info->func(ctxt, node, cur, info);
ctxt->insert = oldInsert;
goto skip_children;
}
if (IS_XSLT_ELEM(cur)) {
/*
* This is an XSLT node
*/
xsltStylePreCompPtr info = (xsltStylePreCompPtr) cur->_private;
if (IS_XSLT_NAME(cur, "variable")) {
xsltParseStylesheetVariable(ctxt, cur);
} else if (IS_XSLT_NAME(cur, "param")) {
xsltParseStylesheetParam(ctxt, cur);
} else if (IS_XSLT_NAME(cur, "message")) {
xsltMessage(ctxt, node, cur);
} else {
xsltGenericError(xsltGenericDebugContext,
"xsltApplyOneTemplate: problem with xsl:%s\n",
cur->name);
}
CHECK_STOPPED;
goto skip_children;
} else if ((cur->type == XML_TEXT_NODE) ||
(cur->type == XML_CDATA_SECTION_NODE)) {
/*
* This text comes from the stylesheet
* For stylesheets, the set of whitespace-preserving
* element names consists of just xsl:text.
*/
if (info == NULL) {
if (IS_XSLT_NAME(cur, "message")) {
xsltMessage(ctxt, node, cur);
} else {
xsltGenericError(xsltGenericDebugContext,
"xsltApplyOneTemplate: %s was not compiled\n",
cur->name);
}
goto skip_children;
}
if (info->func != NULL) {
ctxt->insert = insert;
info->func(ctxt, node, cur, info);
ctxt->insert = oldInsert;
goto skip_children;
}
if (IS_XSLT_NAME(cur, "variable")) {
xsltParseStylesheetVariable(ctxt, cur);
} else if (IS_XSLT_NAME(cur, "param")) {
xsltParseStylesheetParam(ctxt, cur);
} else if (IS_XSLT_NAME(cur, "message")) {
xsltMessage(ctxt, node, cur);
} else {
xsltGenericError(xsltGenericDebugContext,
"xsltApplyOneTemplate: problem with xsl:%s\n",
cur->name);
}
CHECK_STOPPED;
goto skip_children;
} else if ((cur->type == XML_TEXT_NODE) ||
(cur->type == XML_CDATA_SECTION_NODE)) {
/*
* This text comes from the stylesheet
* For stylesheets, the set of whitespace-preserving
* element names consists of just xsl:text.
*/
#ifdef WITH_XSLT_DEBUG_PROCESS
if (cur->type == XML_CDATA_SECTION_NODE)
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy CDATA text %s\n",
cur->content);
else if (cur->name == xmlStringTextNoenc)
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy unescaped text %s\n",
cur->content);
else
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy text %s\n", cur->content);
if (cur->type == XML_CDATA_SECTION_NODE)
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy CDATA text %s\n",
cur->content);
else if (cur->name == xmlStringTextNoenc)
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy unescaped text %s\n",
cur->content);
else
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy text %s\n",
cur->content);
#endif
copy = xmlNewText(cur->content);
if (copy != NULL) {
if ((cur->name == xmlStringTextNoenc) ||
(cur->type == XML_CDATA_SECTION_NODE))
copy->name = xmlStringTextNoenc;
xmlAddChild(insert, copy);
} else {
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: text copy failed\n");
}
} else if ((cur->type == XML_ELEMENT_NODE) &&
(cur->ns != NULL) && (cur->_private != NULL)) {
xsltTransformFunction function;
/*
* Flagged as an extension element
*/
function = (xsltTransformFunction)
xmlHashLookup2(ctxt->extElements, cur->name, cur->ns->href);
if (function == NULL) {
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: failed to find extension %s\n",
cur->name);
} else {
copy = xmlNewText(cur->content);
if (copy != NULL) {
if ((cur->name == xmlStringTextNoenc) ||
(cur->type == XML_CDATA_SECTION_NODE))
copy->name = xmlStringTextNoenc;
xmlAddChild(insert, copy);
} else {
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: text copy failed\n");
}
} else if ((cur->type == XML_ELEMENT_NODE) &&
(cur->ns != NULL) && (cur->_private != NULL)) {
xsltTransformFunction function;
/*
* Flagged as an extension element
*/
function = (xsltTransformFunction)
xmlHashLookup2(ctxt->extElements, cur->name,
cur->ns->href);
if (function == NULL) {
xmlNodePtr child;
int found = 0;
#ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: extension construct %s\n", cur->name);
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: unknown extension %s\n",
cur->name);
#endif
/*
* Search if there is fallbacks
*/
child = cur->children;
while (child != NULL) {
if ((IS_XSLT_ELEM(child)) &&
(IS_XSLT_NAME(child, "fallback"))) {
found = 1;
xsltApplyOneTemplate(ctxt, node, child->children,
1);
}
child = child->next;
}
if (!found) {
xsltGenericError(xsltGenericErrorContext,
"xsltApplyOneTemplate: failed to find extension %s\n",
cur->name);
}
} else {
#ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: extension construct %s\n",
cur->name);
#endif
ctxt->insert = insert;
function(ctxt, node, cur, cur->_private);
ctxt->insert = oldInsert;
}
goto skip_children;
} else if (cur->type == XML_ELEMENT_NODE) {
ctxt->insert = insert;
function(ctxt, node, cur, cur->_private);
ctxt->insert = oldInsert;
}
goto skip_children;
} else if (cur->type == XML_ELEMENT_NODE) {
#ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy node %s\n", cur->name);
xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyOneTemplate: copy node %s\n",
cur->name);
#endif
copy = xsltCopyNode(ctxt, cur, insert);
/*
* all the attributes are directly inherited
*/
if (cur->properties != NULL) {
attrs = xsltAttrListTemplateProcess(ctxt, copy,
cur->properties);
}
}
copy = xsltCopyNode(ctxt, cur, insert);
/*
* all the attributes are directly inherited
*/
if (cur->properties != NULL) {
attrs = xsltAttrListTemplateProcess(ctxt, copy,
cur->properties);
}
}
/*
* Skip to next node, in document order.
*/
if (cur->children != NULL) {
if (cur->children->type != XML_ENTITY_DECL) {
cur = cur->children;
if (copy != NULL)
insert = copy;
continue;
}
}
skip_children:
if (cur->next != NULL) {
cur = cur->next;
continue;
}
do {
cur = cur->parent;
insert = insert->parent;
if (cur == NULL)
break;
if (cur == list->parent) {
cur = NULL;
break;
}
if (cur->next != NULL) {
cur = cur->next;
break;
}
} while (cur != NULL);
/*
* Skip to next node, in document order.
*/
if (cur->children != NULL) {
if (cur->children->type != XML_ENTITY_DECL) {
cur = cur->children;
if (copy != NULL)
insert = copy;
continue;
}
}
skip_children:
if (cur->next != NULL) {
cur = cur->next;
continue;
}
do {
cur = cur->parent;
insert = insert->parent;
if (cur == NULL)
break;
if (cur == list->parent) {
cur = NULL;
break;
}
if (cur->next != NULL) {
cur = cur->next;
break;
}
} while (cur != NULL);
}
if (real)
ctxt->node = oldCurrent;
ctxt->node = oldCurrent;
ctxt->inst = oldInst;
}

View File

@@ -671,6 +671,8 @@ xsltSaveResultTo(xmlOutputBufferPtr buf, xmlDocPtr result,
if ((buf == NULL) || (result == NULL) || (style == NULL))
return(-1);
if (result->children == NULL)
return(0);
if ((style->methodURI != NULL) &&
((style->method == NULL) ||
@@ -828,6 +830,8 @@ xsltSaveResultToFilename(const char *URL, xmlDocPtr result,
if ((URL == NULL) || (result == NULL) || (style == NULL))
return(-1);
if (result->children == NULL)
return(0);
XSLT_GET_IMPORT_PTR(encoding, style, encoding)
if (encoding != NULL) {
@@ -869,6 +873,8 @@ xsltSaveResultToFile(FILE *file, xmlDocPtr result, xsltStylesheetPtr style) {
if ((file == NULL) || (result == NULL) || (style == NULL))
return(-1);
if (result->children == NULL)
return(0);
XSLT_GET_IMPORT_PTR(encoding, style, encoding)
if (encoding != NULL) {
@@ -911,6 +917,8 @@ xsltSaveResultToFd(int fd, xmlDocPtr result, xsltStylesheetPtr style) {
if ((fd < 0) || (result == NULL) || (style == NULL))
return(-1);
if (result->children == NULL)
return(0);
XSLT_GET_IMPORT_PTR(encoding, style, encoding)
if (encoding != NULL) {

View File

@@ -14,6 +14,7 @@ EXTRA_DIST = \
test-11.2-6.out test-11.2-6.xml test-11.2-6.xsl \
test-12.2-1.out test-12.2-1.xml test-12.2-1.xsl \
test-12.2-2.out test-12.2-2.xml test-12.2-2.xsl \
test-15-1.out test-15-1.xml test-15-1.xsl \
test-2.3-1.out test-2.3-1.xml test-2.3-1.xsl \
test-2.3-2.out test-2.3-2.xml test-2.3-2.xsl \
test-2.5-1.out test-2.5-1.xml test-2.5-1.xsl \

2
tests/REC/test-15-1.out Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0"?>
<doc>SUCCESS</doc>

1
tests/REC/test-15-1.xml Normal file
View File

@@ -0,0 +1 @@
<doc/>

11
tests/REC/test-15-1.xsl Normal file
View File

@@ -0,0 +1,11 @@
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="http://example.org/"
xsl:extension-element-prefixes="test"
version='1.0'>
<xsl:template match="/">
<test:test>
<xsl:fallback><doc>SUCCESS</doc></xsl:fallback>
</test:test>
</xsl:template>
</xsl:stylesheet>

View File

@@ -58,7 +58,7 @@ single:
xtchunk:
@(echo > .memdump)
@(for i in $(srcdir)/test/gdp-handbook.xml ; do \
echo "Texting HTML chunking on $$i :" ; \
echo "Testing HTML chunking on $$i :" ; \
html=$(srcdir)/result/html/`basename $$i .xml`.html; \
$(top_builddir)/libxslt/xsltproc -o $(srcdir)/result/xtchunk/html/gdp-handbook $(srcdir)/html/xtchunk.xsl $$i ; \
for html in $(srcdir)/result/xtchunk/html/*.html ; do \

View File

@@ -1,2 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

View File

@@ -1,4 +1,3 @@
Templates:
#0 name /
Variables:
<?xml version="1.0"?>

View File

@@ -12,13 +12,13 @@ all: test
test tests: $(top_builddir)/libxslt/xsltproc
@(echo > .memdump)
@($(top_builddir)/libxslt/xsltproc -timing $(srcdir)/REC-xml-2e.xsl $(srcdir)/REC-xml-20001006.xml > REC-xml-20001006.out 2> debug ; \
diff $(srcdir)/REC-xml-20001006.html REC-xml-20001006.out | grep -v 'id[0-9]' | grep -v -- '---' | grep -v 158 | grep -v 4031 ; \
diff $(srcdir)/REC-xml-20001006.html REC-xml-20001006.out | grep -v 'id[0-9]' | grep -v -- '---' | grep -v 100 | grep -v 3866 ; \
grep implemented debug | sort | uniq -c || true; \
grep " ms$$" debug || true; \
grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" || true;\
rm -f REC-xml-20001006.out)
@($(top_builddir)/libxslt/xsltproc -timing --param show.diff.markup 1 $(srcdir)/REC-xml-2e.xsl $(srcdir)/REC-xml-20001006.xml > REC-xml-20001006-review.out 2> debug ; \
diff $(srcdir)/REC-xml-20001006-review.html REC-xml-20001006-review.out | grep -v 'id[0-9]' | grep -v -- '---' | grep -v 158 | grep -v 4031 ; \
diff $(srcdir)/REC-xml-20001006-review.html REC-xml-20001006-review.out | grep -v 'id[0-9]' | grep -v -- '---' | grep -v 117 | grep -v 4066 ; \
grep implemented debug | sort | uniq -c || true; \
grep " ms$$" debug || true; \
grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" || true;\