trying to fix namespaces + validation problems for good, closing #63619 in
* valid.c include/libxml/tree.h: trying to fix namespaces +
validation problems for good, closing #63619 in the process
* result/valid/dia.xml test/valid/dia.xml: the Dia test was
wrong in this respect, fixed it.
Daniel
diff --git a/ChangeLog b/ChangeLog
index ddff9a3..261e165 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Nov 9 00:34:13 CET 2001 Daniel Veillard <daniel@veillard.com>
+
+ * valid.c include/libxml/tree.h: trying to fix namespaces +
+ validation problems for good, closing #63619 in the process
+ * result/valid/dia.xml test/valid/dia.xml: the Dia test was
+ wrong in this respect, fixed it.
+
Thu Nov 8 18:31:40 CET 2001 Daniel Veillard <daniel@veillard.com>
* xmllint.c: Morus Walter patch to allow --format and --encode
diff --git a/include/libxml/tree.h b/include/libxml/tree.h
index 0eb694d..986890e 100644
--- a/include/libxml/tree.h
+++ b/include/libxml/tree.h
@@ -228,10 +228,11 @@
struct _xmlElementContent {
xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */
xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */
- const xmlChar *name; /* Element name */
+ const xmlChar *name; /* Element name */
struct _xmlElementContent *c1; /* first child */
struct _xmlElementContent *c2; /* second child */
struct _xmlElementContent *parent; /* parent */
+ const xmlChar *prefix; /* Element name */
};
/**
diff --git a/result/valid/dia.xml b/result/valid/dia.xml
index f7f1853..12282be 100644
--- a/result/valid/dia.xml
+++ b/result/valid/dia.xml
@@ -1,137 +1,137 @@
<?xml version="1.0"?>
-<!DOCTYPE diagram [
-<!ELEMENT diagram (diagramdata , layer*)>
-<!ELEMENT diagramdata (attribute)*>
-<!ELEMENT layer (object | group)*>
-<!ATTLIST layer name CDATA #REQUIRED>
-<!ATTLIST layer visible (true | false) #REQUIRED>
-<!ELEMENT object (attribute* , connections?)>
-<!ATTLIST object type CDATA #REQUIRED>
-<!ATTLIST object version NMTOKEN #REQUIRED>
-<!ATTLIST object id ID #REQUIRED>
-<!ELEMENT connections (connection)*>
-<!ELEMENT connection EMPTY>
-<!ATTLIST connection handle NMTOKEN #REQUIRED>
-<!ATTLIST connection to IDREF #REQUIRED>
-<!ATTLIST connection connection NMTOKEN #REQUIRED>
-<!ELEMENT group (object | group)*>
-<!ELEMENT attribute (composite | int | enum | real | boolean | color | point | rectangle | string | font)*>
-<!ATTLIST attribute name CDATA #REQUIRED>
-<!ELEMENT composite (attribute)*>
-<!ATTLIST composite type CDATA #IMPLIED>
-<!ELEMENT int EMPTY>
-<!ATTLIST int val NMTOKEN #REQUIRED>
-<!ELEMENT enum EMPTY>
-<!ATTLIST enum val NMTOKEN #REQUIRED>
-<!ELEMENT real EMPTY>
-<!ATTLIST real val CDATA #REQUIRED>
-<!ELEMENT boolean EMPTY>
-<!ATTLIST boolean val (true | false) #REQUIRED>
-<!ELEMENT color EMPTY>
-<!ATTLIST color val CDATA #REQUIRED>
-<!ELEMENT point EMPTY>
-<!ATTLIST point val CDATA #REQUIRED>
-<!ELEMENT rectangle EMPTY>
-<!ATTLIST rectangle val CDATA #REQUIRED>
-<!ELEMENT string EMPTY>
-<!ATTLIST string val CDATA #IMPLIED>
-<!ELEMENT font EMPTY>
-<!ATTLIST font name CDATA #REQUIRED>
+<!DOCTYPE dia:diagram [
+<!ELEMENT dia:diagram (dia:diagramdata , dia:layer*)>
+<!ELEMENT dia:diagramdata (dia:attribute)*>
+<!ELEMENT dia:layer (dia:object | dia:group)*>
+<!ATTLIST dia:layer dia:name CDATA #REQUIRED>
+<!ATTLIST dia:layer dia:visible (true | false) #REQUIRED>
+<!ELEMENT dia:object (dia:attribute* , dia:connections?)>
+<!ATTLIST dia:object dia:type CDATA #REQUIRED>
+<!ATTLIST dia:object dia:version NMTOKEN #REQUIRED>
+<!ATTLIST dia:object dia:id ID #REQUIRED>
+<!ELEMENT dia:connections (dia:connection)*>
+<!ELEMENT dia:connection EMPTY>
+<!ATTLIST dia:connection dia:handle NMTOKEN #REQUIRED>
+<!ATTLIST dia:connection dia:to IDREF #REQUIRED>
+<!ATTLIST dia:connection dia:connection NMTOKEN #REQUIRED>
+<!ELEMENT dia:group (dia:object | dia:group)*>
+<!ELEMENT dia:attribute (dia:composite | dia:int | dia:enum | dia:real | dia:boolean | dia:color | dia:point | dia:rectangle | dia:string | dia:font)*>
+<!ATTLIST dia:attribute dia:name CDATA #REQUIRED>
+<!ELEMENT dia:composite (dia:attribute)*>
+<!ATTLIST dia:composite dia:type CDATA #IMPLIED>
+<!ELEMENT dia:int EMPTY>
+<!ATTLIST dia:int dia:val NMTOKEN #REQUIRED>
+<!ELEMENT dia:enum EMPTY>
+<!ATTLIST dia:enum dia:val NMTOKEN #REQUIRED>
+<!ELEMENT dia:real EMPTY>
+<!ATTLIST dia:real dia:val CDATA #REQUIRED>
+<!ELEMENT dia:boolean EMPTY>
+<!ATTLIST dia:boolean dia:val (true | false) #REQUIRED>
+<!ELEMENT dia:color EMPTY>
+<!ATTLIST dia:color dia:val CDATA #REQUIRED>
+<!ELEMENT dia:point EMPTY>
+<!ATTLIST dia:point dia:val CDATA #REQUIRED>
+<!ELEMENT dia:rectangle EMPTY>
+<!ATTLIST dia:rectangle dia:val CDATA #REQUIRED>
+<!ELEMENT dia:string EMPTY>
+<!ATTLIST dia:string dia:val CDATA #IMPLIED>
+<!ELEMENT dia:font EMPTY>
+<!ATTLIST dia:font dia:name CDATA #REQUIRED>
]>
<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
<dia:diagramdata>
- <dia:attribute name="background">
- <dia:color val="#ffffff"/>
+ <dia:attribute dia:name="background">
+ <dia:color dia:val="#ffffff"/>
</dia:attribute>
</dia:diagramdata>
- <dia:layer name="Background" visible="true">
- <dia:object type="Standard - Line" version="0" id="O0">
- <dia:attribute name="obj_pos">
- <dia:point val="1.95,6.85"/>
+ <dia:layer dia:name="Background" dia:visible="true">
+ <dia:object dia:type="Standard - Line" dia:version="0" dia:id="O0">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="1.95,6.85"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="1.9,6.8;11,8.55"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="1.9,6.8;11,8.55"/>
</dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="1.95,6.85"/>
- <dia:point val="10.95,8.5"/>
+ <dia:attribute dia:name="conn_endpoints">
+ <dia:point dia:val="1.95,6.85"/>
+ <dia:point dia:val="10.95,8.5"/>
</dia:attribute>
- <dia:attribute name="line_color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="line_color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="line_width">
- <dia:real val="0.1"/>
+ <dia:attribute dia:name="line_width">
+ <dia:real dia:val="0.1"/>
</dia:attribute>
- <dia:attribute name="line_style">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="line_style">
+ <dia:enum dia:val="0"/>
</dia:attribute>
- <dia:attribute name="start_arrow">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="start_arrow">
+ <dia:enum dia:val="0"/>
</dia:attribute>
- <dia:attribute name="end_arrow">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="end_arrow">
+ <dia:enum dia:val="0"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="1" to="O2" connection="3"/>
+ <dia:connection dia:handle="1" dia:to="O2" dia:connection="3"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="0" id="O1">
- <dia:attribute name="obj_pos">
- <dia:point val="4.8,4.75"/>
+ <dia:object dia:type="Standard - Text" dia:version="0" dia:id="O1">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="4.8,4.75"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="2.579,3.96359;7.021,4.96359"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="2.579,3.96359;7.021,4.96359"/>
</dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string val="sdfsdfg"/>
+ <dia:attribute dia:name="text">
+ <dia:composite dia:type="text">
+ <dia:attribute dia:name="string">
+ <dia:string dia:val="sdfsdfg"/>
</dia:attribute>
- <dia:attribute name="font">
- <dia:font name="Courier"/>
+ <dia:attribute dia:name="font">
+ <dia:font dia:name="Courier"/>
</dia:attribute>
- <dia:attribute name="height">
- <dia:real val="1"/>
+ <dia:attribute dia:name="height">
+ <dia:real dia:val="1"/>
</dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="4.8,4.75"/>
+ <dia:attribute dia:name="pos">
+ <dia:point dia:val="4.8,4.75"/>
</dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
+ <dia:attribute dia:name="alignment">
+ <dia:enum dia:val="1"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O2">
- <dia:attribute name="obj_pos">
- <dia:point val="10.95,7.5"/>
+ <dia:object dia:type="Standard - Box" dia:version="0" dia:id="O2">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="10.95,7.5"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="10.9,7.45;13.05,9.55"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="10.9,7.45;13.05,9.55"/>
</dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="10.95,7.5"/>
+ <dia:attribute dia:name="elem_corner">
+ <dia:point dia:val="10.95,7.5"/>
</dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="2.05"/>
+ <dia:attribute dia:name="elem_width">
+ <dia:real dia:val="2.05"/>
</dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="2"/>
+ <dia:attribute dia:name="elem_height">
+ <dia:real dia:val="2"/>
</dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.1"/>
+ <dia:attribute dia:name="border_width">
+ <dia:real dia:val="0.1"/>
</dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="border_color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#ffffff"/>
+ <dia:attribute dia:name="inner_color">
+ <dia:color dia:val="#ffffff"/>
</dia:attribute>
- <dia:attribute name="line_style">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="line_style">
+ <dia:enum dia:val="0"/>
</dia:attribute>
</dia:object>
</dia:layer>
diff --git a/test/valid/dia.xml b/test/valid/dia.xml
index d8192e4..b6441ab 100644
--- a/test/valid/dia.xml
+++ b/test/valid/dia.xml
@@ -1,159 +1,159 @@
<?xml version="1.0"?>
-<!DOCTYPE diagram [
-<!ELEMENT diagram (diagramdata, (layer)*) >
+<!DOCTYPE dia:diagram [
+<!ELEMENT dia:diagram (dia:diagramdata, (dia:layer)*) >
-<!ELEMENT diagramdata (attribute)* >
+<!ELEMENT dia:diagramdata (dia:attribute)* >
-<!ELEMENT layer (object | group)*>
-<!ATTLIST layer
- name CDATA #REQUIRED
- visible (true|false) #REQUIRED >
+<!ELEMENT dia:layer (dia:object | dia:group)*>
+<!ATTLIST dia:layer
+ dia:name CDATA #REQUIRED
+ dia:visible (true|false) #REQUIRED >
-<!ELEMENT object ((attribute)*, connections?)>
-<!ATTLIST object
- type CDATA #REQUIRED
- version NMTOKEN #REQUIRED
- id ID #REQUIRED >
+<!ELEMENT dia:object ((dia:attribute)*, dia:connections?)>
+<!ATTLIST dia:object
+ dia:type CDATA #REQUIRED
+ dia:version NMTOKEN #REQUIRED
+ dia:id ID #REQUIRED >
-<!ELEMENT connections (connection)*>
+<!ELEMENT dia:connections (dia:connection)*>
-<!ELEMENT connection EMPTY>
-<!ATTLIST connection
- handle NMTOKEN #REQUIRED
- to IDREF #REQUIRED
- connection NMTOKEN #REQUIRED>
+<!ELEMENT dia:connection EMPTY>
+<!ATTLIST dia:connection
+ dia:handle NMTOKEN #REQUIRED
+ dia:to IDREF #REQUIRED
+ dia:connection NMTOKEN #REQUIRED>
-<!ELEMENT group (object | group)*>
+<!ELEMENT dia:group (dia:object | dia:group)*>
-<!ELEMENT attribute (composite | int | enum | real | boolean |
- color | point | rectangle | string | font)*>
-<!ATTLIST attribute name CDATA #REQUIRED >
+<!ELEMENT dia:attribute (dia:composite | dia:int | dia:enum | dia:real | dia:boolean |
+ dia:color | dia:point | dia:rectangle | dia:string | dia:font)*>
+<!ATTLIST dia:attribute dia:name CDATA #REQUIRED >
-<!ELEMENT composite (attribute)*>
-<!ATTLIST composite type CDATA #IMPLIED>
+<!ELEMENT dia:composite (dia:attribute)*>
+<!ATTLIST dia:composite dia:type CDATA #IMPLIED>
-<!ELEMENT int EMPTY>
-<!ATTLIST int val NMTOKEN #REQUIRED>
+<!ELEMENT dia:int EMPTY>
+<!ATTLIST dia:int dia:val NMTOKEN #REQUIRED>
-<!ELEMENT enum EMPTY>
-<!ATTLIST enum val NMTOKEN #REQUIRED>
+<!ELEMENT dia:enum EMPTY>
+<!ATTLIST dia:enum dia:val NMTOKEN #REQUIRED>
-<!ELEMENT real EMPTY>
-<!ATTLIST real val CDATA #REQUIRED>
+<!ELEMENT dia:real EMPTY>
+<!ATTLIST dia:real dia:val CDATA #REQUIRED>
-<!ELEMENT boolean EMPTY>
-<!ATTLIST boolean val (true|false) #REQUIRED>
+<!ELEMENT dia:boolean EMPTY>
+<!ATTLIST dia:boolean dia:val (true|false) #REQUIRED>
-<!ELEMENT color EMPTY>
-<!ATTLIST color val CDATA #REQUIRED>
+<!ELEMENT dia:color EMPTY>
+<!ATTLIST dia:color dia:val CDATA #REQUIRED>
-<!ELEMENT point EMPTY>
-<!ATTLIST point val CDATA #REQUIRED>
+<!ELEMENT dia:point EMPTY>
+<!ATTLIST dia:point dia:val CDATA #REQUIRED>
-<!ELEMENT rectangle EMPTY>
-<!ATTLIST rectangle val CDATA #REQUIRED>
+<!ELEMENT dia:rectangle EMPTY>
+<!ATTLIST dia:rectangle dia:val CDATA #REQUIRED>
-<!ELEMENT string EMPTY>
-<!ATTLIST string val CDATA #IMPLIED>
+<!ELEMENT dia:string EMPTY>
+<!ATTLIST dia:string dia:val CDATA #IMPLIED>
-<!ELEMENT font EMPTY>
-<!ATTLIST font name CDATA #REQUIRED>
+<!ELEMENT dia:font EMPTY>
+<!ATTLIST dia:font dia:name CDATA #REQUIRED>
]>
<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
<dia:diagramdata>
- <dia:attribute name="background">
- <dia:color val="#ffffff"/>
+ <dia:attribute dia:name="background">
+ <dia:color dia:val="#ffffff"/>
</dia:attribute>
</dia:diagramdata>
- <dia:layer name="Background" visible="true">
- <dia:object type="Standard - Line" version="0" id="O0">
- <dia:attribute name="obj_pos">
- <dia:point val="1.95,6.85"/>
+ <dia:layer dia:name="Background" dia:visible="true">
+ <dia:object dia:type="Standard - Line" dia:version="0" dia:id="O0">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="1.95,6.85"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="1.9,6.8;11,8.55"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="1.9,6.8;11,8.55"/>
</dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="1.95,6.85"/>
- <dia:point val="10.95,8.5"/>
+ <dia:attribute dia:name="conn_endpoints">
+ <dia:point dia:val="1.95,6.85"/>
+ <dia:point dia:val="10.95,8.5"/>
</dia:attribute>
- <dia:attribute name="line_color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="line_color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="line_width">
- <dia:real val="0.1"/>
+ <dia:attribute dia:name="line_width">
+ <dia:real dia:val="0.1"/>
</dia:attribute>
- <dia:attribute name="line_style">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="line_style">
+ <dia:enum dia:val="0"/>
</dia:attribute>
- <dia:attribute name="start_arrow">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="start_arrow">
+ <dia:enum dia:val="0"/>
</dia:attribute>
- <dia:attribute name="end_arrow">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="end_arrow">
+ <dia:enum dia:val="0"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="1" to="O2" connection="3"/>
+ <dia:connection dia:handle="1" dia:to="O2" dia:connection="3"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="0" id="O1">
- <dia:attribute name="obj_pos">
- <dia:point val="4.8,4.75"/>
+ <dia:object dia:type="Standard - Text" dia:version="0" dia:id="O1">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="4.8,4.75"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="2.579,3.96359;7.021,4.96359"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="2.579,3.96359;7.021,4.96359"/>
</dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string val="sdfsdfg"/>
+ <dia:attribute dia:name="text">
+ <dia:composite dia:type="text">
+ <dia:attribute dia:name="string">
+ <dia:string dia:val="sdfsdfg"/>
</dia:attribute>
- <dia:attribute name="font">
- <dia:font name="Courier"/>
+ <dia:attribute dia:name="font">
+ <dia:font dia:name="Courier"/>
</dia:attribute>
- <dia:attribute name="height">
- <dia:real val="1"/>
+ <dia:attribute dia:name="height">
+ <dia:real dia:val="1"/>
</dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="4.8,4.75"/>
+ <dia:attribute dia:name="pos">
+ <dia:point dia:val="4.8,4.75"/>
</dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
+ <dia:attribute dia:name="alignment">
+ <dia:enum dia:val="1"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O2">
- <dia:attribute name="obj_pos">
- <dia:point val="10.95,7.5"/>
+ <dia:object dia:type="Standard - Box" dia:version="0" dia:id="O2">
+ <dia:attribute dia:name="obj_pos">
+ <dia:point dia:val="10.95,7.5"/>
</dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="10.9,7.45;13.05,9.55"/>
+ <dia:attribute dia:name="obj_bb">
+ <dia:rectangle dia:val="10.9,7.45;13.05,9.55"/>
</dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="10.95,7.5"/>
+ <dia:attribute dia:name="elem_corner">
+ <dia:point dia:val="10.95,7.5"/>
</dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="2.05"/>
+ <dia:attribute dia:name="elem_width">
+ <dia:real dia:val="2.05"/>
</dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="2"/>
+ <dia:attribute dia:name="elem_height">
+ <dia:real dia:val="2"/>
</dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.1"/>
+ <dia:attribute dia:name="border_width">
+ <dia:real dia:val="0.1"/>
</dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#000000"/>
+ <dia:attribute dia:name="border_color">
+ <dia:color dia:val="#000000"/>
</dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#ffffff"/>
+ <dia:attribute dia:name="inner_color">
+ <dia:color dia:val="#ffffff"/>
</dia:attribute>
- <dia:attribute name="line_style">
- <dia:enum val="0"/>
+ <dia:attribute dia:name="line_style">
+ <dia:enum dia:val="0"/>
</dia:attribute>
</dia:object>
</dia:layer>
diff --git a/valid.c b/valid.c
index c894ff6..6d02260 100644
--- a/valid.c
+++ b/valid.c
@@ -424,10 +424,16 @@
}
ret->type = type;
ret->ocur = XML_ELEMENT_CONTENT_ONCE;
- if (name != NULL)
- ret->name = xmlStrdup(name);
- else
+ if (name != NULL) {
+ xmlChar *prefix = NULL;
+ ret->name = xmlSplitQName2(name, &prefix);
+ if (ret->name == NULL)
+ ret->name = xmlStrdup(name);
+ ret->prefix = prefix;
+ } else {
ret->name = NULL;
+ ret->prefix = NULL;
+ }
ret->c1 = ret->c2 = ret->parent = NULL;
return(ret);
}
@@ -451,6 +457,8 @@
"xmlCopyElementContent : out of memory\n");
return(NULL);
}
+ if (cur->prefix != NULL)
+ ret->prefix = xmlStrdup(cur->prefix);
ret->ocur = cur->ocur;
if (cur->c1 != NULL) ret->c1 = xmlCopyElementContent(cur->c1);
if (ret->c1 != NULL)
@@ -484,6 +492,7 @@
if (cur->c1 != NULL) xmlFreeElementContent(cur->c1);
if (cur->c2 != NULL) xmlFreeElementContent(cur->c2);
if (cur->name != NULL) xmlFree((xmlChar *) cur->name);
+ if (cur->prefix != NULL) xmlFree((xmlChar *) cur->prefix);
xmlFree(cur);
}
@@ -505,6 +514,10 @@
xmlBufferWriteChar(buf, "#PCDATA");
break;
case XML_ELEMENT_CONTENT_ELEMENT:
+ if (content->prefix != NULL) {
+ xmlBufferWriteCHAR(buf, content->prefix);
+ xmlBufferWriteChar(buf, ":");
+ }
xmlBufferWriteCHAR(buf, content->name);
break;
case XML_ELEMENT_CONTENT_SEQ:
@@ -594,6 +607,14 @@
strcat(buf, "#PCDATA");
break;
case XML_ELEMENT_CONTENT_ELEMENT:
+ if (content->prefix != NULL) {
+ if (size - len < xmlStrlen(content->prefix + 10)) {
+ strcat(buf, " ...");
+ return;
+ }
+ strcat(buf, (char *) content->prefix);
+ strcat(buf, ":");
+ }
if (size - len < xmlStrlen(content->name + 10)) {
strcat(buf, " ...");
return;
@@ -936,16 +957,28 @@
switch (elem->etype) {
case XML_ELEMENT_TYPE_EMPTY:
xmlBufferWriteChar(buf, "<!ELEMENT ");
+ if (elem->prefix != NULL) {
+ xmlBufferWriteCHAR(buf, elem->prefix);
+ xmlBufferWriteChar(buf, ":");
+ }
xmlBufferWriteCHAR(buf, elem->name);
xmlBufferWriteChar(buf, " EMPTY>\n");
break;
case XML_ELEMENT_TYPE_ANY:
xmlBufferWriteChar(buf, "<!ELEMENT ");
+ if (elem->prefix != NULL) {
+ xmlBufferWriteCHAR(buf, elem->prefix);
+ xmlBufferWriteChar(buf, ":");
+ }
xmlBufferWriteCHAR(buf, elem->name);
xmlBufferWriteChar(buf, " ANY>\n");
break;
case XML_ELEMENT_TYPE_MIXED:
xmlBufferWriteChar(buf, "<!ELEMENT ");
+ if (elem->prefix != NULL) {
+ xmlBufferWriteCHAR(buf, elem->prefix);
+ xmlBufferWriteChar(buf, ":");
+ }
xmlBufferWriteCHAR(buf, elem->name);
xmlBufferWriteChar(buf, " ");
xmlDumpElementContent(buf, elem->content, 1);
@@ -953,6 +986,10 @@
break;
case XML_ELEMENT_TYPE_ELEMENT:
xmlBufferWriteChar(buf, "<!ELEMENT ");
+ if (elem->prefix != NULL) {
+ xmlBufferWriteCHAR(buf, elem->prefix);
+ xmlBufferWriteChar(buf, ":");
+ }
xmlBufferWriteCHAR(buf, elem->name);
xmlBufferWriteChar(buf, " ");
xmlDumpElementContent(buf, elem->content, 1);
@@ -3122,6 +3159,8 @@
/* VC: Unique Element Type Declaration */
tst = xmlGetDtdElementDesc(doc->intSubset, elem->name);
if ((tst != NULL ) && (tst != elem) &&
+ ((tst->prefix == elem->prefix) ||
+ (xmlStrEqual(tst->prefix, elem->prefix))) &&
(tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) {
VERROR(ctxt->userData, "Redefinition of element %s\n",
elem->name);
@@ -3129,6 +3168,8 @@
}
tst = xmlGetDtdElementDesc(doc->extSubset, elem->name);
if ((tst != NULL ) && (tst != elem) &&
+ ((tst->prefix == elem->prefix) ||
+ (xmlStrEqual(tst->prefix, elem->prefix))) &&
(tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) {
VERROR(ctxt->userData, "Redefinition of element %s\n",
elem->name);
@@ -3363,7 +3404,7 @@
static int
xmlValidateElementType(xmlValidCtxtPtr ctxt) {
- int ret = -1;
+ int ret = -1, tmp;
int determinist = 1;
NODE = xmlValidateSkipIgnorable(NODE);
@@ -3452,6 +3493,15 @@
ret = ((NODE->type == XML_ELEMENT_NODE) &&
(xmlStrEqual(NODE->name, CONT->name)));
if (ret == 1) {
+ if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) {
+ ret = (CONT->prefix == NULL);
+ } else if (CONT->prefix == NULL) {
+ ret = 0;
+ } else {
+ ret = xmlStrEqual(NODE->ns->prefix, CONT->prefix);
+ }
+ }
+ if (ret == 1) {
DEBUG_VALID_MSG("element found, skip to next");
/*
* go to next element in the content model
@@ -3483,6 +3533,18 @@
CONT = CONT->c2;
goto cont;
}
+ if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) {
+ ret = (CONT->c1->prefix == NULL);
+ } else if (CONT->c1->prefix == NULL) {
+ ret = 0;
+ } else {
+ ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix);
+ }
+ if (ret == 0) {
+ DEPTH++;
+ CONT = CONT->c2;
+ goto cont;
+ }
}
/*
@@ -3508,6 +3570,18 @@
CONT = CONT->c2;
goto cont;
}
+ if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) {
+ ret = (CONT->c1->prefix == NULL);
+ } else if (CONT->c1->prefix == NULL) {
+ ret = 0;
+ } else {
+ ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix);
+ }
+ if (ret == 0) {
+ DEPTH++;
+ CONT = CONT->c2;
+ goto cont;
+ }
}
DEPTH++;
CONT = CONT->c1;
@@ -3710,6 +3784,15 @@
}
switch (cur->type) {
case XML_ELEMENT_NODE:
+ if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
+ if (size - len < xmlStrlen(cur->ns->prefix + 10)) {
+ if ((size - len > 4) && (buf[len - 1] != '.'))
+ strcat(buf, " ...");
+ return;
+ }
+ strcat(buf, (char *) cur->ns->prefix);
+ strcat(buf, ":");
+ }
if (size - len < xmlStrlen(cur->name + 10)) {
if ((size - len > 4) && (buf[len - 1] != '.'))
strcat(buf, " ...");
@@ -3762,7 +3845,7 @@
* xmlValidateElementContent:
* @ctxt: the validation context
* @child: the child list
- * @cont: pointer to the content declaration
+ * @elemDecl: pointer to the element declaration
* @warn: emit the error message
*
* Try to validate the content model of an element
@@ -3772,9 +3855,16 @@
static int
xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child,
- xmlElementContentPtr cont, int warn, const xmlChar *name) {
+ xmlElementPtr elemDecl, int warn) {
int ret;
xmlNodePtr repl = NULL, last = NULL, cur, tmp;
+ xmlElementContentPtr cont;
+ const xmlChar *name;
+
+ if (elemDecl == NULL)
+ return(-1);
+ cont = elemDecl->content;
+ name = elemDecl->name;
/*
* Allocate the stack
@@ -4026,6 +4116,7 @@
xmlNodePtr child;
int ret = 1;
const xmlChar *name;
+ const xmlChar *prefix = NULL;
CHECK_DTD;
@@ -4097,16 +4188,21 @@
/*
* Fetch the declaration for the qualified name
*/
- if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) {
+ if ((elem->ns != NULL) && (elem->ns->prefix != NULL))
+ prefix = elem->ns->prefix;
+
+ if (prefix != NULL) {
elemDecl = xmlGetDtdQElementDesc(doc->intSubset,
- elem->name, elem->ns->prefix);
+ elem->name, prefix);
if ((elemDecl == NULL) && (doc->extSubset != NULL))
elemDecl = xmlGetDtdQElementDesc(doc->extSubset,
- elem->name, elem->ns->prefix);
+ elem->name, prefix);
}
/*
* Fetch the declaration for the non qualified name
+ * This is "non-strict" validation should be done on the
+ * full QName but in that case being flexible makes sense.
*/
if (elemDecl == NULL) {
elemDecl = xmlGetDtdElementDesc(doc->intSubset, elem->name);
@@ -4211,7 +4307,7 @@
case XML_ELEMENT_TYPE_ELEMENT:
child = elem->children;
cont = elemDecl->content;
- ret = xmlValidateElementContent(ctxt, child, cont, 1, elem->name);
+ ret = xmlValidateElementContent(ctxt, child, elemDecl, 1);
break;
}