1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2025-11-05 12:10:38 +03:00

cleaned up the code w.r.t. handling of 'non-standard' libxml element like

* libxslt/functions.c libxslt/keys.c libxslt/transform.c
  libxslt/xsltutils.h: cleaned up the code w.r.t. handling
  of 'non-standard' libxml element like namespace nodes.
* tests/docs/Makefile.am tests/docs/bug-54.xml
  tests/general/Makefile.am tests/general/bug-54.*: added a
  specific example in the regression tests
Daniel
This commit is contained in:
Daniel Veillard
2001-08-12 19:55:12 +00:00
parent 13d0776948
commit d4956ec17b
10 changed files with 105 additions and 29 deletions

View File

@@ -1,3 +1,12 @@
Sun Aug 12 21:53:13 CEST 2001 Daniel Veillard <daniel@veillard.com>
* libxslt/functions.c libxslt/keys.c libxslt/transform.c
libxslt/xsltutils.h: cleaned up the code w.r.t. handling
of 'non-standard' libxml element like namespace nodes.
* tests/docs/Makefile.am tests/docs/bug-54.xml
tests/general/Makefile.am tests/general/bug-54.*: added a
specific example in the regression tests
Wed Aug 8 22:57:05 CEST 2001 Daniel Veillard <daniel@veillard.com> Wed Aug 8 22:57:05 CEST 2001 Daniel Veillard <daniel@veillard.com>
* HACKING: added John Fleck right to commit in the doc subdir * HACKING: added John Fleck right to commit in the doc subdir

View File

