libxslt r1472 - in trunk: . libxslt tests/docs tests/general



Author: veillard
Date: Tue May 13 14:34:37 2008
New Revision: 1472
URL: http://svn.gnome.org/viewvc/libxslt?rev=1472&view=rev

Log:
* libxslt/xslt.c libxslt/extensions.c libxslt/extensions.h:
  fix the processing of top level elements of stylesheets which
  are not in the XSLT namespace and are not an extension either
  should fix #529223
* tests/docs/Makefile.am tests/docs/bug-167.xml
  tests/general/Makefile.am tests/general/bug-167.*: add the
  test to the regression suite
Daniel


Added:
   trunk/tests/docs/bug-167.xml
   trunk/tests/general/bug-167.out
   trunk/tests/general/bug-167.xsl
Modified:
   trunk/ChangeLog
   trunk/libxslt/extensions.c
   trunk/libxslt/extensions.h
   trunk/libxslt/xslt.c
   trunk/tests/docs/Makefile.am
   trunk/tests/general/Makefile.am

Modified: trunk/libxslt/extensions.c
==============================================================================
--- trunk/libxslt/extensions.c	(original)
+++ trunk/libxslt/extensions.c	Tue May 13 14:34:37 2008
@@ -1115,7 +1115,7 @@
 /**
  * xsltCheckExtPrefix:
  * @style: the stylesheet
- * @URI: the namespace URI (possibly NULL)
+ * @URI: the namespace prefix (possibly NULL)
  *
  * Check if the given prefix is one of the declared extensions.
  * This is intended to be called only at compile-time.
@@ -1173,6 +1173,37 @@
 }
 
 /**
+ * xsltCheckExtURI:
+ * @style: the stylesheet
+ * @URI: the namespace URI (possibly NULL)
+ *
+ * Check if the given prefix is one of the declared extensions.
+ * This is intended to be called only at compile-time.
+ * Called by:
+ *  xsltPrecomputeStylesheet() (xslt.c)
+ *  xsltParseTemplateContent (xslt.c)
+ *
+ * Returns 1 if this is an extension, 0 otherwise
+ */
+int
+xsltCheckExtURI(xsltStylesheetPtr style, const xmlChar * URI)
+{
+    xsltExtDefPtr cur;
+
+    if ((style == NULL) || (style->nsDefs == NULL))
+        return (0);
+    if (URI == NULL)
+        return (0);
+    cur = (xsltExtDefPtr) style->nsDefs;
+    while (cur != NULL) {
+        if (xmlStrEqual(URI, cur->URI))
+            return (1);
+        cur = cur->next;
+    }
+    return (0);
+}
+
+/**
  * xsltRegisterExtModuleFull:
  * @URI:  URI associated to this module
  * @initFunc:  the module initialization function

Modified: trunk/libxslt/extensions.h
==============================================================================
--- trunk/libxslt/extensions.h	(original)
+++ trunk/libxslt/extensions.h	Tue May 13 14:34:37 2008
@@ -75,7 +75,7 @@
 		xsltRegisterExtModule	(const xmlChar *URI,
 					 xsltExtInitFunction initFunc,
 					 xsltExtShutdownFunction shutdownFunc);
-XSLTPUBFUN int XSLTCALL		
+XSLTPUBFUN int XSLTCALL
 		xsltRegisterExtModuleFull
 					(const xmlChar * URI,
 					 xsltExtInitFunction initFunc,
@@ -83,8 +83,8 @@
 					 xsltStyleExtInitFunction styleInitFunc,
 					 xsltStyleExtShutdownFunction styleShutdownFunc);
 
-XSLTPUBFUN int XSLTCALL		
-    		xsltUnregisterExtModule	(const xmlChar * URI);
+XSLTPUBFUN int XSLTCALL
+		xsltUnregisterExtModule	(const xmlChar * URI);
 
 XSLTPUBFUN void * XSLTCALL		
 		xsltGetExtData		(xsltTransformContextPtr ctxt,
@@ -216,6 +216,9 @@
 XSLTPUBFUN int XSLTCALL		
 		xsltCheckExtPrefix	(xsltStylesheetPtr style,
 					 const xmlChar *URI);
+XSLTPUBFUN int XSLTCALL
+		xsltCheckExtURI		(xsltStylesheetPtr style,
+					 const xmlChar *URI);
 XSLTPUBFUN int XSLTCALL		
 		xsltInitCtxtExts	(xsltTransformContextPtr ctxt);
 XSLTPUBFUN void XSLTCALL		

Modified: trunk/libxslt/xslt.c
==============================================================================
--- trunk/libxslt/xslt.c	(original)
+++ trunk/libxslt/xslt.c	Tue May 13 14:34:37 2008
@@ -3397,7 +3397,7 @@
 static void
 xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
 {
-    xmlNodePtr deleteNode;
+    xmlNodePtr deleteNode, styleelem;
     int internalize = 0;
 
     if ((style == NULL) || (cur == NULL))
@@ -3408,6 +3408,14 @@
 	internalize = 1;
     else
         style->internalized = 0;
+
+    if ((cur != NULL) && (IS_XSLT_ELEM(cur)) &&
+        (IS_XSLT_NAME(cur, "stylesheet"))) {
+	styleelem = cur;
+    } else {
+        styleelem = NULL;
+    }
+
     /*
      * This content comes from the stylesheet
      * For stylesheets, the set of whitespace-preserving
@@ -3539,9 +3547,16 @@
 	}
 
 	/*
-	 * Skip to next node
+	 * Skip to next node. In case of a namespaced element children of
+	 * the stylesheet and not in the XSLT namespace and not an extension
+	 * element, ignore its content.
 	 */
