+Tue May 13 16:32:22 CEST 2008 Daniel Veillard <daniel@veillard.com>
+
+ * 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
+
Fri May 9 14:30:35 CEST 2008 Daniel Veillard <daniel@veillard.com>
* libxslt/documents.c libxslt/keys.c libxslt/xsltInternals.h
/**
* 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.
}
/**
+ * 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
xsltRegisterExtModule (const xmlChar *URI,
xsltExtInitFunction initFunc,
xsltExtShutdownFunction shutdownFunc);
-XSLTPUBFUN int XSLTCALL
+XSLTPUBFUN int XSLTCALL
xsltRegisterExtModuleFull
(const xmlChar * URI,
xsltExtInitFunction initFunc,
xsltStyleExtInitFunction styleInitFunc,
xsltStyleExtShutdownFunction styleShutdownFunc);
-XSLTPUBFUN int XSLTCALL
- xsltUnregisterExtModule (const xmlChar * URI);
+XSLTPUBFUN int XSLTCALL
+ xsltUnregisterExtModule (const xmlChar * URI);
XSLTPUBFUN void * XSLTCALL
xsltGetExtData (xsltTransformContextPtr ctxt,
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
static void
xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
{
- xmlNodePtr deleteNode;
+ xmlNodePtr deleteNode, styleelem;
int internalize = 0;
if ((style == NULL) || (cur == NULL))
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
}
/*
- * 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)) {
if (cur->next != NULL) {
cur = cur->next;
continue;
- }
+ }
do {
cur = cur->parent;
xmlFree(prop);
}
- cur = top->children;
-
/*
* process xsl:import elements
*/
+ cur = top->children;
while (cur != NULL) {
if (IS_BLANK_NODE(cur)) {
cur = cur->next;
bug-164.xml \
bug-165.xml \
bug-166.xml \
+ bug-167.xml \
character.xml \
array.xml \
items.xml
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 \
--- /dev/null
+Hello
\ No newline at end of file
--- /dev/null
+<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>
+