@@ -189,7 +189,8 @@ xsltDocumentFunction(xmlXPathParserContextPtr ctxt, int nargs){
valuePush(ctxt, xmlXPathNewNodeSet(NULL)); valuePush(ctxt, xmlXPathNewNodeSet(NULL));
} else { } else {
if ((obj2 != NULL) && (obj2->nodesetval != NULL) && if ((obj2 != NULL) && (obj2->nodesetval != NULL) &&
(obj2->nodesetval->nodeNr > 0)) { (obj2->nodesetval->nodeNr > 0) &&
IS_XSLT_REAL_NODE(obj2->nodesetval->nodeTab[0])) {
xmlNodePtr target; xmlNodePtr target;
target = obj2->nodesetval->nodeTab[0]; target = obj2->nodesetval->nodeTab[0];

View File

@@ -405,29 +405,31 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr doc,
goto error; goto error;
for (i = 0;i < nodelist->nodeNr;i++) { for (i = 0;i < nodelist->nodeNr;i++) {
ctxt->node = nodelist->nodeTab[i]; if (IS_XSLT_REAL_NODE(nodelist->nodeTab[i])) {
str = xsltEvalXPathString(ctxt, keyd->usecomp); ctxt->node = nodelist->nodeTab[i];
if (str != NULL) { str = xsltEvalXPathString(ctxt, keyd->usecomp);
if (str != NULL) {
#ifdef WITH_XSLT_DEBUG_KEYS #ifdef WITH_XSLT_DEBUG_KEYS
xsltGenericDebug(xsltGenericDebugContext, xsltGenericDebug(xsltGenericDebugContext,
"xsl:key : node associated to(%s,%s)\n", "xsl:key : node associated to(%s,%s)\n",
keyd->name, str); keyd->name, str);
#endif #endif
keylist = xmlHashLookup(table->keys, str); keylist = xmlHashLookup(table->keys, str);
if (keylist == NULL) { if (keylist == NULL) {
keylist = xmlXPathNodeSetCreate(nodelist->nodeTab[i]); keylist = xmlXPathNodeSetCreate(nodelist->nodeTab[i]);
xmlHashAddEntry(table->keys, str, keylist); xmlHashAddEntry(table->keys, str, keylist);
} else {
xmlXPathNodeSetAdd(keylist, nodelist->nodeTab[i]);
}
nodelist->nodeTab[i]->_private = keyd;
xmlFree(str);
#ifdef WITH_XSLT_DEBUG_KEYS
} else { } else {
xmlXPathNodeSetAdd(keylist, nodelist->nodeTab[i]); xsltGenericDebug(xsltGenericDebugContext,
} "xsl:key : use %s failed to return a string\n",
nodelist->nodeTab[i]->_private = keyd; keyd->use);
xmlFree(str);
#ifdef WITH_XSLT_DEBUG_KEYS
} else {
xsltGenericDebug(xsltGenericDebugContext,
"xsl:key : use %s failed to return a string\n",
keyd->use);
#endif #endif
}
} }
} }

View File

@@ -586,6 +586,8 @@ xsltCopyTree(xsltTransformContextPtr ctxt, xmlNodePtr node,
return((xmlNodePtr) return((xmlNodePtr)
xsltCopyProp(ctxt, insert, (xmlAttrPtr) node)); xsltCopyProp(ctxt, insert, (xmlAttrPtr) node));
case XML_NAMESPACE_DECL: case XML_NAMESPACE_DECL:
if (insert->type != XML_ELEMENT_NODE)
return(NULL);
return((xmlNodePtr) return((xmlNodePtr)
xsltCopyNamespaceList(ctxt, insert, (xmlNsPtr) node)); xsltCopyNamespaceList(ctxt, insert, (xmlNsPtr) node));
@@ -912,7 +914,8 @@ xsltProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
/* /*
* Cleanup children empty nodes if asked for * Cleanup children empty nodes if asked for
*/ */
if ((node->children != NULL) && if ((IS_XSLT_REAL_NODE(node)) &&
(node->children != NULL) &&
(xsltFindElemSpaceHandling(ctxt, node))) { (xsltFindElemSpaceHandling(ctxt, node))) {
xmlNodePtr delete = NULL, cur = node->children; xmlNodePtr delete = NULL, cur = node->children;
@@ -2260,7 +2263,8 @@ xsltCopyOf(xsltTransformContextPtr ctxt, xmlNodePtr node,
#endif #endif
list = res->nodesetval; list = res->nodesetval;
if ((list != NULL) && (list->nodeTab != NULL) && if ((list != NULL) && (list->nodeTab != NULL) &&
(list->nodeTab[0] != NULL)) { (list->nodeTab[0] != NULL) &&
(IS_XSLT_REAL_NODE(list->nodeTab[0]))) {
xsltCopyTreeList(ctxt, list->nodeTab[0]->children, xsltCopyTreeList(ctxt, list->nodeTab[0]->children,
ctxt->insert); ctxt->insert);
} }
@@ -2682,9 +2686,10 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
ctxt->node = list->nodeTab[i]; ctxt->node = list->nodeTab[i];
ctxt->xpathCtxt->proximityPosition = i + 1; ctxt->xpathCtxt->proximityPosition = i + 1;
/* For a 'select' nodeset, need to check if document has changed */ /* For a 'select' nodeset, need to check if document has changed */
if ( (list->nodeTab[i]->doc!=NULL) && if ((IS_XSLT_REAL_NODE(list->nodeTab[i])) &&
(list->nodeTab[i]->doc->doc!=NULL) && (list->nodeTab[i]->doc!=NULL) &&
(list->nodeTab[i]->doc->doc)!=ctxt->xpathCtxt->doc) { (list->nodeTab[i]->doc->doc!=NULL) &&
(list->nodeTab[i]->doc->doc)!=ctxt->xpathCtxt->doc) {
/* The nodeset is from another document, so must change */ /* The nodeset is from another document, so must change */
ctxt->xpathCtxt->doc=list->nodeTab[i]->doc->doc; ctxt->xpathCtxt->doc=list->nodeTab[i]->doc->doc;
if ((ctxt->document = if ((ctxt->document =
@@ -2696,7 +2701,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
} }
ctxt->xpathCtxt->node = list->nodeTab[i]; ctxt->xpathCtxt->node = list->nodeTab[i];
#ifdef WITH_XSLT_DEBUG_PROCESS #ifdef WITH_XSLT_DEBUG_PROCESS
xsltGenericDebug(xsltGenericDebugContext, xsltGenericDebug(xsltGenericDebugContext,
"xsltApplyTemplates: Changing document - context doc %s, xpathdoc %s\n", "xsltApplyTemplates: Changing document - context doc %s, xpathdoc %s\n",
ctxt->document->doc->URL, ctxt->xpathCtxt->doc->URL); ctxt->document->doc->URL, ctxt->xpathCtxt->doc->URL);
#endif #endif
@@ -3016,9 +3021,10 @@ xsltForEach(xsltTransformContextPtr ctxt, xmlNodePtr node,
ctxt->node = list->nodeTab[i]; ctxt->node = list->nodeTab[i];
ctxt->xpathCtxt->proximityPosition = i + 1; ctxt->xpathCtxt->proximityPosition = i + 1;
/* For a 'select' nodeset, need to check if document has changed */ /* For a 'select' nodeset, need to check if document has changed */
if ( (list->nodeTab[i]->doc!=NULL) && if ((IS_XSLT_REAL_NODE(list->nodeTab[i])) &&
(list->nodeTab[i]->doc->doc!=NULL) && (list->nodeTab[i]->doc!=NULL) &&
(list->nodeTab[i]->doc->doc)!=ctxt->xpathCtxt->doc) { (list->nodeTab[i]->doc->doc!=NULL) &&
(list->nodeTab[i]->doc->doc)!=ctxt->xpathCtxt->doc) {
/* The nodeset is from another document, so must change */ /* The nodeset is from another document, so must change */
ctxt->xpathCtxt->doc=list->nodeTab[i]->doc->doc; ctxt->xpathCtxt->doc=list->nodeTab[i]->doc->doc;
if ((ctxt->document = if ((ctxt->document =

View File

@@ -60,6 +60,30 @@ extern "C" {
#define IS_XSLT_NAME(n, val) \ #define IS_XSLT_NAME(n, val) \
(xmlStrEqual((n)->name, (const xmlChar *) (val))) (xmlStrEqual((n)->name, (const xmlChar *) (val)))
/**
* IS_XSLT_REAL_NODE:
*
* check that a node is a 'real' one: document, element, text or attribute
*/
#ifdef LIBXML_DOCB_ENABLED
#define IS_XSLT_REAL_NODE(n) \
(((n) != NULL) && \
(((n)->type == XML_ELEMENT_NODE) || \
((n)->type == XML_TEXT_NODE) || \
((n)->type == XML_ATTRIBUTE_NODE) || \
((n)->type == XML_DOCUMENT_NODE) || \
((n)->type == XML_HTML_DOCUMENT_NODE) || \
((n)->type == XML_DOCB_DOCUMENT_NODE)))
#else
#define IS_XSLT_REAL_NODE(n) \
(((n) != NULL) && \
(((n)->type == XML_ELEMENT_NODE) || \
((n)->type == XML_TEXT_NODE) || \
((n)->type == XML_ATTRIBUTE_NODE) || \
((n)->type == XML_DOCUMENT_NODE) || \
((n)->type == XML_HTML_DOCUMENT_NODE)))
#endif
/* /*
* Our own version of namespaced atributes lookup * Our own version of namespaced atributes lookup
*/ */

View File

@@ -56,6 +56,7 @@ EXTRA_DIST = \
bug-50-.xml \ bug-50-.xml \
bug-52-.xml \ bug-52-.xml \
bug-53-.xml \ bug-53-.xml \
bug-54-.xml \
character.xml \ character.xml \
array.xml \ array.xml \
items.xml items.xml

5
tests/docs/bug-54.xml Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0"?>
<all>
<one xmlns="http://www.test1.com">1</one>
<two xmlns="http://www.test2.com">2</two>
</all>

View File

@@ -58,6 +58,7 @@ EXTRA_DIST = \
bug-50-.out bug-50-.xsl \ bug-50-.out bug-50-.xsl \
bug-52-.out bug-52-.xsl \ bug-52-.out bug-52-.xsl \
bug-53-.out bug-53-.xsl \ bug-53-.out bug-53-.xsl \
bug-54-.out bug-54-.xsl \
character.out character.xsl \ character.out character.xsl \
character2.out character2.xsl \ character2.out character2.xsl \
itemschoose.out itemschoose.xsl \ itemschoose.out itemschoose.xsl \

5
tests/general/bug-54.out Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:libxslt="http://xmlsoft.org/XSLT/namespace" xmlns:test1="http://www.test1.com" xmlns:test2="http://www.test2.com" xmlns="http://www.test1.com">
</root>

22
tests/general/bug-54.xsl Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:libxslt="http://xmlsoft.org/XSLT/namespace"
xmlns:test1="http://www.test1.com"
xmlns:test2="http://www.test2.com"
>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/all/*">
<xsl:for-each select="namespace::*">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
</xsl:stylesheet>