-	if (cur->children != NULL) {
+	if ((cur->type == XML_ELEMENT_NODE) && (cur->ns != NULL) &&
+	    (styleelem != NULL) && (cur->parent == styleelem) &&
+	    (!xmlStrEqual(cur->ns->href, XSLT_NAMESPACE)) &&
+	    (!xsltCheckExtURI(style, cur->ns->href))) {
+	    goto skip_children;
+	} else if (cur->children != NULL) {
 	    if ((cur->children->type != XML_ENTITY_DECL) &&
 		(cur->children->type != XML_ENTITY_REF_NODE) &&
 		(cur->children->type != XML_ENTITY_NODE)) {
@@ -3554,7 +3569,7 @@
 	if (cur->next != NULL) {
 	    cur = cur->next;
 	    continue;
-	}	
+	}
 	do {
 
 	    cur = cur->parent;
@@ -6023,11 +6038,10 @@
 	xmlFree(prop);
     }
 
-    cur = top->children;
-
     /*
      * process xsl:import elements
      */
+    cur = top->children;
     while (cur != NULL) {
 	    if (IS_BLANK_NODE(cur)) {
 		    cur = cur->next;

Modified: trunk/tests/docs/Makefile.am
==============================================================================
--- trunk/tests/docs/Makefile.am	(original)
+++ trunk/tests/docs/Makefile.am	Tue May 13 14:34:37 2008
@@ -165,6 +165,7 @@
 	bug-164.xml \
 	bug-165.xml \
 	bug-166.xml \
+	bug-167.xml \
 	character.xml \
 	array.xml \
 	items.xml

Added: trunk/tests/docs/bug-167.xml
==============================================================================
--- (empty file)
+++ trunk/tests/docs/bug-167.xml	Tue May 13 14:34:37 2008
@@ -0,0 +1 @@
+<doc/>

Modified: trunk/tests/general/Makefile.am
==============================================================================
--- trunk/tests/general/Makefile.am	(original)
+++ trunk/tests/general/Makefile.am	Tue May 13 14:34:37 2008
@@ -174,6 +174,7 @@
     bug-164.out bug-164.xsl \
     bug-165.out bug-165.xsl bug-145.err \
     bug-166.out bug-166.xsl \
+    bug-167.out bug-167.xsl \
     character.out character.xsl \
     character2.out character2.xsl \
     itemschoose.out itemschoose.xsl \

Added: trunk/tests/general/bug-167.out
==============================================================================
--- (empty file)
+++ trunk/tests/general/bug-167.out	Tue May 13 14:34:37 2008
@@ -0,0 +1 @@
+Hello 
\ No newline at end of file

Added: trunk/tests/general/bug-167.xsl
==============================================================================
--- (empty file)
+++ trunk/tests/general/bug-167.xsl	Tue May 13 14:34:37 2008
@@ -0,0 +1,20 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
+                version="1.0">
+
+<xsl:output method="text"/>
+
+<xsl:template match="/">
+  <xsl:text>Hello </xsl:text>
+  <xsl:if test="false()">
+    <xsl:text>world</xsl:text>
+  </xsl:if>
+</xsl:template>
+
+<x:ignore xmlns:x="x">
+<xsl:template match="/">
+  <!--this better not be here!-->
+</xsl:template>
+</x:ignore>
+
+</xsl:stylesheet>
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]