lot of bug fixes, cleanup, starting to add proper namespace support too.
* xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h
include/libxml/schemasInternals.h: lot of bug fixes, cleanup,
starting to add proper namespace support too.
* test/schemas/* result/schemas/*: added a number of tests
fixed the result from some regression tests too.
Daniel
diff --git a/ChangeLog b/ChangeLog
index 72de826..fc7397d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sat Nov 22 21:35:42 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+ * xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h
+ include/libxml/schemasInternals.h: lot of bug fixes, cleanup,
+ starting to add proper namespace support too.
+ * test/schemas/* result/schemas/*: added a number of tests
+ fixed the result from some regression tests too.
+
Fri Nov 21 20:50:59 MST 2003 John Fleck <jfleck@inkstain.net>
* doc/xml.html, docs.html: remove reference to gtk-doc now that
diff --git a/include/libxml/schemasInternals.h b/include/libxml/schemasInternals.h
index a044b67..d42b53c 100644
--- a/include/libxml/schemasInternals.h
+++ b/include/libxml/schemasInternals.h
@@ -18,6 +18,7 @@
#include <libxml/xmlregexp.h>
#include <libxml/hash.h>
+#include <libxml/dict.h>
#ifdef __cplusplus
extern "C" {
@@ -100,24 +101,33 @@
#define XML_SCHEMAS_ANYATTR_LAX 2
#define XML_SCHEMAS_ANYATTR_STRICT 3
+/**
+ * XML_SCHEMAS_ATTR_NSDEFAULT:
+ *
+ * allow elements in no namespace
+ */
+#define XML_SCHEMAS_ATTR_NSDEFAULT 1 << 7
+
typedef struct _xmlSchemaAttribute xmlSchemaAttribute;
typedef xmlSchemaAttribute *xmlSchemaAttributePtr;
struct _xmlSchemaAttribute {
xmlSchemaTypeType type; /* The kind of type */
struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */
- xmlChar *name;
- xmlChar *id;
- xmlChar *ref;
- xmlChar *refNs;
- xmlChar *typeName;
- xmlChar *typeNs;
+ const xmlChar *name;
+ const xmlChar *id;
+ const xmlChar *ref;
+ const xmlChar *refNs;
+ const xmlChar *typeName;
+ const xmlChar *typeNs;
xmlSchemaAnnotPtr annot;
xmlSchemaTypePtr base;
int occurs;
- xmlChar *defValue;
+ const xmlChar *defValue;
xmlSchemaTypePtr subtypes;
xmlNodePtr node;
+ const xmlChar *targetNamespace;
+ int flags;
};
/**
@@ -131,10 +141,10 @@
struct _xmlSchemaAttributeGroup {
xmlSchemaTypeType type; /* The kind of type */
struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */
- xmlChar *name;
- xmlChar *id;
- xmlChar *ref;
- xmlChar *refNs;
+ const xmlChar *name;
+ const xmlChar *id;
+ const xmlChar *ref;
+ const xmlChar *refNs;
xmlSchemaAnnotPtr annot;
xmlSchemaAttributePtr attributes;
@@ -157,10 +167,10 @@
struct _xmlSchemaType {
xmlSchemaTypeType type; /* The kind of type */
struct _xmlSchemaType *next;/* the next type if in a sequence ... */
- xmlChar *name;
- xmlChar *id;
- xmlChar *ref;
- xmlChar *refNs;
+ const xmlChar *name;
+ const xmlChar *id;
+ const xmlChar *ref;
+ const xmlChar *refNs;
xmlSchemaAnnotPtr annot;
xmlSchemaTypePtr subtypes;
xmlSchemaAttributePtr attributes;
@@ -170,8 +180,8 @@
int flags;
xmlSchemaContentType contentType;
- xmlChar *base;
- xmlChar *baseNs;
+ const xmlChar *base;
+ const xmlChar *baseNs;
xmlSchemaTypePtr baseType;
xmlSchemaFacetPtr facets;
};
@@ -225,16 +235,22 @@
* the element is a reference to a type
*/
#define XML_SCHEMAS_ELEM_REF 1 << 6
+/**
+ * XML_SCHEMAS_ELEM_NSDEFAULT:
+ *
+ * allow elements in no namespace
+ */
+#define XML_SCHEMAS_ELEM_NSDEFAULT 1 << 7
typedef struct _xmlSchemaElement xmlSchemaElement;
typedef xmlSchemaElement *xmlSchemaElementPtr;
struct _xmlSchemaElement {
xmlSchemaTypeType type; /* The kind of type */
struct _xmlSchemaType *next;/* the next type if in a sequence ... */
- xmlChar *name;
- xmlChar *id;
- xmlChar *ref;
- xmlChar *refNs;
+ const xmlChar *name;
+ const xmlChar *id;
+ const xmlChar *ref;
+ const xmlChar *refNs;
xmlSchemaAnnotPtr annot;
xmlSchemaTypePtr subtypes;
xmlSchemaAttributePtr attributes;
@@ -243,13 +259,13 @@
int maxOccurs;
int flags;
- xmlChar *targetNamespace;
- xmlChar *namedType;
- xmlChar *namedTypeNs;
- xmlChar *substGroup;
- xmlChar *substGroupNs;
- xmlChar *scope;
- xmlChar *value;
+ const xmlChar *targetNamespace;
+ const xmlChar *namedType;
+ const xmlChar *namedTypeNs;
+ const xmlChar *substGroup;
+ const xmlChar *substGroupNs;
+ const xmlChar *scope;
+ const xmlChar *value;
struct _xmlSchemaElement *refDecl;
xmlRegexpPtr contModel;
xmlSchemaContentType contentType;
@@ -286,8 +302,8 @@
struct _xmlSchemaFacet {
xmlSchemaTypeType type; /* The kind of type */
struct _xmlSchemaFacet *next;/* the next type if in a sequence ... */
- xmlChar *value;
- xmlChar *id;
+ const xmlChar *value;
+ const xmlChar *id;
xmlSchemaAnnotPtr annot;
xmlNodePtr node;
int fixed;
@@ -303,9 +319,9 @@
typedef xmlSchemaNotation *xmlSchemaNotationPtr;
struct _xmlSchemaNotation {
xmlSchemaTypeType type; /* The kind of type */
- xmlChar *name;
+ const xmlChar *name;
xmlSchemaAnnotPtr annot;
- xmlChar *identifier;
+ const xmlChar *identifier;
};
/**
@@ -326,10 +342,10 @@
* A Schemas definition
*/
struct _xmlSchema {
- xmlChar *name; /* schema name */
- xmlChar *targetNamespace; /* the target namespace */
- xmlChar *version;
- xmlChar *id;
+ const xmlChar *name; /* schema name */
+ const xmlChar *targetNamespace; /* the target namespace */
+ const xmlChar *version;
+ const xmlChar *id;
xmlDocPtr doc;
xmlSchemaAnnotPtr annot;
int flags;
@@ -344,6 +360,7 @@
void *_private; /* unused by the library for users or bindings */
xmlHashTablePtr groupDecl;
+ xmlDictPtr dict;
};
XMLPUBFUN void XMLCALL xmlSchemaFreeType (xmlSchemaTypePtr type);
diff --git a/include/libxml/xmlerror.h b/include/libxml/xmlerror.h
index 648ddff..96439f8 100644
--- a/include/libxml/xmlerror.h
+++ b/include/libxml/xmlerror.h
@@ -535,6 +535,8 @@
XML_SCHEMAP_REDEFINED_ATTR, /* 1763 */
XML_SCHEMAP_REDEFINED_NOTATION, /* 1764 */
XML_SCHEMAP_FAILED_PARSE, /* 1765 */
+ XML_SCHEMAP_UNKNOWN_PREFIX, /* 1766 */
+ XML_SCHEMAP_DEF_AND_PREFIX, /* 1767 */
XML_SCHEMAV_NOROOT = 1800,
XML_SCHEMAV_UNDECLAREDELEM, /* 1801 */
XML_SCHEMAV_NOTTOPLEVEL, /* 1802 */
diff --git a/result/schemas/deter0_0_0 b/result/schemas/deter0_0_0
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/deter0_0_0
diff --git a/result/schemas/deter0_0_0.err b/result/schemas/deter0_0_0.err
new file mode 100644
index 0000000..cc42c3b
--- /dev/null
+++ b/result/schemas/deter0_0_0.err
@@ -0,0 +1 @@
+./test/schemas/deter0_0.xsd:5: element element: Schemas parser error : Content model of book is not determinist:
diff --git a/result/schemas/extension1_0_0 b/result/schemas/extension1_0_0
new file mode 100644
index 0000000..23da9ea
--- /dev/null
+++ b/result/schemas/extension1_0_0
@@ -0,0 +1 @@
+./test/schemas/extension1_0.xml validates
diff --git a/result/schemas/extension1_0_0.err b/result/schemas/extension1_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/extension1_0_0.err
diff --git a/result/schemas/extension1_0_1 b/result/schemas/extension1_0_1
new file mode 100644
index 0000000..4a47b86
--- /dev/null
+++ b/result/schemas/extension1_0_1
@@ -0,0 +1 @@
+./test/schemas/extension1_1.xml fails to validate
diff --git a/result/schemas/extension1_0_1.err b/result/schemas/extension1_0_1.err
new file mode 100644
index 0000000..7997de7
--- /dev/null
+++ b/result/schemas/extension1_0_1.err
@@ -0,0 +1 @@
+./test/schemas/extension1_1.xml:1: element title: Schemas validity error : Attribute langue on title is unknown
diff --git a/result/schemas/extension1_0_2 b/result/schemas/extension1_0_2
new file mode 100644
index 0000000..fc8eccc
--- /dev/null
+++ b/result/schemas/extension1_0_2
@@ -0,0 +1 @@
+./test/schemas/extension1_2.xml fails to validate
diff --git a/result/schemas/extension1_0_2.err b/result/schemas/extension1_0_2.err
new file mode 100644
index 0000000..516d200
--- /dev/null
+++ b/result/schemas/extension1_0_2.err
@@ -0,0 +1 @@
+./test/schemas/extension1_2.xml:1: element title: Schemas validity error : Element title: child salut should not be present
diff --git a/result/schemas/group0_0_0 b/result/schemas/group0_0_0
new file mode 100644
index 0000000..b5f479c
--- /dev/null
+++ b/result/schemas/group0_0_0
@@ -0,0 +1 @@
+./test/schemas/group0_0.xml fails to validate
diff --git a/result/schemas/group0_0_0.err b/result/schemas/group0_0_0.err
new file mode 100644
index 0000000..b7b5302
--- /dev/null
+++ b/result/schemas/group0_0_0.err
@@ -0,0 +1 @@
+./test/schemas/group0_0.xml:1: element author: Schemas validity error : Element author content check failed
diff --git a/result/schemas/ns0_0_0 b/result/schemas/ns0_0_0
new file mode 100644
index 0000000..44d1d44
--- /dev/null
+++ b/result/schemas/ns0_0_0
@@ -0,0 +1 @@
+./test/schemas/ns0_0.xml validates
diff --git a/result/schemas/ns0_0_0.err b/result/schemas/ns0_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/ns0_0_0.err
diff --git a/result/schemas/ns0_0_1 b/result/schemas/ns0_0_1
new file mode 100644
index 0000000..2110249
--- /dev/null
+++ b/result/schemas/ns0_0_1
@@ -0,0 +1 @@
+./test/schemas/ns0_1.xml validates
diff --git a/result/schemas/ns0_0_1.err b/result/schemas/ns0_0_1.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/ns0_0_1.err
diff --git a/result/schemas/ns0_0_2 b/result/schemas/ns0_0_2
new file mode 100644
index 0000000..03e85f7
--- /dev/null
+++ b/result/schemas/ns0_0_2
@@ -0,0 +1 @@
+./test/schemas/ns0_2.xml fails to validate
diff --git a/result/schemas/ns0_0_2.err b/result/schemas/ns0_0_2.err
new file mode 100644
index 0000000..ff70f7d
--- /dev/null
+++ b/result/schemas/ns0_0_2.err
@@ -0,0 +1,2 @@
+./test/schemas/ns0_2.xml:1: element foo: Schemas validity error : Element foo not declared
+./test/schemas/ns0_2.xml:1: element foo: Schemas validity error : Element foo not declared
diff --git a/result/schemas/ns0_0_3 b/result/schemas/ns0_0_3
new file mode 100644
index 0000000..473206c
--- /dev/null
+++ b/result/schemas/ns0_0_3
@@ -0,0 +1 @@
+./test/schemas/ns0_3.xml fails to validate
diff --git a/result/schemas/ns0_0_3.err b/result/schemas/ns0_0_3.err
new file mode 100644
index 0000000..6578c9e
--- /dev/null
+++ b/result/schemas/ns0_0_3.err
@@ -0,0 +1 @@
+./test/schemas/ns0_3.xml:1: element foo: Schemas validity error : Attribute id on foo is unknown
diff --git a/result/schemas/ns0_0_4 b/result/schemas/ns0_0_4
new file mode 100644
index 0000000..f10f45e
--- /dev/null
+++ b/result/schemas/ns0_0_4
@@ -0,0 +1 @@
+./test/schemas/ns0_4.xml fails to validate
diff --git a/result/schemas/ns0_0_4.err b/result/schemas/ns0_0_4.err
new file mode 100644
index 0000000..14b949d
--- /dev/null
+++ b/result/schemas/ns0_0_4.err
@@ -0,0 +1 @@
+./test/schemas/ns0_4.xml:2: element foo: Schemas validity error : Attribute id on foo is unknown
diff --git a/result/schemas/ns0_1_0 b/result/schemas/ns0_1_0
new file mode 100644
index 0000000..9ba0471
--- /dev/null
+++ b/result/schemas/ns0_1_0
@@ -0,0 +1 @@
+./test/schemas/ns0_0.xml fails to validate
diff --git a/result/schemas/ns0_1_0.err b/result/schemas/ns0_1_0.err
new file mode 100644
index 0000000..6e5ba4a
--- /dev/null
+++ b/result/schemas/ns0_1_0.err
@@ -0,0 +1 @@
+./test/schemas/ns0_0.xml:1: element foo: Schemas validity error : Attribute id on foo is unknown
diff --git a/result/schemas/ns0_1_1 b/result/schemas/ns0_1_1
new file mode 100644
index 0000000..9f464de
--- /dev/null
+++ b/result/schemas/ns0_1_1
@@ -0,0 +1 @@
+./test/schemas/ns0_1.xml fails to validate
diff --git a/result/schemas/ns0_1_1.err b/result/schemas/ns0_1_1.err
new file mode 100644
index 0000000..008b122
--- /dev/null
+++ b/result/schemas/ns0_1_1.err
@@ -0,0 +1 @@
+./test/schemas/ns0_1.xml:1: element foo: Schemas validity error : Attribute id on foo is unknown
diff --git a/result/schemas/ns0_1_2 b/result/schemas/ns0_1_2
new file mode 100644
index 0000000..03e85f7
--- /dev/null
+++ b/result/schemas/ns0_1_2
@@ -0,0 +1 @@
+./test/schemas/ns0_2.xml fails to validate
diff --git a/result/schemas/ns0_1_2.err b/result/schemas/ns0_1_2.err
new file mode 100644
index 0000000..ff70f7d
--- /dev/null
+++ b/result/schemas/ns0_1_2.err
@@ -0,0 +1,2 @@
+./test/schemas/ns0_2.xml:1: element foo: Schemas validity error : Element foo not declared
+./test/schemas/ns0_2.xml:1: element foo: Schemas validity error : Element foo not declared
diff --git a/result/schemas/ns0_1_3 b/result/schemas/ns0_1_3
new file mode 100644
index 0000000..1fc8772
--- /dev/null
+++ b/result/schemas/ns0_1_3
@@ -0,0 +1 @@
+./test/schemas/ns0_3.xml validates
diff --git a/result/schemas/ns0_1_3.err b/result/schemas/ns0_1_3.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/ns0_1_3.err
diff --git a/result/schemas/ns0_1_4 b/result/schemas/ns0_1_4
new file mode 100644
index 0000000..7374ebf
--- /dev/null
+++ b/result/schemas/ns0_1_4
@@ -0,0 +1 @@
+./test/schemas/ns0_4.xml validates
diff --git a/result/schemas/ns0_1_4.err b/result/schemas/ns0_1_4.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/ns0_1_4.err
diff --git a/result/schemas/po1_0_0 b/result/schemas/po1_0_0
index 1cd6ebe..2c264ce 100644
--- a/result/schemas/po1_0_0
+++ b/result/schemas/po1_0_0
@@ -1 +1 @@
-./test/schemas/po1_0.xml fails to validate
+./test/schemas/po1_0.xml validates
diff --git a/result/schemas/po1_0_0.err b/result/schemas/po1_0_0.err
index a76b93a..e69de29 100644
--- a/result/schemas/po1_0_0.err
+++ b/result/schemas/po1_0_0.err
@@ -1,5 +0,0 @@
-Schemas: element items type Items not found
-Schemas: element anonelem9 ref to comment not found
-Schemas: element anonelem2 ref to comment not found
-Schemas: attribute partNum type SKU not found
-Element purchaseOrder content check failed
diff --git a/result/schemas/vdv-first0_0_0 b/result/schemas/vdv-first0_0_0
new file mode 100644
index 0000000..6d39ecb
--- /dev/null
+++ b/result/schemas/vdv-first0_0_0
@@ -0,0 +1 @@
+./test/schemas/vdv-first0_0.xml validates
diff --git a/result/schemas/vdv-first0_0_0.err b/result/schemas/vdv-first0_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/vdv-first0_0_0.err
diff --git a/result/schemas/vdv-first1_0_0 b/result/schemas/vdv-first1_0_0
new file mode 100644
index 0000000..54f4b15
--- /dev/null
+++ b/result/schemas/vdv-first1_0_0
@@ -0,0 +1 @@
+./test/schemas/vdv-first1_0.xml validates
diff --git a/result/schemas/vdv-first1_0_0.err b/result/schemas/vdv-first1_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/vdv-first1_0_0.err
diff --git a/result/schemas/vdv-first2_0_0 b/result/schemas/vdv-first2_0_0
new file mode 100644
index 0000000..7430eda
--- /dev/null
+++ b/result/schemas/vdv-first2_0_0
@@ -0,0 +1 @@
+./test/schemas/vdv-first2_0.xml validates
diff --git a/result/schemas/vdv-first2_0_0.err b/result/schemas/vdv-first2_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/vdv-first2_0_0.err
diff --git a/result/schemas/vdv-first3_0_0 b/result/schemas/vdv-first3_0_0
new file mode 100644
index 0000000..943e3e1
--- /dev/null
+++ b/result/schemas/vdv-first3_0_0
@@ -0,0 +1 @@
+./test/schemas/vdv-first3_0.xml validates
diff --git a/result/schemas/vdv-first3_0_0.err b/result/schemas/vdv-first3_0_0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/schemas/vdv-first3_0_0.err
diff --git a/test/schemas/all.xsd b/test/schemas/all.xsd
new file mode 100644
index 0000000..b2e70e3
--- /dev/null
+++ b/test/schemas/all.xsd
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:complexType name="PurchaseOrderType">
+ <xsd:sequence>
+ <xsd:all>
+ <xsd:element name="shipTo" type="USAddress"/>
+ <xsd:element name="billTo" type="USAddress"/>
+ <xsd:element name="items" type="Items"/>
+ </xsd:all>
+ <xsd:sequence>
+ <xsd:element ref="comment" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ <xsd:attribute name="orderDate" type="xsd:date"/>
+ </xsd:complexType>
+</xsd:schema>
diff --git a/test/schemas/extension1_0.xml b/test/schemas/extension1_0.xml
new file mode 100644
index 0000000..5c3a0c9
--- /dev/null
+++ b/test/schemas/extension1_0.xml
@@ -0,0 +1 @@
+<title lang="fr">salut</title>
diff --git a/test/schemas/extension1_0.xsd b/test/schemas/extension1_0.xsd
new file mode 100644
index 0000000..0a11e14
--- /dev/null
+++ b/test/schemas/extension1_0.xsd
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:simpleType name="string255">
+ <xs:restriction base="xs:token">
+ <xs:maxLength value="255"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="title">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="string255">
+ <xs:attribute name="lang" type="xs:language"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/test/schemas/extension1_1.xml b/test/schemas/extension1_1.xml
new file mode 100644
index 0000000..7780cf6
--- /dev/null
+++ b/test/schemas/extension1_1.xml
@@ -0,0 +1 @@
+<title langue="fr">salut</title>
diff --git a/test/schemas/extension1_2.xml b/test/schemas/extension1_2.xml
new file mode 100644
index 0000000..3d65bb0
--- /dev/null
+++ b/test/schemas/extension1_2.xml
@@ -0,0 +1 @@
+<title lang="fr"><salut/></title>
diff --git a/test/schemas/ns0_0.xml b/test/schemas/ns0_0.xml
new file mode 100644
index 0000000..1cbaf1f
--- /dev/null
+++ b/test/schemas/ns0_0.xml
@@ -0,0 +1,2 @@
+<foo xmlns="http://example.com/xsd/ns" id="abc"/>
+
diff --git a/test/schemas/ns0_0.xsd b/test/schemas/ns0_0.xsd
new file mode 100644
index 0000000..38951d6
--- /dev/null
+++ b/test/schemas/ns0_0.xsd
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://example.com/xsd/ns"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+ <xsd:element name="foo">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="id" type="xsd:ID"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
+
diff --git a/test/schemas/ns0_1.xml b/test/schemas/ns0_1.xml
new file mode 100644
index 0000000..6550f5c
--- /dev/null
+++ b/test/schemas/ns0_1.xml
@@ -0,0 +1,2 @@
+<n:foo xmlns:n="http://example.com/xsd/ns" id="abc"/>
+
diff --git a/test/schemas/ns0_1.xsd b/test/schemas/ns0_1.xsd
new file mode 100644
index 0000000..df2e79a
--- /dev/null
+++ b/test/schemas/ns0_1.xsd
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://example.com/xsd/ns"
+ elementFormDefault="qualified"
+ attributeFormDefault="qualified">
+ <xsd:element name="foo">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="id" type="xsd:ID"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
+
diff --git a/test/schemas/ns0_2.xml b/test/schemas/ns0_2.xml
new file mode 100644
index 0000000..8f2bdba
--- /dev/null
+++ b/test/schemas/ns0_2.xml
@@ -0,0 +1,2 @@
+<foo id="abc"/>
+
diff --git a/test/schemas/ns0_3.xml b/test/schemas/ns0_3.xml
new file mode 100644
index 0000000..4c5c1e4
--- /dev/null
+++ b/test/schemas/ns0_3.xml
@@ -0,0 +1,2 @@
+<n:foo xmlns:n="http://example.com/xsd/ns" n:id="abc"/>
+
diff --git a/test/schemas/ns0_4.xml b/test/schemas/ns0_4.xml
new file mode 100644
index 0000000..dcdd418
--- /dev/null
+++ b/test/schemas/ns0_4.xml
@@ -0,0 +1,3 @@
+<l:foo xmlns:l="http://example.com/xsd/ns"
+ xmlns:b="http://example.com/xsd/ns" b:id="abc"/>
+
diff --git a/test/schemas/vdv-first0_0.xml b/test/schemas/vdv-first0_0.xml
new file mode 100644
index 0000000..a12bcad
--- /dev/null
+++ b/test/schemas/vdv-first0_0.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first.xml,v 1.2 2001/11/01 22:03:06 vdv Exp $ -->
+<library>
+ <book id="b0836217462" available="true">
+ <isbn>0836217462</isbn>
+ <title lang="en">Being a Dog Is a Full-Time Job</title>
+ <author id="CMS">
+ <name>Charles M Schulz</name>
+ <born>1922-11-26</born>
+ <dead>2000-02-12</dead>
+ </author>
+ <character id="PP">
+ <name>Peppermint Patty</name>
+ <born>1966-08-22</born>
+ <qualification>bold, brash and tomboyish</qualification>
+ </character>
+ <character id="Snoopy">
+ <name>Snoopy</name>
+ <born>1950-10-04</born>
+ <qualification>extroverted beagle</qualification>
+ </character>
+ <character id="Schroeder">
+ <name>Schroeder</name>
+ <born>1951-05-30</born>
+ <qualification>brought classical music to the Peanuts strip</qualification>
+ </character>
+ <character id="Lucy">
+ <name>Lucy</name>
+ <born>1952-03-03</born>
+ <qualification>bossy, crabby and selfish</qualification>
+ </character>
+ </book>
+</library>
diff --git a/test/schemas/vdv-first0_0.xsd b/test/schemas/vdv-first0_0.xsd
new file mode 100644
index 0000000..e58bed2
--- /dev/null
+++ b/test/schemas/vdv-first0_0.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="qualification" type="xs:string"/>
+ <xs:element name="born" type="xs:date"/>
+ <xs:element name="dead" type="xs:date"/>
+ <xs:element name="isbn" type="xs:integer"/>
+
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="available" type="xs:boolean"/>
+ <xs:attribute name="lang" type="xs:language"/>
+
+ <xs:element name="title">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="lang"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="library">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="book" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="author">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="dead" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="book">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="isbn"/>
+ <xs:element ref="title"/>
+ <xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ <xs:attribute ref="available"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="character">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="qualification"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
diff --git a/test/schemas/vdv-first1_0.xml b/test/schemas/vdv-first1_0.xml
new file mode 100644
index 0000000..a12bcad
--- /dev/null
+++ b/test/schemas/vdv-first1_0.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first.xml,v 1.2 2001/11/01 22:03:06 vdv Exp $ -->
+<library>
+ <book id="b0836217462" available="true">
+ <isbn>0836217462</isbn>
+ <title lang="en">Being a Dog Is a Full-Time Job</title>
+ <author id="CMS">
+ <name>Charles M Schulz</name>
+ <born>1922-11-26</born>
+ <dead>2000-02-12</dead>
+ </author>
+ <character id="PP">
+ <name>Peppermint Patty</name>
+ <born>1966-08-22</born>
+ <qualification>bold, brash and tomboyish</qualification>
+ </character>
+ <character id="Snoopy">
+ <name>Snoopy</name>
+ <born>1950-10-04</born>
+ <qualification>extroverted beagle</qualification>
+ </character>
+ <character id="Schroeder">
+ <name>Schroeder</name>
+ <born>1951-05-30</born>
+ <qualification>brought classical music to the Peanuts strip</qualification>
+ </character>
+ <character id="Lucy">
+ <name>Lucy</name>
+ <born>1952-03-03</born>
+ <qualification>bossy, crabby and selfish</qualification>
+ </character>
+ </book>
+</library>
diff --git a/test/schemas/vdv-first1_0.xsd b/test/schemas/vdv-first1_0.xsd
new file mode 100644
index 0000000..c0d6f27
--- /dev/null
+++ b/test/schemas/vdv-first1_0.xsd
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="library">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="book" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="isbn" type="xs:integer"/>
+ <xs:element name="title">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="lang" type="xs:language"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="author" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="born" type="xs:date"/>
+ <xs:element name="dead" type="xs:date"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="character" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="born" type="xs:date"/>
+ <xs:element name="qualification" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="available" type="xs:boolean"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/test/schemas/vdv-first2_0.xml b/test/schemas/vdv-first2_0.xml
new file mode 100644
index 0000000..a12bcad
--- /dev/null
+++ b/test/schemas/vdv-first2_0.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first.xml,v 1.2 2001/11/01 22:03:06 vdv Exp $ -->
+<library>
+ <book id="b0836217462" available="true">
+ <isbn>0836217462</isbn>
+ <title lang="en">Being a Dog Is a Full-Time Job</title>
+ <author id="CMS">
+ <name>Charles M Schulz</name>
+ <born>1922-11-26</born>
+ <dead>2000-02-12</dead>
+ </author>
+ <character id="PP">
+ <name>Peppermint Patty</name>
+ <born>1966-08-22</born>
+ <qualification>bold, brash and tomboyish</qualification>
+ </character>
+ <character id="Snoopy">
+ <name>Snoopy</name>
+ <born>1950-10-04</born>
+ <qualification>extroverted beagle</qualification>
+ </character>
+ <character id="Schroeder">
+ <name>Schroeder</name>
+ <born>1951-05-30</born>
+ <qualification>brought classical music to the Peanuts strip</qualification>
+ </character>
+ <character id="Lucy">
+ <name>Lucy</name>
+ <born>1952-03-03</born>
+ <qualification>bossy, crabby and selfish</qualification>
+ </character>
+ </book>
+</library>
diff --git a/test/schemas/vdv-first2_0.xsd b/test/schemas/vdv-first2_0.xsd
new file mode 100644
index 0000000..c768e97
--- /dev/null
+++ b/test/schemas/vdv-first2_0.xsd
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first-user-dt.xsd,v 1.1 2001/11/01 12:27:47 vdv Exp $ -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:simpleType name="string255">
+ <xs:restriction base="xs:token">
+ <xs:maxLength value="255"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="string32">
+ <xs:restriction base="xs:token">
+ <xs:maxLength value="32"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="isbn">
+ <xs:restriction base="xs:unsignedLong">
+ <xs:totalDigits value="10"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="supportedLanguages">
+ <xs:restriction base="xs:language">
+ <xs:enumeration value="en"/>
+ <xs:enumeration value="es"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="name" type="string32"/>
+ <xs:element name="qualification" type="string255"/>
+ <xs:element name="born" type="xs:date"/>
+ <xs:element name="dead" type="xs:date"/>
+ <xs:element name="isbn" type="isbn"/>
+
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="available" type="xs:boolean"/>
+ <xs:attribute name="lang" type="supportedLanguages"/>
+
+ <xs:element name="title">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="string255">
+ <xs:attribute ref="lang"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="library">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="book" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="author">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="dead" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="book">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="isbn"/>
+ <xs:element ref="title"/>
+ <xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ <xs:attribute ref="available"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="character">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="qualification"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
diff --git a/test/schemas/vdv-first3_0.xml b/test/schemas/vdv-first3_0.xml
new file mode 100644
index 0000000..a12bcad
--- /dev/null
+++ b/test/schemas/vdv-first3_0.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first.xml,v 1.2 2001/11/01 22:03:06 vdv Exp $ -->
+<library>
+ <book id="b0836217462" available="true">
+ <isbn>0836217462</isbn>
+ <title lang="en">Being a Dog Is a Full-Time Job</title>
+ <author id="CMS">
+ <name>Charles M Schulz</name>
+ <born>1922-11-26</born>
+ <dead>2000-02-12</dead>
+ </author>
+ <character id="PP">
+ <name>Peppermint Patty</name>
+ <born>1966-08-22</born>
+ <qualification>bold, brash and tomboyish</qualification>
+ </character>
+ <character id="Snoopy">
+ <name>Snoopy</name>
+ <born>1950-10-04</born>
+ <qualification>extroverted beagle</qualification>
+ </character>
+ <character id="Schroeder">
+ <name>Schroeder</name>
+ <born>1951-05-30</born>
+ <qualification>brought classical music to the Peanuts strip</qualification>
+ </character>
+ <character id="Lucy">
+ <name>Lucy</name>
+ <born>1952-03-03</born>
+ <qualification>bossy, crabby and selfish</qualification>
+ </character>
+ </book>
+</library>
diff --git a/test/schemas/vdv-first3_0.xsd b/test/schemas/vdv-first3_0.xsd
new file mode 100644
index 0000000..18b1459
--- /dev/null
+++ b/test/schemas/vdv-first3_0.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Header: /home/cvsroot/w3c-xml-schema/user/examples/first-token.xsd,v 1.2 2001/11/01 12:27:47 vdv Exp $ -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="name" type="xs:token"/>
+ <xs:element name="qualification" type="xs:token"/>
+ <xs:element name="born" type="xs:date"/>
+ <xs:element name="dead" type="xs:date"/>
+ <xs:element name="isbn" type="xs:unsignedLong"/>
+
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="available" type="xs:boolean"/>
+ <xs:attribute name="lang" type="xs:language"/>
+
+ <xs:element name="title">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:token">
+ <xs:attribute ref="lang"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="library">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="book" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="author">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="dead" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="book">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="isbn"/>
+ <xs:element ref="title"/>
+ <xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ <xs:attribute ref="available"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="character">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="name"/>
+ <xs:element ref="born"/>
+ <xs:element ref="qualification"/>
+ </xs:sequence>
+ <xs:attribute ref="id"/>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
diff --git a/xmlschemas.c b/xmlschemas.c
index 6976cc7..58a460e 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -24,6 +24,7 @@
#include <libxml/xmlschemastypes.h>
#include <libxml/xmlautomata.h>
#include <libxml/xmlregexp.h>
+#include <libxml/dict.h>
/* #define DEBUG 1 */
@@ -67,11 +68,14 @@
int nberrors;
xmlStructuredErrorFunc serror;
+ xmlSchemaPtr topschema; /* The main schema */
+ xmlHashTablePtr namespaces; /* Hash table of namespaces to schemas */
+
xmlSchemaPtr schema; /* The schema in use */
- xmlChar *container; /* the current element, group, ... */
+ const xmlChar *container; /* the current element, group, ... */
int counter;
- xmlChar *URL;
+ const xmlChar *URL;
xmlDocPtr doc;
const char *buffer;
@@ -84,6 +88,8 @@
xmlAutomataStatePtr start;
xmlAutomataStatePtr end;
xmlAutomataStatePtr state;
+
+ xmlDictPtr dict; /* dictionnary for interned string names */
};
@@ -150,7 +156,7 @@
************************************************************************/
static int xmlSchemaValidateSimpleValue(xmlSchemaValidCtxtPtr ctxt,
xmlSchemaTypePtr type,
- xmlChar * value);
+ const xmlChar * value);
/************************************************************************
* *
@@ -343,6 +349,8 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchema));
+ xmlDictReference(ctxt->dict);
+ ret->dict = ctxt->dict;
return (ret);
}
@@ -419,7 +427,6 @@
return;
xmlSchemaFree(import->schema);
- xmlFree((xmlChar *) import->schemaLocation);
xmlFree(import);
}
@@ -434,8 +441,6 @@
{
if (nota == NULL)
return;
- if (nota->name != NULL)
- xmlFree((xmlChar *) nota->name);
xmlFree(nota);
}
@@ -450,16 +455,6 @@
{
if (attr == NULL)
return;
- if (attr->name != NULL)
- xmlFree((xmlChar *) attr->name);
- if (attr->ref != NULL)
- xmlFree((xmlChar *) attr->ref);
- if (attr->refNs != NULL)
- xmlFree((xmlChar *) attr->refNs);
- if (attr->typeName != NULL)
- xmlFree((xmlChar *) attr->typeName);
- if (attr->typeNs != NULL)
- xmlFree((xmlChar *) attr->typeNs);
xmlFree(attr);
}
@@ -474,12 +469,6 @@
{
if (attr == NULL)
return;
- if (attr->name != NULL)
- xmlFree((xmlChar *) attr->name);
- if (attr->ref != NULL)
- xmlFree((xmlChar *) attr->ref);
- if (attr->refNs != NULL)
- xmlFree((xmlChar *) attr->refNs);
xmlFree(attr);
}
@@ -494,16 +483,6 @@
{
if (elem == NULL)
return;
- if (elem->name != NULL)
- xmlFree((xmlChar *) elem->name);
- if (elem->namedType != NULL)
- xmlFree((xmlChar *) elem->namedType);
- if (elem->namedTypeNs != NULL)
- xmlFree((xmlChar *) elem->namedTypeNs);
- if (elem->ref != NULL)
- xmlFree((xmlChar *) elem->ref);
- if (elem->refNs != NULL)
- xmlFree((xmlChar *) elem->refNs);
if (elem->annot != NULL)
xmlSchemaFreeAnnot(elem->annot);
if (elem->contModel != NULL)
@@ -522,10 +501,6 @@
{
if (facet == NULL)
return;
- if (facet->value != NULL)
- xmlFree((xmlChar *) facet->value);
- if (facet->id != NULL)
- xmlFree((xmlChar *) facet->id);
if (facet->val != NULL)
xmlSchemaFreeValue(facet->val);
if (facet->regexp != NULL)
@@ -546,14 +521,6 @@
{
if (type == NULL)
return;
- if (type->name != NULL)
- xmlFree((xmlChar *) type->name);
- if (type->ref != NULL)
- xmlFree((xmlChar *) type->ref);
- if (type->base != NULL)
- xmlFree((xmlChar *) type->base);
- if (type->baseNs != NULL)
- xmlFree((xmlChar *) type->baseNs);
if (type->annot != NULL)
xmlSchemaFreeAnnot(type->annot);
if (type->facets != NULL) {
@@ -581,12 +548,6 @@
if (schema == NULL)
return;
- if (schema->id != NULL)
- xmlFree((xmlChar *) schema->id);
- if (schema->targetNamespace != NULL)
- xmlFree((xmlChar *) schema->targetNamespace);
- if (schema->name != NULL)
- xmlFree((xmlChar *) schema->name);
if (schema->notaDecl != NULL)
xmlHashFree(schema->notaDecl,
(xmlHashDeallocator) xmlSchemaFreeNotation);
@@ -612,6 +573,7 @@
xmlSchemaFreeAnnot(schema->annot);
if (schema->doc != NULL)
xmlFreeDoc(schema->doc);
+ xmlDictFree(schema->dict);
xmlFree(schema);
}
@@ -856,12 +818,168 @@
#endif /* LIBXML_OUTPUT_ENABLED */
/************************************************************************
+ * *
+ * Utilities *
+ * *
+ ************************************************************************/
+/**
+ * numberedString:
+ * @prefix: the string prefix
+ * @number: the number
+ *
+ * Build a new numbered string
+ *
+ * Returns the new string
+ */
+
+/**
+ * xmlSchemaGetProp:
+ * @ctxt: the parser context
+ * @node: the node
+ * @name: the property name
+ *
+ * Read a attribute value and internalize the string
+ *
+ * Returns the string or NULL if not present.
+ */
+static const xmlChar *
+xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
+ const char *name)
+{
+ xmlChar *val;
+ const xmlChar *ret;
+
+ val = xmlGetProp(node, BAD_CAST name);
+ if (val == NULL)
+ return(NULL);
+ ret = xmlDictLookup(ctxt->dict, val, -1);
+ xmlFree(val);
+ return(ret);
+}
+
+/**
+ * xmlSchemaGetNamespace:
+ * @ctxt: the parser context
+ * @schema: the schemas containing the declaration
+ * @node: the node
+ * @qname: the QName to analyze
+ *
+ * Find the namespace name for the given declaration.
+ *
+ * Returns the local name for that declaration, as well as the namespace name
+ */
+static const xmlChar *
+xmlSchemaGetNamespace(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
+ xmlNodePtr node, const xmlChar *qname,
+ const xmlChar **namespace) {
+ int len;
+ const xmlChar *name, *prefix, *def = NULL;
+ xmlNsPtr ns;
+
+ *namespace = NULL;
+
+ if (xmlStrEqual(node->name, BAD_CAST "element") ||
+ xmlStrEqual(node->name, BAD_CAST "attribute") ||
+ xmlStrEqual(node->name, BAD_CAST "simpleType") ||
+ xmlStrEqual(node->name, BAD_CAST "complexType")) {
+ def = xmlSchemaGetProp(ctxt, node, "targetNamespace");
+ }
+
+ qname = xmlDictLookup(ctxt->dict, qname, -1); /* intern the string */
+ name = xmlSplitQName3(qname, &len);
+ if (name == NULL) {
+ if (def == NULL) {
+ if (xmlStrEqual(node->name, BAD_CAST "element")) {
+ if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
+ *namespace = schema->targetNamespace;
+ } else if (xmlStrEqual(node->name, BAD_CAST "attribute")) {
+ if (schema->flags & XML_SCHEMAS_QUALIF_ATTR)
+ *namespace = schema->targetNamespace;
+ } else if ((xmlStrEqual(node->name, BAD_CAST "simpleType")) ||
+ (xmlStrEqual(node->name, BAD_CAST "complexType"))) {
+ *namespace = schema->targetNamespace;
+ }
+ } else {
+ *namespace = def;
+ }
+ return(qname);
+ }
+ name = xmlDictLookup(ctxt->dict, name, -1);
+ prefix = xmlDictLookup(ctxt->dict, qname, len);
+ if (def != NULL) {
+ xmlSchemaPErr(ctxt, node, XML_SCHEMAP_DEF_AND_PREFIX,
+ "%s: presence of both prefix %s and targetNamespace\n",
+ node->name, prefix);
+ }
+ ns = xmlSearchNs(node->doc, node, prefix);
+ if (ns == NULL) {
+ xmlSchemaPErr(ctxt, node, XML_SCHEMAP_PREFIX_UNDEFINED,
+ "%s: the QName prefix %s is undefined\n",
+ node->name, prefix);
+ return(name);
+ }
+ *namespace = xmlDictLookup(ctxt->dict, ns->href, -1);
+ return(name);
+}
+
+/************************************************************************
* *
* Parsing functions *
* *
************************************************************************/
/**
+ * xmlSchemaGetElem:
+ * @schema: the schemas context
+ * @name: the element name
+ * @ns: the element namespace
+ *
+ * Lookup a an element in the schemas or the accessible schemas
+ *
+ * Returns the element definition or NULL if not found.
+ */
+static xmlSchemaElementPtr
+xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name,
+ const xmlChar * namespace)
+{
+ xmlSchemaElementPtr ret;
+ xmlSchemaImportPtr import;
+
+ if ((name == NULL) || (schema == NULL))
+ return (NULL);
+
+ if (namespace == NULL) {
+ ret = xmlHashLookup2(schema->elemDecl, name, namespace);
+ if (ret != NULL)
+ return (ret);
+ } else if ((schema->flags & XML_SCHEMAS_QUALIF_ELEM) == 0) {
+ if (xmlStrEqual(namespace, schema->targetNamespace))
+ ret = xmlHashLookup2(schema->elemDecl, name, NULL);
+ else
+ ret = xmlHashLookup2(schema->elemDecl, name, namespace);
+ if (ret != NULL)
+ return (ret);
+ } else {
+ ret = xmlHashLookup2(schema->elemDecl, name, namespace);
+ if (ret != NULL)
+ return (ret);
+ }
+ import = xmlHashLookup(schema->schemasImports, namespace);
+ if (import != NULL)
+ ret = xmlSchemaGetElem(import->schema, name, namespace);
+#ifdef DEBUG
+ if (ret == NULL) {
+ if (namespace == NULL)
+ fprintf(stderr, "Unable to lookup type %s", name);
+ else
+ fprintf(stderr, "Unable to lookup type %s:%s", name,
+ namespace);
+ }
+#endif
+ return (ret);
+}
+
+/**
* xmlSchemaGetType:
* @schema: the schemas context
* @name: the type name
@@ -965,7 +1083,7 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaNotation));
- ret->name = xmlStrdup(name);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
val = xmlHashAddEntry2(schema->notaDecl, name, schema->targetNamespace,
ret);
if (val != 0) {
@@ -973,7 +1091,6 @@
XML_SCHEMAP_REDEFINED_NOTATION,
"Notation %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -986,7 +1103,7 @@
* @ctxt: a schema validation context
* @schema: the schema being built
* @name: the item name
- * @container: the container's name
+ * @namespace: the namespace
*
* Add an XML schema Attrribute declaration
* *WARNING* this interface is highly subject to change
@@ -995,7 +1112,7 @@
*/
static xmlSchemaAttributePtr
xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
- const xmlChar * name)
+ const xmlChar * name, const xmlChar * namespace)
{
xmlSchemaAttributePtr ret = NULL;
int val;
@@ -1003,6 +1120,12 @@
if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
return (NULL);
+#ifdef DEBUG
+ fprintf(stderr, "Adding attribute %s\n", name);
+ if (namespace != NULL)
+ fprintf(stderr, " target namespace %s\n", namespace);
+#endif
+
if (schema->attrDecl == NULL)
schema->attrDecl = xmlHashCreate(10);
if (schema->attrDecl == NULL)
@@ -1014,7 +1137,8 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaAttribute));
- ret->name = xmlStrdup(name);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
+ ret->targetNamespace = xmlDictLookup(ctxt->dict, namespace, -1);
val = xmlHashAddEntry3(schema->attrDecl, name,
schema->targetNamespace, ctxt->container, ret);
if (val != 0) {
@@ -1022,7 +1146,6 @@
XML_SCHEMAP_REDEFINED_ATTR,
"Attribute %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -1062,7 +1185,7 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaAttributeGroup));
- ret->name = xmlStrdup(name);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
val = xmlHashAddEntry3(schema->attrgrpDecl, name,
schema->targetNamespace, ctxt->container, ret);
if (val != 0) {
@@ -1070,7 +1193,6 @@
XML_SCHEMAP_REDEFINED_ATTRGROUP,
"Attribute group %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -1099,6 +1221,12 @@
if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
return (NULL);
+#ifdef DEBUG
+ fprintf(stderr, "Adding element %s\n", name);
+ if (namespace != NULL)
+ fprintf(stderr, " target namespace %s\n", namespace);
+#endif
+
if (schema->elemDecl == NULL)
schema->elemDecl = xmlHashCreate(10);
if (schema->elemDecl == NULL)
@@ -1110,13 +1238,14 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaElement));
- ret->name = xmlStrdup(name);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
+ ret->targetNamespace = xmlDictLookup(ctxt->dict, namespace, -1);
val = xmlHashAddEntry3(schema->elemDecl, name,
namespace, ctxt->container, ret);
if (val != 0) {
char buf[100];
- snprintf(buf, 99, "privatieelem%d", ctxt->counter++ + 1);
+ snprintf(buf, 99, "privatieelem %d", ctxt->counter++ + 1);
val = xmlHashAddEntry3(schema->elemDecl, name, (xmlChar *) buf,
namespace, ret);
if (val != 0) {
@@ -1124,7 +1253,6 @@
XML_SCHEMAP_REDEFINED_ELEMENT,
"Element %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -1137,6 +1265,7 @@
* @ctxt: a schema validation context
* @schema: the schema being built
* @name: the item name
+ * @namespace: the namespace
*
* Add an XML schema Simple Type definition
* *WARNING* this interface is highly subject to change
@@ -1145,7 +1274,7 @@
*/
static xmlSchemaTypePtr
xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
- const xmlChar * name)
+ const xmlChar * name, const xmlChar * namespace)
{
xmlSchemaTypePtr ret = NULL;
int val;
@@ -1153,6 +1282,12 @@
if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
return (NULL);
+#ifdef DEBUG
+ fprintf(stderr, "Adding type %s\n", name);
+ if (namespace != NULL)
+ fprintf(stderr, " target namespace %s\n", namespace);
+#endif
+
if (schema->typeDecl == NULL)
schema->typeDecl = xmlHashCreate(10);
if (schema->typeDecl == NULL)
@@ -1164,15 +1299,13 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaType));
- ret->name = xmlStrdup(name);
- val = xmlHashAddEntry2(schema->typeDecl, name, schema->targetNamespace,
- ret);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
+ val = xmlHashAddEntry2(schema->typeDecl, name, namespace, ret);
if (val != 0) {
xmlSchemaPErr(ctxt, (xmlNodePtr) ctxt->doc,
XML_SCHEMAP_REDEFINED_TYPE,
"Type %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -1213,7 +1346,7 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaType));
- ret->name = xmlStrdup(name);
+ ret->name = xmlDictLookup(ctxt->dict, name, -1);
val =
xmlHashAddEntry2(schema->groupDecl, name, schema->targetNamespace,
ret);
@@ -1222,7 +1355,6 @@
XML_SCHEMAP_REDEFINED_GROUP,
"Group %s already defined\n",
name, NULL);
- xmlFree((char *) ret->name);
xmlFree(ret);
return (NULL);
}
@@ -1250,24 +1382,26 @@
* Returns the NCName or NULL if not found, and also update @namespace
* with the namespace URI
*/
-static xmlChar *
+static const xmlChar *
xmlGetQNameProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
- const char *name, xmlChar ** namespace)
+ const char *name, const xmlChar ** namespace)
{
- xmlChar *val, *ret, *prefix;
+ const xmlChar *val;
xmlNsPtr ns;
+ const xmlChar *ret, *prefix;
+ int len;
-
- if (namespace != NULL)
- *namespace = NULL;
- val = xmlGetProp(node, (const xmlChar *) name);
+ *namespace = NULL;
+ val = xmlSchemaGetProp(ctxt, node, name);
if (val == NULL)
return (NULL);
- ret = xmlSplitQName2(val, &prefix);
- if (ret == NULL)
+ ret = xmlSplitQName3(val, &len);
+ if (ret == NULL) {
return (val);
- xmlFree(val);
+ }
+ ret = xmlDictLookup(ctxt->dict, ret, -1);
+ prefix = xmlDictLookup(ctxt->dict, val, len);
ns = xmlSearchNs(node->doc, node, prefix);
if (ns == NULL) {
@@ -1275,9 +1409,8 @@
"Attribute %s: the QName prefix %s is undefined\n",
(const xmlChar *) name, prefix);
} else {
- *namespace = xmlStrdup(ns->href);
+ *namespace = xmlDictLookup(ctxt->dict, ns->href, -1);
}
- xmlFree(prefix);
return (ret);
}
@@ -1293,16 +1426,15 @@
static int
xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
{
- xmlChar *val, *cur;
+ const xmlChar *val, *cur;
int ret = 0;
- val = xmlGetProp(node, (const xmlChar *) "maxOccurs");
+ val = xmlSchemaGetProp(ctxt, node, "maxOccurs");
if (val == NULL)
return (1);
if (xmlStrEqual(val, (const xmlChar *) "unbounded")) {
- xmlFree(val);
- return (UNBOUNDED); /* encoding it with -1 might be another option */
+ return (UNBOUNDED); /* encoding it with -1 might be another option */
}
cur = val;
@@ -1317,10 +1449,8 @@
if (*cur != 0) {
xmlSchemaPErr(ctxt, node, XML_SCHEMAP_INVALID_MAXOCCURS,
"invalid value for maxOccurs: %s\n", val, NULL);
- xmlFree(val);
return (1);
}
- xmlFree(val);
return (ret);
}
@@ -1336,10 +1466,10 @@
static int
xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
{
- xmlChar *val, *cur;
+ const xmlChar *val, *cur;
int ret = 0;
- val = xmlGetProp(node, (const xmlChar *) "minOccurs");
+ val = xmlSchemaGetProp(ctxt, node, "minOccurs");
if (val == NULL)
return (1);
@@ -1355,10 +1485,8 @@
if (*cur != 0) {
xmlSchemaPErr(ctxt, node, XML_SCHEMAP_INVALID_MINOCCURS,
"invalid value for minOccurs: %s\n", val, NULL);
- xmlFree(val);
return (1);
}
- xmlFree(val);
return (ret);
}
@@ -1378,9 +1506,9 @@
xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
const char *name, int def)
{
- xmlChar *val;
+ const xmlChar *val;
- val = xmlGetProp(node, (const xmlChar *) name);
+ val = xmlSchemaGetProp(ctxt, node, name);
if (val == NULL)
return (def);
@@ -1393,7 +1521,6 @@
"Attribute %s: the value %s is not boolean\n",
(const xmlChar *) name, val);
}
- xmlFree(val);
return (def);
}
@@ -1533,7 +1660,7 @@
{
xmlSchemaFacetPtr facet;
xmlNodePtr child = NULL;
- xmlChar *value;
+ const xmlChar *value;
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
@@ -1544,7 +1671,7 @@
return (NULL);
}
facet->node = node;
- value = xmlGetProp(node, (const xmlChar *) "value");
+ value = xmlSchemaGetProp(ctxt, node, "value");
if (value == NULL) {
xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE,
"Facet %s has no value\n", node->name, NULL);
@@ -1581,7 +1708,7 @@
xmlSchemaFreeFacet(facet);
return (NULL);
}
- facet->id = xmlGetProp(node, (const xmlChar *) "id");
+ facet->id = xmlSchemaGetProp(ctxt, node, "id");
facet->value = value;
child = node->children;
@@ -1619,7 +1746,7 @@
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
snprintf((char *) name, 30, "any %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
@@ -1656,13 +1783,13 @@
xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
xmlNodePtr node)
{
- xmlChar *name;
+ const xmlChar *name;
xmlSchemaNotationPtr ret;
xmlNodePtr child = NULL;
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME,
"Notation has no name\n", NULL, NULL);
@@ -1670,7 +1797,6 @@
}
ret = xmlSchemaAddNotation(ctxt, schema, name);
if (ret == NULL) {
- xmlFree(name);
return (NULL);
}
child = node->children;
@@ -1702,22 +1828,24 @@
xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
xmlSchemaPtr schema, xmlNodePtr node)
{
- xmlChar *processContents;
+ const xmlChar *processContents;
xmlSchemaAttributePtr ret;
xmlNodePtr child = NULL;
char name[100];
+ const xmlChar *local, *ns;
+
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
snprintf(name, 99, "anyattr %d", ctxt->counter++ + 1);
- ret = xmlSchemaAddAttribute(ctxt, schema, (xmlChar *) name);
+ local = xmlSchemaGetNamespace(ctxt, schema, node, BAD_CAST "anyattr", &ns);
+ ret = xmlSchemaAddAttribute(ctxt, schema, BAD_CAST name, ns);
if (ret == NULL) {
return (NULL);
}
- ret->id = xmlGetProp(node, (const xmlChar *) "id");
- processContents =
- xmlGetProp(node, (const xmlChar *) "processContents");
+ ret->id = xmlSchemaGetProp(ctxt, node, "id");
+ processContents = xmlSchemaGetProp(ctxt, node, "processContents");
if ((processContents == NULL)
|| (xmlStrEqual(processContents, (const xmlChar *) "strict"))) {
ret->occurs = XML_SCHEMAS_ANYATTR_STRICT;
@@ -1732,8 +1860,6 @@
processContents, NULL);
ret->occurs = XML_SCHEMAS_ANYATTR_STRICT;
}
- if (processContents != NULL)
- xmlFree(processContents);
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -1767,15 +1893,15 @@
xmlSchemaParseAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
xmlNodePtr node)
{
- xmlChar *name, *refNs = NULL, *ref = NULL;
+ const xmlChar *name, *refNs = NULL, *ref = NULL;
xmlSchemaAttributePtr ret;
xmlNodePtr child = NULL;
+ char buf[100];
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
- char buf[100];
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
@@ -1784,20 +1910,29 @@
"Attribute has no name nor ref\n", NULL, NULL);
return (NULL);
}
- snprintf(buf, 99, "anonattr%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ if (refNs == NULL)
+ refNs = schema->targetNamespace;
+ snprintf(buf, 99, "anonattr %d", ctxt->counter++ + 1);
+ name = (const xmlChar *) buf;
+ ret = xmlSchemaAddAttribute(ctxt, schema, name, NULL);
+ } else {
+ const xmlChar *local, *ns;
+
+ local = xmlSchemaGetNamespace(ctxt, schema, node, name, &ns);
+ ret = xmlSchemaAddAttribute(ctxt, schema, local, ns);
}
- ret = xmlSchemaAddAttribute(ctxt, schema, name);
if (ret == NULL) {
- xmlFree(name);
- if (ref != NULL)
- xmlFree(ref);
return (NULL);
}
- xmlFree(name);
ret->ref = ref;
ret->refNs = refNs;
+ if ((ret->targetNamespace != NULL) &&
+ ((schema->flags & XML_SCHEMAS_QUALIF_ATTR) == 0) &&
+ (xmlStrEqual(ret->targetNamespace, schema->targetNamespace)))
+ ret->flags |= XML_SCHEMAS_ATTR_NSDEFAULT;
ret->typeName = xmlGetQNameProp(ctxt, node, "type", &(ret->typeNs));
+ if ((ret->typeName != NULL) && (ret->typeNs == NULL))
+ ret->typeNs = schema->targetNamespace;
ret->node = node;
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -1832,18 +1967,18 @@
xmlSchemaParseAttributeGroup(xmlSchemaParserCtxtPtr ctxt,
xmlSchemaPtr schema, xmlNodePtr node)
{
- xmlChar *name, *refNs = NULL, *ref = NULL;
+ const xmlChar *name, *refNs = NULL, *ref = NULL;
xmlSchemaAttributeGroupPtr ret;
xmlSchemaAttributePtr last = NULL, attr;
xmlNodePtr child = NULL;
- xmlChar *oldcontainer;
+ const xmlChar *oldcontainer;
+ char buf[100];
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
oldcontainer = ctxt->container;
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
- char buf[100];
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
@@ -1853,8 +1988,10 @@
NULL);
return (NULL);
}
- snprintf(buf, 99, "anonattrgroup%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ if (refNs == NULL)
+ refNs = schema->targetNamespace;
+ snprintf(buf, 99, "anonattrgroup %d", ctxt->counter++ + 1);
+ name = (const xmlChar *) buf;
if (name == NULL) {
xmlSchemaPErrMemory(ctxt, "creating attribute group", node);
return (NULL);
@@ -1862,9 +1999,6 @@
}
ret = xmlSchemaAddAttributeGroup(ctxt, schema, name);
if (ret == NULL) {
- xmlFree(name);
- if (ref != NULL)
- xmlFree(ref);
return (NULL);
}
ret->ref = ref;
@@ -1898,7 +2032,8 @@
child = child->next;
}
if (IS_SCHEMA(child, "anyAttribute")) {
- TODO child = child->next;
+ TODO
+ child = child->next;
}
if (child != NULL) {
xmlSchemaPErr2(ctxt, node, child,
@@ -1906,9 +2041,7 @@
"attribute group %s has unexpected content\n", name,
NULL);
}
-
ctxt->container = oldcontainer;
- xmlFree(name);
return (ret);
}
@@ -1928,17 +2061,18 @@
xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
xmlNodePtr node, int toplevel)
{
- xmlChar *name, *refNs = NULL, *ref = NULL, *namespace, *fixed;
+ const xmlChar *name, *fixed;
+ const xmlChar *refNs = NULL, *ref = NULL;
xmlSchemaElementPtr ret;
xmlNodePtr child = NULL;
- xmlChar *oldcontainer;
+ const xmlChar *oldcontainer;
+ char buf[100];
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
oldcontainer = ctxt->container;
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
- char buf[100];
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
@@ -1947,23 +2081,20 @@
"Element has no name nor ref\n", NULL, NULL);
return (NULL);
}
- snprintf(buf, 99, "anonelem%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ if (refNs == NULL)
+ refNs = schema->targetNamespace;
+ snprintf(buf, 99, "anonelem %d", ctxt->counter++ + 1);
+ name = (const xmlChar *) buf;
+ ret = xmlSchemaAddElement(ctxt, schema, name, NULL);
+ } else {
+ const xmlChar *local, *ns;
+
+ local = xmlSchemaGetNamespace(ctxt, schema, node, name, &ns);
+ ret = xmlSchemaAddElement(ctxt, schema, local, ns);
}
- namespace = xmlGetProp(node, (const xmlChar *) "targetNamespace");
- if (namespace == NULL)
- ret =
- xmlSchemaAddElement(ctxt, schema, name,
- schema->targetNamespace);
- else
- ret = xmlSchemaAddElement(ctxt, schema, name, namespace);
- ret->node = node;
- if (namespace != NULL)
- xmlFree(namespace);
+ if (ret != NULL)
+ ret->node = node;
if (ret == NULL) {
- xmlFree(name);
- if (ref != NULL)
- xmlFree(ref);
return (NULL);
}
ret->type = XML_SCHEMA_TYPE_ELEMENT;
@@ -1979,22 +2110,23 @@
ret->flags |= XML_SCHEMAS_ELEM_NILLABLE;
ctxt->container = name;
- ret->id = xmlGetProp(node, BAD_CAST "id");
+ ret->id = xmlSchemaGetProp(ctxt, node, "id");
ret->namedType =
xmlGetQNameProp(ctxt, node, "type", &(ret->namedTypeNs));
+ if ((ret->namedType != NULL) && (ret->namedTypeNs == NULL))
+ ret->namedTypeNs = schema->targetNamespace;
ret->substGroup =
xmlGetQNameProp(ctxt, node, "substitutionGroup",
&(ret->substGroupNs));
- fixed = xmlGetProp(node, BAD_CAST "fixed");
+ fixed = xmlSchemaGetProp(ctxt, node, "fixed");
ret->minOccurs = xmlGetMinOccurs(ctxt, node);
ret->maxOccurs = xmlGetMaxOccurs(ctxt, node);
- ret->value = xmlGetProp(node, BAD_CAST "default");
+ ret->value = xmlSchemaGetProp(ctxt, node, "default");
if ((ret->value != NULL) && (fixed != NULL)) {
xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_ELEM_DEFAULT_FIXED,
"Element %s has both default and fixed\n",
ret->name, NULL);
- xmlFree(fixed);
} else if (fixed != NULL) {
ret->flags |= XML_SCHEMAS_ELEM_FIXED;
ret->value = fixed;
@@ -2022,7 +2154,6 @@
}
ctxt->container = oldcontainer;
- xmlFree(name);
return (ret);
}
@@ -2051,13 +2182,13 @@
snprintf((char *) name, 30, "union %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_LIST;
- type->id = xmlGetProp(node, BAD_CAST "id");
- type->ref = xmlGetProp(node, BAD_CAST "memberTypes");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
+ type->ref = xmlSchemaGetProp(ctxt, node, "memberTypes");
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -2111,13 +2242,15 @@
return (NULL);
snprintf((char *) name, 30, "list %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_LIST;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->ref = xmlGetQNameProp(ctxt, node, "ref", &(type->refNs));
+ if ((type->ref != NULL) && (type->refNs == NULL))
+ type->refNs = schema->targetNamespace;
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -2157,31 +2290,29 @@
{
xmlSchemaTypePtr type, subtype;
xmlNodePtr child = NULL;
- xmlChar *name;
+ const xmlChar *name;
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
char buf[100];
- snprintf(buf, 99, "simpletype%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ snprintf(buf, 99, "simpletype %d", ctxt->counter++ + 1);
+ type = xmlSchemaAddType(ctxt, schema, (const xmlChar *)buf, NULL);
+ } else {
+ const xmlChar *local, *ns;
+
+ local = xmlSchemaGetNamespace(ctxt, schema, node, name, &ns);
+ type = xmlSchemaAddType(ctxt, schema, local, ns);
}
- if (name == NULL) {
- xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_SIMPLETYPE_NONAME,
- "simpleType has no name\n", NULL, NULL);
- return (NULL);
- }
- type = xmlSchemaAddType(ctxt, schema, name);
- xmlFree(name);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_SIMPLE;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -2232,15 +2363,16 @@
{
xmlSchemaTypePtr type, subtype;
xmlNodePtr child = NULL;
- xmlChar *name, *ref = NULL, *refNs = NULL;
+ const xmlChar *name;
+ const xmlChar *ref = NULL, *refNs = NULL;
+ char buf[100];
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
- char buf[100];
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
@@ -2249,17 +2381,18 @@
"Group has no name nor ref\n", NULL, NULL);
return (NULL);
}
- snprintf(buf, 99, "anongroup%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ if (refNs == NULL)
+ refNs = schema->targetNamespace;
+ snprintf(buf, 99, "anongroup %d", ctxt->counter++ + 1);
+ name = (const xmlChar *) buf;
}
type = xmlSchemaAddGroup(ctxt, schema, name);
- xmlFree(name);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_GROUP;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->ref = ref;
type->refNs = refNs;
type->minOccurs = xmlGetMinOccurs(ctxt, node);
@@ -2319,12 +2452,12 @@
snprintf((char *) name, 30, "all%d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_ALL;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->minOccurs = xmlGetMinOccurs(ctxt, node);
type->maxOccurs = xmlGetMaxOccurs(ctxt, node);
@@ -2393,7 +2526,7 @@
}
memset(import, 0, sizeof(xmlSchemaImport));
- import->schemaLocation = xmlStrdup(schemaLocation);
+ import->schemaLocation = xmlDictLookup(ctxt->dict, schemaLocation, -1);
import->schema = xmlSchemaParse(newctxt);
if (import->schema == NULL) {
@@ -2432,8 +2565,8 @@
{
xmlNodePtr child = NULL;
xmlSchemaImportPtr import = NULL;
- xmlChar *namespace;
- xmlChar *schemaLocation;
+ const xmlChar *namespace;
+ const xmlChar *schemaLocation;
const xmlChar *previous;
xmlURIPtr check;
@@ -2441,7 +2574,7 @@
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (-1);
- namespace = xmlGetProp(node, BAD_CAST "namespace");
+ namespace = xmlSchemaGetProp(ctxt, node, "namespace");
if (namespace != NULL) {
check = xmlParseURI((const char *) namespace);
if (check == NULL) {
@@ -2449,13 +2582,12 @@
XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI,
"Import namespace attribute is not an URI: %s\n",
namespace, NULL);
- xmlFree(namespace);
return (-1);
} else {
xmlFreeURI(check);
}
}
- schemaLocation = xmlGetProp(node, BAD_CAST "schemaLocation");
+ schemaLocation = xmlSchemaGetProp(ctxt, node, "schemaLocation");
if (schemaLocation != NULL) {
xmlChar *base = NULL;
xmlChar *URI = NULL;
@@ -2465,9 +2597,6 @@
XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI,
"Import schemaLocation attribute is not an URI: %s\n",
schemaLocation, NULL);
- if (namespace != NULL)
- xmlFree(namespace);
- xmlFree(schemaLocation);
return (-1);
} else {
xmlFreeURI(check);
@@ -2477,11 +2606,11 @@
URI = xmlBuildURI(schemaLocation, node->doc->URL);
} else {
URI = xmlBuildURI(schemaLocation, base);
+ xmlFree(base);
}
- if (base != NULL) xmlFree(base);
if (URI != NULL) {
- xmlFree(schemaLocation);
- schemaLocation = URI;
+ schemaLocation = xmlDictLookup(ctxt->dict, URI, -1);
+ xmlFree(URI);
}
}
if (schema->schemasImports == NULL) {
@@ -2491,10 +2620,6 @@
XML_SCHEMAP_FAILED_BUILD_IMPORT,
"Internal: failed to build import table\n",
NULL, NULL);
- if (namespace != NULL)
- xmlFree(namespace);
- if (schemaLocation != NULL)
- xmlFree(schemaLocation);
return (-1);
}
}
@@ -2517,17 +2642,12 @@
} else {
import = xmlSchemaImportSchema(ctxt, schemaLocation);
if (import == NULL) {
- if (schemaLocation != NULL)
- xmlFree(schemaLocation);
- if (namespace != NULL)
- xmlFree(namespace);
return (-1);
}
xmlHashAddEntry(schema->schemasImports,
XML_SCHEMAS_DEFAULT_NAMESPACE,
import);
}
- xmlFree(schemaLocation);
}
} else {
import = xmlHashLookup(schema->schemasImports, namespace);
@@ -2547,20 +2667,13 @@
} else {
import = xmlSchemaImportSchema(ctxt, schemaLocation);
if (import == NULL) {
- if (schemaLocation != NULL)
- xmlFree(schemaLocation);
- if (namespace != NULL)
- xmlFree(namespace);
return (-1);
}
xmlHashAddEntry(schema->schemasImports,
namespace, import);
}
}
- xmlFree(namespace);
}
- if (schemaLocation != NULL)
- xmlFree(schemaLocation);
child = node->children;
while (IS_SCHEMA(child, "annotation")) {
@@ -2602,12 +2715,12 @@
snprintf((char *) name, 30, "choice %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_CHOICE;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->minOccurs = xmlGetMinOccurs(ctxt, node);
type->maxOccurs = xmlGetMaxOccurs(ctxt, node);
@@ -2680,12 +2793,12 @@
snprintf((char *) name, 30, "sequence %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_SEQUENCE;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->minOccurs = xmlGetMinOccurs(ctxt, node);
type->maxOccurs = xmlGetMaxOccurs(ctxt, node);
@@ -2754,7 +2867,7 @@
xmlSchemaFacetPtr facet, lastfacet = NULL;
xmlNodePtr child = NULL;
xmlChar name[30];
- xmlChar *oldcontainer;
+ const xmlChar *oldcontainer;
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
@@ -2762,12 +2875,12 @@
oldcontainer = ctxt->container;
snprintf((char *) name, 30, "restriction %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_RESTRICTION;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
type->base = xmlGetQNameProp(ctxt, node, "base", &(type->baseNs));
if ((!simple) && (type->base == NULL)) {
xmlSchemaPErr2(ctxt, node, child,
@@ -2867,7 +2980,7 @@
xmlSchemaTypePtr type, subtype;
xmlNodePtr child = NULL;
xmlChar name[30];
- xmlChar *oldcontainer;
+ const xmlChar *oldcontainer;
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
@@ -2875,12 +2988,12 @@
oldcontainer = ctxt->container;
snprintf((char *) name, 30, "extension %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_EXTENSION;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
ctxt->container = name;
type->base = xmlGetQNameProp(ctxt, node, "base", &(type->baseNs));
@@ -2945,12 +3058,12 @@
snprintf((char *) name, 30, "complexContent %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_SIMPLE_CONTENT;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -3001,12 +3114,12 @@
snprintf((char *) name, 30, "complexContent %d", ctxt->counter++ + 1);
- type = xmlSchemaAddType(ctxt, schema, name);
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
if (type == NULL)
return (NULL);
type->node = node;
type->type = XML_SCHEMA_TYPE_COMPLEX_CONTENT;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
@@ -3050,34 +3163,32 @@
{
xmlSchemaTypePtr type, subtype;
xmlNodePtr child = NULL;
- xmlChar *name;
- xmlChar *oldcontainer;
+ const xmlChar *name;
+ const xmlChar *oldcontainer;
+ char buf[100];
if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
return (NULL);
oldcontainer = ctxt->container;
- name = xmlGetProp(node, (const xmlChar *) "name");
+ name = xmlSchemaGetProp(ctxt, node, "name");
if (name == NULL) {
- char buf[100];
- snprintf(buf, 99, "anontype%d", ctxt->counter++ + 1);
- name = xmlStrdup((xmlChar *) buf);
+ snprintf(buf, 99, "anontype %d", ctxt->counter++ + 1);
+ name = (const xmlChar *)buf;
+ type = xmlSchemaAddType(ctxt, schema, name, NULL);
+ } else {
+ const xmlChar *local, *ns;
+
+ local = xmlSchemaGetNamespace(ctxt, schema, node, name, &ns);
+ type = xmlSchemaAddType(ctxt, schema, local, ns);
}
- if (name == NULL) {
- xmlSchemaPErr2(ctxt, node, child,
- XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF,
- "complexType has no name\n", NULL, NULL);
- return (NULL);
- }
- type = xmlSchemaAddType(ctxt, schema, name);
if (type == NULL) {
- xmlFree(name);
return (NULL);
}
type->node = node;
type->type = XML_SCHEMA_TYPE_COMPLEX;
- type->id = xmlGetProp(node, BAD_CAST "id");
+ type->id = xmlSchemaGetProp(ctxt, node, "id");
ctxt->container = name;
child = node->children;
@@ -3118,7 +3229,6 @@
type->name, NULL);
}
ctxt->container = oldcontainer;
- xmlFree(name);
return (type);
}
@@ -3140,7 +3250,7 @@
xmlSchemaPtr schema = NULL;
xmlSchemaAnnotPtr annot;
xmlNodePtr child = NULL;
- xmlChar *val;
+ const xmlChar *val;
int nberrors;
if ((ctxt == NULL) || (node == NULL))
@@ -3152,11 +3262,15 @@
schema = xmlSchemaNewSchema(ctxt);
if (schema == NULL)
return (NULL);
- schema->targetNamespace =
- xmlGetProp(node, BAD_CAST "targetNamespace");
- schema->id = xmlGetProp(node, BAD_CAST "id");
- schema->version = xmlGetProp(node, BAD_CAST "version");
- val = xmlGetProp(node, BAD_CAST "elementFormDefault");
+ val = xmlSchemaGetProp(ctxt, node, "targetNamespace");
+ if (val != NULL) {
+ schema->targetNamespace = xmlDictLookup(ctxt->dict, val, -1);
+ } else {
+ schema->targetNamespace = NULL;
+ }
+ schema->id = xmlSchemaGetProp(ctxt, node, "id");
+ schema->version = xmlSchemaGetProp(ctxt, node, "version");
+ val = xmlSchemaGetProp(ctxt, node, "elementFormDefault");
if (val != NULL) {
if (xmlStrEqual(val, BAD_CAST "qualified"))
schema->flags |= XML_SCHEMAS_QUALIF_ELEM;
@@ -3166,9 +3280,10 @@
"Invalid value %s for elementFormDefault\n",
val, NULL);
}
- xmlFree(val);
- }
- val = xmlGetProp(node, BAD_CAST "attributeFormDefault");
+ } else {
+ schema->flags |= XML_SCHEMAS_QUALIF_ELEM;
+ }
+ val = xmlSchemaGetProp(ctxt, node, "attributeFormDefault");
if (val != NULL) {
if (xmlStrEqual(val, BAD_CAST "qualified"))
schema->flags |= XML_SCHEMAS_QUALIF_ATTR;
@@ -3178,8 +3293,7 @@
"Invalid value %s for attributeFormDefault\n",
val, NULL);
}
- xmlFree(val);
- }
+ }
child = node->children;
while ((IS_SCHEMA(child, "include")) ||
@@ -3290,7 +3404,8 @@
return (NULL);
}
memset(ret, 0, sizeof(xmlSchemaParserCtxt));
- ret->URL = xmlStrdup((const xmlChar *) URL);
+ ret->dict = xmlDictCreate();
+ ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1);
return (ret);
}
@@ -3364,10 +3479,9 @@
{
if (ctxt == NULL)
return;
- if (ctxt->URL != NULL)
- xmlFree(ctxt->URL);
if (ctxt->doc != NULL)
xmlFreeDoc(ctxt->doc);
+ xmlDictFree(ctxt->dict);
xmlFree(ctxt);
}
@@ -3769,7 +3883,8 @@
}
if (elem->subtypes->type != XML_SCHEMA_TYPE_COMPLEX)
return;
- if (elem->subtypes->contentType == XML_SCHEMA_CONTENT_BASIC)
+ if ((elem->subtypes->contentType == XML_SCHEMA_CONTENT_BASIC) ||
+ (elem->subtypes->contentType == XML_SCHEMA_CONTENT_SIMPLE))
return;
#ifdef DEBUG_CONTENT
@@ -3832,8 +3947,7 @@
name, NULL);
return;
}
- elemDecl = xmlHashLookup2(ctxt->schema->elemDecl,
- elem->ref, elem->refNs);
+ elemDecl = xmlSchemaGetElem(ctxt->schema, elem->ref, elem->refNs);
if (elemDecl == NULL) {
xmlSchemaPErr(ctxt, elem->node, XML_SCHEMAP_UNKNOWN_REF,
@@ -3906,9 +4020,13 @@
}
typeDecl->baseType = baseType;
}
- if (typeDecl->subtypes == NULL)
- /* 1.1.1 */
- typeDecl->contentType = XML_SCHEMA_CONTENT_EMPTY;
+ if (typeDecl->subtypes == NULL)
+ if (typeDecl->baseType != NULL)
+ typeDecl->contentType =
+ typeDecl->baseType->contentType;
+ else
+ /* 1.1.1 */
+ typeDecl->contentType = XML_SCHEMA_CONTENT_EMPTY;
else if ((typeDecl->subtypes->subtypes == NULL) &&
((typeDecl->subtypes->type ==
XML_SCHEMA_TYPE_ALL)
@@ -4055,6 +4173,8 @@
case XML_SCHEMA_FACET_MAXLENGTH:
case XML_SCHEMA_FACET_MINLENGTH:
typeDecl->contentType = XML_SCHEMA_CONTENT_SIMPLE;
+ if (typeDecl->subtypes != NULL)
+ xmlSchemaTypeFixup(typeDecl->subtypes, ctxt, NULL);
break;
}
}
@@ -4608,7 +4728,7 @@
static int
xmlSchemaValidateFacets(xmlSchemaValidCtxtPtr ctxt,
xmlSchemaTypePtr base,
- xmlSchemaFacetPtr facets, xmlChar * value)
+ xmlSchemaFacetPtr facets, const xmlChar * value)
{
int ret = 0;
int tmp = 0;
@@ -4661,7 +4781,7 @@
*/
static int
xmlSchemaValidateSimpleValue(xmlSchemaValidCtxtPtr ctxt,
- xmlSchemaTypePtr type, xmlChar * value)
+ xmlSchemaTypePtr type, const xmlChar * value)
{
int ret = 0;
@@ -4691,8 +4811,9 @@
if (base != NULL) {
ret = xmlSchemaValidateSimpleValue(ctxt, base, value);
} else if (type->subtypes != NULL) {
-
+ TODO
}
+
/*
* Do not validate facets when working on building the Schemas
*/
@@ -4712,7 +4833,8 @@
TODO}
} else if (type->type == XML_SCHEMA_TYPE_LIST) {
xmlSchemaTypePtr base;
- xmlChar *cur, *end, tmp;
+ const xmlChar *cur, *end;
+ xmlChar *tmp;
int ret2;
base = type->subtypes;
@@ -4731,16 +4853,16 @@
end++;
if (end == cur)
break;
- tmp = *end;
- *end = 0;
- ret2 = xmlSchemaValidateSimpleValue(ctxt, base, cur);
+ tmp = xmlStrndup(cur, end - cur);
+ ret2 = xmlSchemaValidateSimpleValue(ctxt, base, tmp);
+ xmlFree(tmp);
if (ret2 != 0)
ret = 1;
- *end = tmp;
cur = end;
} while (*cur != 0);
} else {
- TODO}
+ TODO
+ }
return (ret);
}
@@ -4871,8 +4993,13 @@
}
break;
}
+ case XML_SCHEMA_TYPE_EXTENSION:{
+ TODO
+ break;
+ }
default:
- TODO}
+ TODO
+ }
if (value != NULL)
xmlFree(value);
@@ -5278,7 +5405,8 @@
switch (type->contentType) {
case XML_SCHEMA_CONTENT_EMPTY:
- if (child != NULL) {
+ if (type->baseType != NULL) {
+ } else if (child != NULL) {
xmlSchemaVErr(ctxt, node, XML_SCHEMAS_ERR_NOTEMPTY, "Element %s is supposed to be empty\n", node->name, NULL);
}
if (type->attributes != NULL) {
@@ -5334,6 +5462,22 @@
ctxt->type = type;
break;
}
+ case XML_SCHEMA_CONTENT_SIMPLE:{
+ if (type->subtypes != NULL) {
+ ctxt->type = type->subtypes;
+ xmlSchemaValidateComplexType(ctxt, node);
+ }
+ if (type->baseType != NULL) {
+ ctxt->type = type->baseType;
+ xmlSchemaValidateComplexType(ctxt, node);
+ }
+ if (type->attributes != NULL) {
+ xmlSchemaValidateAttributes(ctxt, node,
+ type->attributes);
+ }
+ ctxt->type = type;
+ break;
+ }
default:
TODO xmlGenericError(xmlGenericErrorContext,
"unimplemented content type %d\n",
@@ -5577,10 +5721,23 @@
if (!xmlStrEqual(attr->name, attributes->name))
continue;
/*
- * TODO: handle the mess about namespaces here.
+ * handle the namespaces checks here
*/
- if ((attr->ns != NULL) /* || (attributes->ns != NULL) */ ) {
- TODO}
+ if (attr->ns == NULL) {
+ /*
+ * accept an unqualified attribute only if the declaration
+ * is unqualified or if the schemas allowed it.
+ */
+ if ((attributes->targetNamespace != NULL) &&
+ ((attributes->flags & XML_SCHEMAS_ATTR_NSDEFAULT) == 0))
+ continue;
+ } else {
+ if (attributes->targetNamespace == NULL)
+ continue;
+ if (!xmlStrEqual(attributes->targetNamespace,
+ attr->ns->href))
+ continue;
+ }
}
ctxt->cur = (xmlNodePtr) attributes;
if (attributes->subtypes == NULL) {
@@ -5620,12 +5777,24 @@
xmlSchemaElementPtr elemDecl;
int ret, attrBase;
- if (elem->ns != NULL)
+ if (elem->ns != NULL) {
elemDecl = xmlHashLookup3(ctxt->schema->elemDecl,
elem->name, elem->ns->href, NULL);
- else
+ } else {
elemDecl = xmlHashLookup3(ctxt->schema->elemDecl,
elem->name, NULL, NULL);
+ }
+ /*
+ * special case whe elementFormDefault is unqualified for top-level elem.
+ */
+ if ((elemDecl == NULL) && (elem->ns != NULL) &&
+ (elem->parent != NULL) && (elem->parent->type != XML_ELEMENT_NODE) &&
+ (xmlStrEqual(ctxt->schema->targetNamespace, elem->ns->href)) &&
+ ((ctxt->schema->flags & XML_SCHEMAS_QUALIF_ELEM) == 0)) {
+ elemDecl = xmlHashLookup3(ctxt->schema->elemDecl,
+ elem->name, NULL, NULL);
+ }
+
/*
* 3.3.4 : 1
*/
@@ -5713,6 +5882,16 @@
else
elemDecl = xmlHashLookup3(ctxt->schema->elemDecl,
root->name, NULL, NULL);
+ /*
+ * special case whe elementFormDefault is unqualified for top-level elem.
+ */
+ if ((elemDecl == NULL) && (root->ns != NULL) &&
+ (xmlStrEqual(ctxt->schema->targetNamespace, root->ns->href)) &&
+ ((ctxt->schema->flags & XML_SCHEMAS_QUALIF_ELEM) == 0)) {
+ elemDecl = xmlHashLookup3(ctxt->schema->elemDecl,
+ root->name, NULL, NULL);
+ }
+
if (elemDecl == NULL) {
xmlSchemaVErr(ctxt, root, XML_SCHEMAS_ERR_UNDECLAREDELEM, "Element %s not declared\n", root->name, NULL);
} else if ((elemDecl->flags & XML_SCHEMAS_ELEM_TOPLEVEL) == 0) {
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index dd859b7..c3901c5 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -261,7 +261,7 @@
return(NULL);
}
memset(ret, 0, sizeof(xmlSchemaType));
- ret->name = xmlStrdup((const xmlChar *)name);
+ ret->name = (const xmlChar *)name;
ret->type = XML_SCHEMA_TYPE_BASIC;
ret->flags = type;
ret->contentType = XML_SCHEMA_CONTENT_BASIC;