50#pragma convert("ISO8859-1")
56#ifdef LIBXML_SCHEMAS_ENABLED
72#ifdef LIBXML_PATTERN_ENABLED
75#ifdef LIBXML_READER_ENABLED
86#define ENABLE_REDEFINE
92#define DUMP_CONTENT_MODEL
94#ifdef LIBXML_READER_ENABLED
98#define UNBOUNDED (1 << 30)
100 xmlGenericError(xmlGenericErrorContext, \
101 "Unimplemented block at %s:%d\n", \
104#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
110 "http://www.w3.org/2001/XMLSchema";
113 "http://www.w3.org/2001/XMLSchema-instance";
116 "http://www.w3.org/2000/xmlns/";
121#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
122#define PCTXT_CAST (xmlSchemaParserCtxtPtr)
123#define VCTXT_CAST (xmlSchemaValidCtxtPtr)
124#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
125#define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
126#define WXS_PTC_CAST (xmlSchemaParticlePtr)
127#define WXS_TYPE_CAST (xmlSchemaTypePtr)
128#define WXS_ELEM_CAST (xmlSchemaElementPtr)
129#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
130#define WXS_ATTR_CAST (xmlSchemaAttributePtr)
131#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
132#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
133#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
134#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
135#define WXS_IDC_CAST (xmlSchemaIDCPtr)
136#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
137#define WXS_LIST_CAST (xmlSchemaItemListPtr)
142#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
144#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
148#define WXS_ELEM_TYPEDEF(e) (e)->subtypes
150#define WXS_SUBST_HEAD(item) (item)->refDecl
154#define WXS_ATTR_TYPEDEF(a) (a)->subtypes
158#define WXS_ATTRUSE_DECL(au) (WXS_ATTR_USE_CAST (au))->attrDecl
160#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
162#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
164#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
168#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
169#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
173#define WXS_PARTICLE(p) WXS_PTC_CAST (p)
175#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
177#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
179#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
183#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
187#define WXS_IS_MODEL_GROUP(i) \
188 (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
189 ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
190 ((i)->type == XML_SCHEMA_TYPE_ALL))
192#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
196#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
197 ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
199#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
200 ((t) == XML_SCHEMA_SCHEMA_IMPORT))
202#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
204#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
208#define WXS_IS_ANYTYPE(i) \
209 (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
210 ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
212#define WXS_IS_COMPLEX(i) \
213 (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
214 ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
216#define WXS_IS_SIMPLE(item) \
217 ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
218 ((item->type == XML_SCHEMA_TYPE_BASIC) && \
219 (item->builtInType != XML_SCHEMAS_ANYTYPE)))
221#define WXS_IS_ANY_SIMPLE_TYPE(i) \
222 (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
223 ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
225#define WXS_IS_RESTRICTION(t) \
226 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
228#define WXS_IS_EXTENSION(t) \
229 ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
231#define WXS_IS_TYPE_NOT_FIXED(i) \
232 (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
233 (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
235#define WXS_IS_TYPE_NOT_FIXED_1(item) \
236 (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
237 (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
239#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
241#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
245#define WXS_HAS_COMPLEX_CONTENT(item) \
246 ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
247 (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
248 (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
250#define WXS_HAS_SIMPLE_CONTENT(item) \
251 ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
252 (item->contentType == XML_SCHEMA_CONTENT_BASIC))
254#define WXS_HAS_MIXED_CONTENT(item) \
255 (item->contentType == XML_SCHEMA_CONTENT_MIXED)
257#define WXS_EMPTIABLE(t) \
258 (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
260#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
262#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
264#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
268#define WXS_LIST_ITEMTYPE(t) (t)->subtypes
270#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
272#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
274#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
278#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
280#define WXS_HAS_BUCKETS(ctx) \
281( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
282(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
284#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
286#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
288#define WXS_SCHEMA(ctx) (ctx)->schema
290#define WXS_ADD_LOCAL(ctx, item) \
292 if (xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item) < 0) { \
298#define WXS_ADD_GLOBAL(ctx, item) \
300 if (xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item) < 0) { \
306#define WXS_ADD_PENDING(ctx, item) \
307 xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
311#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
315#define IS_SCHEMA(node, type) \
316 ((node != NULL) && (node->ns != NULL) && \
317 (xmlStrEqual(node->name, (const xmlChar *) type)) && \
318 (xmlStrEqual(node->ns->href, xmlSchemaNs)))
320#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
327#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
329#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
331#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
333#define HFAILURE if (res == -1) goto exit_failure;
335#define HERROR if (res != 0) goto exit_error;
337#define HSTOP(ctx) if ((ctx)->stop) goto exit;
341#define SUBSET_RESTRICTION 1<<0
342#define SUBSET_EXTENSION 1<<1
343#define SUBSET_SUBSTITUTION 1<<2
344#define SUBSET_LIST 1<<3
345#define SUBSET_UNION 1<<4
347typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
348typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
350typedef struct _xmlSchemaItemList xmlSchemaItemList;
351typedef xmlSchemaItemList *xmlSchemaItemListPtr;
352struct _xmlSchemaItemList {
358#define XML_SCHEMA_CTXT_PARSER 1
359#define XML_SCHEMA_CTXT_VALIDATOR 2
361typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
362typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
363struct _xmlSchemaAbstractCtxt {
368typedef struct _xmlSchemaBucket xmlSchemaBucket;
369typedef xmlSchemaBucket *xmlSchemaBucketPtr;
371#define XML_SCHEMA_SCHEMA_MAIN 0
372#define XML_SCHEMA_SCHEMA_IMPORT 1
373#define XML_SCHEMA_SCHEMA_INCLUDE 2
374#define XML_SCHEMA_SCHEMA_REDEFINE 3
381typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
382typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
383struct _xmlSchemaSchemaRelation {
384 xmlSchemaSchemaRelationPtr
next;
386 const xmlChar *importNamespace;
387 xmlSchemaBucketPtr bucket;
390#define XML_SCHEMA_BUCKET_MARKED 1<<0
391#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
393struct _xmlSchemaBucket {
397 const xmlChar *origTargetNamespace;
398 const xmlChar *targetNamespace;
400 xmlSchemaSchemaRelationPtr relations;
405 xmlSchemaItemListPtr globals;
406 xmlSchemaItemListPtr locals;
417typedef struct _xmlSchemaImport xmlSchemaImport;
418typedef xmlSchemaImport *xmlSchemaImportPtr;
419struct _xmlSchemaImport {
424 const xmlChar *origTargetNamespace;
429 const xmlChar *targetNamespace;
432 xmlSchemaSchemaRelationPtr relations;
437 xmlSchemaItemListPtr globals;
438 xmlSchemaItemListPtr locals;
446typedef struct _xmlSchemaInclude xmlSchemaInclude;
447typedef xmlSchemaInclude *xmlSchemaIncludePtr;
448struct _xmlSchemaInclude {
452 const xmlChar *origTargetNamespace;
453 const xmlChar *targetNamespace;
455 xmlSchemaSchemaRelationPtr relations;
460 xmlSchemaItemListPtr globals;
461 xmlSchemaItemListPtr locals;
464 xmlSchemaImportPtr ownerImport;
472typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
473typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
474struct _xmlSchemaBasicItem {
475 xmlSchemaTypeType
type;
485typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
486typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
487struct _xmlSchemaAnnotItem {
488 xmlSchemaTypeType
type;
489 xmlSchemaAnnotPtr annot;
498typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
499typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
500struct _xmlSchemaTreeItem {
501 xmlSchemaTypeType
type;
502 xmlSchemaAnnotPtr annot;
503 xmlSchemaTreeItemPtr
next;
504 xmlSchemaTreeItemPtr children;
508#define XML_SCHEMA_ATTR_USE_FIXED 1<<0
515typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
516typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
517struct _xmlSchemaAttributeUse {
518 xmlSchemaTypeType
type;
519 xmlSchemaAnnotPtr annot;
520 xmlSchemaAttributeUsePtr
next;
525 xmlSchemaAttributePtr attrDecl;
531 xmlSchemaValPtr defVal;
540typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
541typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
542struct _xmlSchemaAttributeUseProhib {
543 xmlSchemaTypeType
type;
546 const xmlChar *targetNamespace;
553typedef struct _xmlSchemaRedef xmlSchemaRedef;
554typedef xmlSchemaRedef *xmlSchemaRedefPtr;
555struct _xmlSchemaRedef {
556 xmlSchemaRedefPtr
next;
557 xmlSchemaBasicItemPtr
item;
559 xmlSchemaBasicItemPtr
target;
563 xmlSchemaBucketPtr targetBucket;
569typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
570typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
571struct _xmlSchemaConstructionCtxt {
572 xmlSchemaPtr mainSchema;
573 xmlSchemaBucketPtr mainBucket;
577 xmlSchemaBucketPtr bucket;
578 xmlSchemaItemListPtr pending;
581 xmlSchemaRedefPtr redefs;
582 xmlSchemaRedefPtr lastRedef;
585#define XML_SCHEMAS_PARSE_ERROR 1
586#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
588struct _xmlSchemaParserCtxt {
591 xmlSchemaValidityErrorFunc
error;
592 xmlSchemaValidityWarningFunc
warning;
597 xmlSchemaConstructionCtxtPtr constructor;
617 xmlAutomataStatePtr
start;
618 xmlAutomataStatePtr
end;
619 xmlAutomataStatePtr
state;
622 xmlSchemaTypePtr ctxtType;
624 xmlSchemaValidCtxtPtr vctxt;
629 const xmlChar *targetNamespace;
630 xmlSchemaBucketPtr redefined;
632 xmlSchemaRedefPtr redef;
634 xmlSchemaItemListPtr attrProhibs;
643typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
644typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
645struct _xmlSchemaQNameRef {
646 xmlSchemaTypeType
type;
647 xmlSchemaBasicItemPtr
item;
648 xmlSchemaTypeType itemType;
650 const xmlChar *targetNamespace;
660typedef struct _xmlSchemaParticle xmlSchemaParticle;
661typedef xmlSchemaParticle *xmlSchemaParticlePtr;
662struct _xmlSchemaParticle {
663 xmlSchemaTypeType
type;
664 xmlSchemaAnnotPtr annot;
665 xmlSchemaTreeItemPtr
next;
666 xmlSchemaTreeItemPtr children;
680typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
681typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
682struct _xmlSchemaModelGroup {
683 xmlSchemaTypeType
type;
684 xmlSchemaAnnotPtr annot;
685 xmlSchemaTreeItemPtr
next;
686 xmlSchemaTreeItemPtr children;
690#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
691#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
698typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
699typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
700struct _xmlSchemaModelGroupDef {
701 xmlSchemaTypeType
type;
702 xmlSchemaAnnotPtr annot;
703 xmlSchemaTreeItemPtr
next;
704 xmlSchemaTreeItemPtr children;
706 const xmlChar *targetNamespace;
711typedef struct _xmlSchemaIDC xmlSchemaIDC;
712typedef xmlSchemaIDC *xmlSchemaIDCPtr;
720typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
721typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
722struct _xmlSchemaIDCSelect {
723 xmlSchemaIDCSelectPtr
next;
737struct _xmlSchemaIDC {
738 xmlSchemaTypeType
type;
739 xmlSchemaAnnotPtr annot;
740 xmlSchemaIDCPtr
next;
743 const xmlChar *targetNamespace;
744 xmlSchemaIDCSelectPtr selector;
745 xmlSchemaIDCSelectPtr
fields;
747 xmlSchemaQNameRefPtr
ref;
755typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
756typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
757struct _xmlSchemaIDCAug {
758 xmlSchemaIDCAugPtr
next;
769typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
770typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
771struct _xmlSchemaPSVIIDCKey {
772 xmlSchemaTypePtr
type;
781typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
782typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
783struct _xmlSchemaPSVIIDCNode {
785 xmlSchemaPSVIIDCKeyPtr *
keys;
796typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
797typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
798struct _xmlSchemaPSVIIDCBinding {
799 xmlSchemaPSVIIDCBindingPtr
next;
800 xmlSchemaIDCPtr definition;
801 xmlSchemaPSVIIDCNodePtr *nodeTable;
804 xmlSchemaItemListPtr dupls;
808#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
809#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
811#define XPATH_STATE_OBJ_MATCHES -2
812#define XPATH_STATE_OBJ_BLOCKED -3
814typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
815typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
822typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
823typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
824struct _xmlSchemaIDCStateObj {
826 xmlSchemaIDCStateObjPtr
next;
831 xmlSchemaIDCMatcherPtr matcher;
833 xmlSchemaIDCSelectPtr sel;
844struct _xmlSchemaIDCMatcher {
847 xmlSchemaIDCMatcherPtr
next;
848 xmlSchemaIDCMatcherPtr nextCached;
849 xmlSchemaIDCAugPtr aidc;
851 xmlSchemaPSVIIDCKeyPtr **keySeqs;
854 xmlSchemaItemListPtr targets;
862#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0
863#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
864#define XML_SCHEMA_ELEM_INFO_NILLED 1<<2
865#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3
867#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4
868#define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5
869#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6
871#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7
872#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8
873#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9
874#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10
881struct _xmlSchemaNodeInfo {
889 xmlSchemaTypePtr typeDef;
896 xmlSchemaElementPtr decl;
898 xmlSchemaPSVIIDCBindingPtr idcTable;
900 xmlSchemaIDCMatcherPtr idcMatchers;
902 xmlRegExecCtxtPtr regexCtxt;
912#define XML_SCHEMAS_ATTR_UNKNOWN 1
913#define XML_SCHEMAS_ATTR_ASSESSED 2
914#define XML_SCHEMAS_ATTR_PROHIBITED 3
915#define XML_SCHEMAS_ATTR_ERR_MISSING 4
916#define XML_SCHEMAS_ATTR_INVALID_VALUE 5
917#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
918#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
919#define XML_SCHEMAS_ATTR_DEFAULT 8
920#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
921#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
922#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
923#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
924#define XML_SCHEMAS_ATTR_WILD_SKIP 13
925#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
926#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
927#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
928#define XML_SCHEMAS_ATTR_META 17
932#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
933#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
934#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
935#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
936#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
938typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
939typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
940struct _xmlSchemaAttrInfo {
948 xmlSchemaTypePtr typeDef;
951 xmlSchemaAttributePtr decl;
952 xmlSchemaAttributeUsePtr use;
956 xmlSchemaNodeInfoPtr
parent;
960#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
966struct _xmlSchemaValidCtxt {
969 xmlSchemaValidityErrorFunc
error;
970 xmlSchemaValidityWarningFunc
warning;
975 xmlParserInputBufferPtr
input;
977 xmlSAXHandlerPtr sax;
978 xmlParserCtxtPtr parserCtxt;
989 xmlRegExecCtxtPtr regexp;
990 xmlSchemaValPtr
value;
994 xmlNodePtr validationRoot;
995 xmlSchemaParserCtxtPtr pctxt;
999 xmlSchemaNodeInfoPtr *elemInfos;
1001 xmlSchemaNodeInfoPtr
inode;
1003 xmlSchemaIDCAugPtr aidcs;
1005 xmlSchemaIDCStateObjPtr xpathStates;
1006 xmlSchemaIDCStateObjPtr xpathStatePool;
1007 xmlSchemaIDCMatcherPtr idcMatcherCache;
1009 xmlSchemaPSVIIDCNodePtr *idcNodes;
1013 xmlSchemaPSVIIDCKeyPtr *idcKeys;
1021#ifdef LIBXML_READER_ENABLED
1025 xmlSchemaAttrInfoPtr *attrInfos;
1030 xmlSchemaItemListPtr nodeQNames;
1032 int createIDCNodeTables;
1033 int psviExposeIDCNodeTables;
1036 xmlSchemaValidityLocatorFunc locFunc;
1045typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
1046typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
1047struct _xmlSchemaSubstGroup {
1048 xmlSchemaElementPtr
head;
1049 xmlSchemaItemListPtr members;
1057typedef struct _xmlIDCHashEntry xmlIDCHashEntry;
1058typedef xmlIDCHashEntry *xmlIDCHashEntryPtr;
1059struct _xmlIDCHashEntry {
1060 xmlIDCHashEntryPtr
next;
1070static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
1073static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
1077xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
1078 xmlSchemaAbstractCtxtPtr ctxt);
1080xmlSchemaFacetTypeToString(xmlSchemaTypeType
type);
1082xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1085xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
1086 xmlSchemaParserCtxtPtr ctxt);
1088xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
1089static xmlSchemaWhitespaceValueType
1090xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type);
1091static xmlSchemaTreeItemPtr
1092xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
1093 xmlNodePtr
node, xmlSchemaTypeType
type,
1096xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item);
1097static xmlSchemaTypeLinkPtr
1098xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type);
1100xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
1101 const char *funcName,
1104xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
1105 xmlSchemaTypePtr
type,
1106 xmlSchemaTypePtr baseType,
1109xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
1110 xmlSchemaParserCtxtPtr ctxt);
1112xmlSchemaComponentListFree(xmlSchemaItemListPtr
list);
1113static xmlSchemaQNameRefPtr
1114xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
1131xmlSchemaItemTypeToStr(xmlSchemaTypeType
type)
1134 case XML_SCHEMA_TYPE_BASIC:
1135 return(
BAD_CAST "simple type definition");
1136 case XML_SCHEMA_TYPE_SIMPLE:
1137 return(
BAD_CAST "simple type definition");
1138 case XML_SCHEMA_TYPE_COMPLEX:
1139 return(
BAD_CAST "complex type definition");
1140 case XML_SCHEMA_TYPE_ELEMENT:
1141 return(
BAD_CAST "element declaration");
1142 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1144 case XML_SCHEMA_TYPE_ATTRIBUTE:
1145 return(
BAD_CAST "attribute declaration");
1146 case XML_SCHEMA_TYPE_GROUP:
1147 return(
BAD_CAST "model group definition");
1148 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1149 return(
BAD_CAST "attribute group definition");
1150 case XML_SCHEMA_TYPE_NOTATION:
1151 return(
BAD_CAST "notation declaration");
1152 case XML_SCHEMA_TYPE_SEQUENCE:
1153 return(
BAD_CAST "model group (sequence)");
1154 case XML_SCHEMA_TYPE_CHOICE:
1155 return(
BAD_CAST "model group (choice)");
1156 case XML_SCHEMA_TYPE_ALL:
1157 return(
BAD_CAST "model group (all)");
1158 case XML_SCHEMA_TYPE_PARTICLE:
1160 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1161 return(
BAD_CAST "unique identity-constraint");
1163 case XML_SCHEMA_TYPE_IDC_KEY:
1164 return(
BAD_CAST "key identity-constraint");
1166 case XML_SCHEMA_TYPE_IDC_KEYREF:
1167 return(
BAD_CAST "keyref identity-constraint");
1169 case XML_SCHEMA_TYPE_ANY:
1171 case XML_SCHEMA_EXTRA_QNAMEREF:
1172 return(
BAD_CAST "[helper component] QName reference");
1173 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
1174 return(
BAD_CAST "[helper component] attribute use prohibition");
1176 return(
BAD_CAST "Not a schema component");
1187xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr
item)
1190 case XML_SCHEMA_TYPE_BASIC:
1191 if (WXS_IS_COMPLEX(WXS_TYPE_CAST
item))
1192 return(
BAD_CAST "complex type definition");
1194 return(
BAD_CAST "simple type definition");
1196 return(xmlSchemaItemTypeToStr(
item->
type));
1211xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr
item)
1214 case XML_SCHEMA_TYPE_ELEMENT:
1215 return (((xmlSchemaElementPtr)
item)->
node);
1216 case XML_SCHEMA_TYPE_ATTRIBUTE:
1217 return (((xmlSchemaAttributePtr)
item)->
node);
1218 case XML_SCHEMA_TYPE_COMPLEX:
1219 case XML_SCHEMA_TYPE_SIMPLE:
1220 return (((xmlSchemaTypePtr)
item)->
node);
1221 case XML_SCHEMA_TYPE_ANY:
1222 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1223 return (((xmlSchemaWildcardPtr)
item)->
node);
1224 case XML_SCHEMA_TYPE_PARTICLE:
1225 return (((xmlSchemaParticlePtr)
item)->
node);
1226 case XML_SCHEMA_TYPE_SEQUENCE:
1227 case XML_SCHEMA_TYPE_CHOICE:
1228 case XML_SCHEMA_TYPE_ALL:
1229 return (((xmlSchemaModelGroupPtr)
item)->
node);
1230 case XML_SCHEMA_TYPE_GROUP:
1231 return (((xmlSchemaModelGroupDefPtr)
item)->
node);
1232 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1233 return (((xmlSchemaAttributeGroupPtr)
item)->
node);
1234 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1235 case XML_SCHEMA_TYPE_IDC_KEY:
1236 case XML_SCHEMA_TYPE_IDC_KEYREF:
1237 return (((xmlSchemaIDCPtr)
item)->
node);
1238 case XML_SCHEMA_EXTRA_QNAMEREF:
1239 return(((xmlSchemaQNameRefPtr)
item)->
node);
1244 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1245 return (((xmlSchemaAttributeUsePtr)
item)->
node);
1258static xmlSchemaBasicItemPtr
1259xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr
item)
1262 case XML_SCHEMA_TYPE_ELEMENT:
1263 return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr)
item)->
next);
1264 case XML_SCHEMA_TYPE_ATTRIBUTE:
1265 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr)
item)->
next);
1266 case XML_SCHEMA_TYPE_COMPLEX:
1267 case XML_SCHEMA_TYPE_SIMPLE:
1268 return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr)
item)->
next);
1269 case XML_SCHEMA_TYPE_ANY:
1270 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1272 case XML_SCHEMA_TYPE_PARTICLE:
1273 return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr)
item)->
next);
1274 case XML_SCHEMA_TYPE_SEQUENCE:
1275 case XML_SCHEMA_TYPE_CHOICE:
1276 case XML_SCHEMA_TYPE_ALL:
1278 case XML_SCHEMA_TYPE_GROUP:
1280 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1281 return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr)
item)->
next);
1282 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1283 case XML_SCHEMA_TYPE_IDC_KEY:
1284 case XML_SCHEMA_TYPE_IDC_KEYREF:
1285 return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr)
item)->
next);
1311 if (namespaceName !=
NULL) {
1316 if (localName !=
NULL) {
1317 if (namespaceName ==
NULL)
1330 return (xmlSchemaFormatQName(
buf,
ns->href, localName));
1332 return (xmlSchemaFormatQName(
buf,
NULL, localName));
1336xmlSchemaGetComponentName(xmlSchemaBasicItemPtr
item)
1342 case XML_SCHEMA_TYPE_ELEMENT:
1343 return (((xmlSchemaElementPtr)
item)->
name);
1344 case XML_SCHEMA_TYPE_ATTRIBUTE:
1345 return (((xmlSchemaAttributePtr)
item)->
name);
1346 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1347 return (((xmlSchemaAttributeGroupPtr)
item)->
name);
1348 case XML_SCHEMA_TYPE_BASIC:
1349 case XML_SCHEMA_TYPE_SIMPLE:
1350 case XML_SCHEMA_TYPE_COMPLEX:
1351 return (((xmlSchemaTypePtr)
item)->
name);
1352 case XML_SCHEMA_TYPE_GROUP:
1353 return (((xmlSchemaModelGroupDefPtr)
item)->
name);
1354 case XML_SCHEMA_TYPE_IDC_KEY:
1355 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1356 case XML_SCHEMA_TYPE_IDC_KEYREF:
1357 return (((xmlSchemaIDCPtr)
item)->
name);
1358 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1359 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1360 return(xmlSchemaGetComponentName(
1361 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1364 case XML_SCHEMA_EXTRA_QNAMEREF:
1365 return (((xmlSchemaQNameRefPtr)
item)->
name);
1366 case XML_SCHEMA_TYPE_NOTATION:
1367 return (((xmlSchemaNotationPtr)
item)->
name);
1377#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
1378#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
1394xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr
item)
1400 case XML_SCHEMA_TYPE_ELEMENT:
1401 return (((xmlSchemaElementPtr)
item)->targetNamespace);
1402 case XML_SCHEMA_TYPE_ATTRIBUTE:
1403 return (((xmlSchemaAttributePtr)
item)->targetNamespace);
1404 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1405 return (((xmlSchemaAttributeGroupPtr)
item)->targetNamespace);
1406 case XML_SCHEMA_TYPE_BASIC:
1407 return (
BAD_CAST "http://www.w3.org/2001/XMLSchema");
1408 case XML_SCHEMA_TYPE_SIMPLE:
1409 case XML_SCHEMA_TYPE_COMPLEX:
1410 return (((xmlSchemaTypePtr)
item)->targetNamespace);
1411 case XML_SCHEMA_TYPE_GROUP:
1412 return (((xmlSchemaModelGroupDefPtr)
item)->targetNamespace);
1413 case XML_SCHEMA_TYPE_IDC_KEY:
1414 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1415 case XML_SCHEMA_TYPE_IDC_KEYREF:
1416 return (((xmlSchemaIDCPtr)
item)->targetNamespace);
1417 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1418 if (WXS_ATTRUSE_DECL(
item) !=
NULL) {
1419 return(xmlSchemaGetComponentTargetNs(
1420 WXS_BASIC_CAST WXS_ATTRUSE_DECL(
item)));
1424 case XML_SCHEMA_EXTRA_QNAMEREF:
1425 return (((xmlSchemaQNameRefPtr)
item)->targetNamespace);
1426 case XML_SCHEMA_TYPE_NOTATION:
1427 return (((xmlSchemaNotationPtr)
item)->targetNamespace);
1441 return (xmlSchemaFormatQName(
buf,
1442 xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr)
item),
1443 xmlSchemaGetComponentName((xmlSchemaBasicItemPtr)
item)));
1454 (xmlSchemaBasicItemPtr)
item));
1461xmlSchemaGetIDCDesignation(
xmlChar **
buf, xmlSchemaIDCPtr idc)
1463 return(xmlSchemaGetComponentDesignation(
buf, idc));
1474xmlSchemaWildcardPCToString(
int pc)
1477 case XML_SCHEMAS_ANY_SKIP:
1479 case XML_SCHEMAS_ANY_LAX:
1481 case XML_SCHEMAS_ANY_STRICT:
1484 return (
BAD_CAST "invalid process contents");
1502xmlSchemaGetCanonValueWhtspExt_1(xmlSchemaValPtr
val,
1503 xmlSchemaWhitespaceValueType ws,
1508 xmlSchemaValType valType;
1514 list = xmlSchemaValueGetNext(
val) ? 1 : 0;
1518 valType = xmlSchemaGetValType(
val);
1520 case XML_SCHEMAS_STRING:
1521 case XML_SCHEMAS_NORMSTRING:
1522 case XML_SCHEMAS_ANYSIMPLETYPE:
1523 value = xmlSchemaValueGetAsString(
val);
1525 if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
1526 value2 = xmlSchemaCollapseString(
value);
1527 else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
1528 value2 = xmlSchemaWhiteSpaceReplace(
value);
1534 if (xmlSchemaGetCanonValue(
val, &value2) == -1) {
1537 goto internal_error;
1539 if (for_hash && valType == XML_SCHEMAS_DECIMAL) {
1550 if (
len > 2 && value2[
len-1] ==
'0' && value2[
len-2] ==
'.')
1555 if (*retValue ==
NULL)
1566 FREE_AND_NULL(value2)
1567 val = xmlSchemaValueGetNext(
val);
1572 if (*retValue !=
NULL)
1580xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr
val,
1581 xmlSchemaWhitespaceValueType ws,
1584 return xmlSchemaGetCanonValueWhtspExt_1(
val, ws, retValue, 0);
1588xmlSchemaGetCanonValueHash(xmlSchemaValPtr
val,
1591 return xmlSchemaGetCanonValueWhtspExt_1(
val, XML_SCHEMA_WHITESPACE_COLLAPSE,
1624 xmlSchemaBasicItemPtr
item,
1625 xmlNodePtr itemNode)
1635 if (itemDes !=
NULL) {
1639 case XML_SCHEMA_TYPE_BASIC: {
1640 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1642 if (WXS_IS_ATOMIC(
type))
1644 else if (WXS_IS_LIST(
type))
1646 else if (WXS_IS_UNION(
type))
1654 case XML_SCHEMA_TYPE_SIMPLE: {
1655 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1657 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1662 if (WXS_IS_ATOMIC(
type))
1664 else if (WXS_IS_LIST(
type))
1666 else if (WXS_IS_UNION(
type))
1670 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1677 case XML_SCHEMA_TYPE_COMPLEX: {
1678 xmlSchemaTypePtr
type = WXS_TYPE_CAST
item;
1680 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL)
1685 if (
type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1692 case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
1693 xmlSchemaAttributeUsePtr ause;
1695 ause = WXS_ATTR_USE_CAST
item;
1697 if (WXS_ATTRUSE_DECL(ause) !=
NULL) {
1700 xmlSchemaGetComponentQName(&
str, WXS_ATTRUSE_DECL(ause)));
1708 case XML_SCHEMA_TYPE_ATTRIBUTE: {
1709 xmlSchemaAttributePtr
attr;
1711 attr = (xmlSchemaAttributePtr)
item;
1720 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1721 xmlSchemaGetComponentDesignation(
buf,
item);
1723 case XML_SCHEMA_TYPE_ELEMENT: {
1724 xmlSchemaElementPtr
elem;
1730 elem->targetNamespace,
elem->name));
1734 case XML_SCHEMA_TYPE_IDC_UNIQUE:
1735 case XML_SCHEMA_TYPE_IDC_KEY:
1736 case XML_SCHEMA_TYPE_IDC_KEYREF:
1737 if (
item->
type == XML_SCHEMA_TYPE_IDC_UNIQUE)
1739 else if (
item->
type == XML_SCHEMA_TYPE_IDC_KEY)
1746 case XML_SCHEMA_TYPE_ANY:
1747 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1749 ((xmlSchemaWildcardPtr)
item)->processContents));
1752 case XML_SCHEMA_FACET_MININCLUSIVE:
1753 case XML_SCHEMA_FACET_MINEXCLUSIVE:
1754 case XML_SCHEMA_FACET_MAXINCLUSIVE:
1755 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
1756 case XML_SCHEMA_FACET_TOTALDIGITS:
1757 case XML_SCHEMA_FACET_FRACTIONDIGITS:
1758 case XML_SCHEMA_FACET_PATTERN:
1759 case XML_SCHEMA_FACET_ENUMERATION:
1760 case XML_SCHEMA_FACET_WHITESPACE:
1761 case XML_SCHEMA_FACET_LENGTH:
1762 case XML_SCHEMA_FACET_MAXLENGTH:
1763 case XML_SCHEMA_FACET_MINLENGTH:
1768 case XML_SCHEMA_TYPE_GROUP: {
1776 case XML_SCHEMA_TYPE_SEQUENCE:
1777 case XML_SCHEMA_TYPE_CHOICE:
1778 case XML_SCHEMA_TYPE_ALL:
1779 case XML_SCHEMA_TYPE_PARTICLE:
1782 case XML_SCHEMA_TYPE_NOTATION: {
1796 if ((named == 0) && (itemNode !=
NULL)) {
1799 if (itemNode->type == XML_ATTRIBUTE_NODE)
1800 elem = itemNode->parent;
1806 xmlSchemaFormatQName(&
str,
elem->ns->href,
elem->name));
1813 if ((itemNode !=
NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
1815 if (itemNode->ns !=
NULL) {
1817 itemNode->ns->href, itemNode->name));
1838xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
1841 xmlSchemaFacetPtr facet;
1842 xmlSchemaWhitespaceValueType
ws;
1854 ws = xmlSchemaGetWhiteSpaceFacetValue(
type->baseType);
1855 for (facet =
type->facets; facet !=
NULL; facet = facet->
next) {
1856 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
1859 res = xmlSchemaGetCanonValueWhtspExt(facet->val,
1862 xmlSchemaInternalErr(actxt,
1863 "xmlSchemaFormatFacetEnumSet",
1864 "compute the canonical lexical representation");
1890 }
while ((
type !=
NULL) && (
type->type != XML_SCHEMA_TYPE_BASIC));
1903xmlSchemaErrMemory(
const char *
msg)
1911xmlSchemaPSimpleErr(
const char *
msg)
1925xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
1946xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int error,
1956 channel = ctxt->error;
1957 data = ctxt->errCtxt;
1958 schannel = ctxt->serror;
1979xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
2008xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int error,
2022 channel = ctxt->error;
2023 data = ctxt->errCtxt;
2024 schannel = ctxt->serror;
2028 (
const char *) strData1, (
const char *) strData2,
2047xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
2059xmlSchemaPSimpleInternalErr(xmlNodePtr
node,
2063 msg, (
const char *)
str);
2066#define WXS_ERROR_TYPE_ERROR 1
2067#define WXS_ERROR_TYPE_WARNING 2
2084xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
2095 if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2096 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
2102 channel = vctxt->error;
2104 channel = vctxt->warning;
2106 schannel = vctxt->serror;
2107 data = vctxt->errCtxt;
2115 (vctxt->depth >= 0) &&
2116 (vctxt->inode !=
NULL)) {
2117 node = vctxt->inode->node;
2123 (vctxt->parserCtxt !=
NULL) &&
2124 (vctxt->parserCtxt->input !=
NULL)) {
2125 file = vctxt->parserCtxt->input->filename;
2126 if (vctxt->inode !=
NULL) {
2127 line = vctxt->inode->nodeLine;
2131 line = vctxt->parserCtxt->input->line;
2132 col = vctxt->parserCtxt->input->col;
2144 if (vctxt->doc !=
NULL)
2145 file = (
const char *) vctxt->doc->URL;
2146 else if ((vctxt->parserCtxt !=
NULL) &&
2147 (vctxt->parserCtxt->input !=
NULL))
2148 file = vctxt->parserCtxt->input->filename;
2150 if (vctxt->locFunc !=
NULL) {
2154 vctxt->locFunc(vctxt->locCtxt, &
f, &
l);
2162 file = vctxt->filename;
2167 (
const char *)
str1, (
const char *)
str2,
2168 (
const char *) str3, 0, col,
msg,
str1,
str2, str3, str4);
2170 }
else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
2171 xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
2175 channel = pctxt->error;
2177 channel = pctxt->warning;
2179 schannel = pctxt->serror;
2180 data = pctxt->errCtxt;
2183 errorLevel,
NULL, 0,
2184 (
const char *)
str1, (
const char *)
str2,
2185 (
const char *) str3, 0, 0,
msg,
str1,
str2, str3, str4);
2205xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
2214xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
2224xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
2233 xmlSchemaAbstractCtxtPtr actxt,
2240 (
node->type != XML_ELEMENT_NODE) &&
2241 (
node->type != XML_ATTRIBUTE_NODE))
2255 if (
node->type == XML_ATTRIBUTE_NODE) {
2279 }
else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2280 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
2284 if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
2285 xmlSchemaNodeInfoPtr ielem =
2286 vctxt->elemInfos[vctxt->depth];
2290 ielem->nsName, ielem->localName));
2298 vctxt->inode->nsName, vctxt->inode->localName));
2301 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
2335xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
2336 const char *funcName,
2349 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
2352 else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
2360xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
2361 const char *funcName,
2369xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
2370 const char *funcName,
2375 xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName,
message,
2381xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
2384 xmlSchemaBasicItemPtr
item,
2392 (actxt->type == XML_SCHEMA_CTXT_PARSER)) {
2397 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2406xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
2409 xmlSchemaBasicItemPtr
item,
2421xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
2432 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2446xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
2448 xmlSchemaPSVIIDCNodePtr idcNode,
2461 xmlSchemaFormatQName(&qname,
2462 vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
2463 vctxt->nodeQNames->items[idcNode->nodeQNameID]),
2465 FREE_AND_NULL(qname);
2470xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
2474 return (
node->type);
2475 if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
2476 (((xmlSchemaValidCtxtPtr) actxt)->inode !=
NULL))
2477 return ( ((xmlSchemaValidCtxtPtr) actxt)->
inode->nodeType);
2482xmlSchemaIsGlobalItem(xmlSchemaTypePtr
item)
2485 case XML_SCHEMA_TYPE_COMPLEX:
2486 case XML_SCHEMA_TYPE_SIMPLE:
2487 if (
item->flags & XML_SCHEMAS_TYPE_GLOBAL)
2490 case XML_SCHEMA_TYPE_GROUP:
2492 case XML_SCHEMA_TYPE_ELEMENT:
2493 if ( ((xmlSchemaElementPtr)
item)->
flags &
2494 XML_SCHEMAS_ELEM_GLOBAL)
2497 case XML_SCHEMA_TYPE_ATTRIBUTE:
2498 if ( ((xmlSchemaAttributePtr)
item)->
flags &
2499 XML_SCHEMAS_ATTR_GLOBAL)
2510xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2514 xmlSchemaTypePtr
type,
2519 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2521 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2522 XML_ATTRIBUTE_NODE))
2528 if (! xmlSchemaIsGlobalItem(
type))
2533 if (WXS_IS_ATOMIC(
type))
2535 else if (WXS_IS_LIST(
type))
2537 else if (WXS_IS_UNION(
type))
2540 if (xmlSchemaIsGlobalItem(
type)) {
2543 if (
type->builtInType != 0) {
2547 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
2556 if (displayValue || (xmlSchemaEvalErrorNodeType(actxt,
node) ==
2557 XML_ATTRIBUTE_NODE))
2566 xmlSchemaNodeInfoPtr
ni,
2571 return (xmlSchemaFormatQName(
str,
node->ns->href,
node->name));
2573 return (xmlSchemaFormatQName(
str,
NULL,
node->name));
2575 return (xmlSchemaFormatQName(
str,
ni->nsName,
ni->localName));
2580xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
2582 xmlSchemaAttrInfoPtr
ni,
2587 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2590 xmlSchemaFormatErrorNodeQName(&
str, (xmlSchemaNodeInfoPtr)
ni,
node),
2597xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2611 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2619 if (nbval + nbneg > 0) {
2620 if (nbval + nbneg > 1) {
2626 for (
i = 0;
i < nbval + nbneg;
i++) {
2630 if ((
cur[0] ==
'n') && (
cur[1] ==
'o') && (
cur[2] ==
't') &&
2645 while ((*
end != 0) && (*
end !=
'|'))
2655 if ((nbneg == 0) || (*
end !=
'*') || (*localName !=
'*')) {
2675 FREE_AND_NULL(nsName)
2677 FREE_AND_NULL(localName);
2682 FREE_AND_NULL(localName);
2684 if (
i < nbval + nbneg -1)
2697xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
2702 xmlSchemaTypePtr
type,
2703 xmlSchemaFacetPtr facet,
2709 xmlSchemaTypeType facetType;
2710 int nodeType = xmlSchemaEvalErrorNodeType(actxt,
node);
2712 xmlSchemaFormatNodeForError(&
msg, actxt,
node);
2714 facetType = XML_SCHEMA_FACET_ENUMERATION;
2720 facetType = facet->type;
2729 if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
2730 (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
2731 (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
2733 char len[25], actLen[25];
2738 if (nodeType == XML_ATTRIBUTE_NODE)
2743 snprintf(
len, 24,
"%lu", xmlSchemaGetFacetValueAsULong(facet));
2746 if (facetType == XML_SCHEMA_FACET_LENGTH)
2748 BAD_CAST "this differs from the allowed length of '%s'.\n");
2749 else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
2751 BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
2752 else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
2754 BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
2756 if (nodeType == XML_ATTRIBUTE_NODE)
2763 }
else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
2765 "of the set {%s}.\n");
2767 xmlSchemaFormatFacetEnumSet(actxt, &
str,
type));
2768 }
else if (facetType == XML_SCHEMA_FACET_PATTERN) {
2770 "by the pattern '%s'.\n");
2773 }
else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
2775 "minimum value allowed ('%s').\n");
2778 }
else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
2780 "maximum value allowed ('%s').\n");
2783 }
else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
2788 }
else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
2793 }
else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
2795 "digits than are allowed ('%s').\n");
2798 }
else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
2800 "digits than are allowed ('%s').\n");
2803 }
else if (nodeType == XML_ATTRIBUTE_NODE) {
2819#define VERROR(err, type, msg) \
2820 xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
2822#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
2824#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
2825#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
2827#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
2841xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
2843 xmlSchemaBasicItemPtr ownerItem,
2844 xmlNodePtr ownerElem,
2850 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2855 xmlSchemaPErr(ctxt, ownerElem,
error,
2856 "%s: The attribute '%s' is required but missing.\n",
2877xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
2879 xmlSchemaBasicItemPtr ownerItem,
2880 xmlNodePtr ownerElem,
2884 xmlSchemaTypeType refType,
2885 const char *refTypeStr)
2889 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
2890 if (refTypeStr ==
NULL)
2891 refTypeStr = (
const char *) xmlSchemaItemTypeToStr(refType);
2892 xmlSchemaPErrExt(ctxt, ownerElem,
error,
2894 "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
2896 xmlSchemaFormatQName(&
strA, refURI, refName),
2913xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
2916 xmlSchemaBasicItemPtr ownerItem,
2922 if (ownerDes ==
NULL)
2923 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem,
attr->parent);
2924 else if (*ownerDes ==
NULL) {
2925 xmlSchemaFormatItemForReport(ownerDes,
NULL, ownerItem,
attr->parent);
2931 "%s, attribute '%s': %s.\n",
2936 "%s, attribute '%s': %s.\n",
2939 if (ownerDes ==
NULL)
2953xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
2960 xmlSchemaFormatNodeForError(&
strA, ACTXT_CAST ctxt,
attr->parent);
2961 xmlSchemaErr4(ACTXT_CAST ctxt,
error, (xmlNodePtr)
attr,
2962 "%sThe attribute '%s' is not allowed.\n",
BAD_CAST strA,
2965 FREE_AND_NULL(
strA);
2966 FREE_AND_NULL(strB);
2984xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
2986 xmlSchemaBasicItemPtr
item,
2987 xmlNodePtr itemElem,
2995 xmlSchemaFormatItemForReport(&
des,
NULL,
item, itemElem);
3000 itemElem = WXS_ITEM_NODE(
item);
3020xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
3022 xmlSchemaBasicItemPtr
item,
3023 xmlNodePtr itemElem,
3045xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
3048 xmlSchemaBasicItemPtr ownerItem,
3049 const xmlSchemaAttributeUsePtr attruse,
3056 xmlSchemaFormatItemForReport(&
msg,
NULL, ownerItem,
NULL);
3060 WXS_BASIC_CAST attruse,
NULL));
3065 xmlSchemaErr4(ACTXT_CAST ctxt,
error,
node,
3081xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
3083 xmlSchemaTypePtr
type,
3084 xmlSchemaTypePtr baseType,
3085 xmlSchemaFacetPtr facet)
3089 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
type->node);
3091 "%s: The facet '%s' is not allowed on types derived from the "
3093 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
3094 xmlSchemaFormatItemForReport(&strT,
NULL, WXS_BASIC_CAST baseType,
NULL),
3097 FREE_AND_NULL(strT);
3111xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
3113 xmlSchemaTypePtr
type,
3114 xmlSchemaFacetPtr facet)
3118 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST
type,
3121 "%s: The facet '%s' is not allowed.\n",
3122 BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
3137xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
3139 xmlSchemaBasicItemPtr ownerItem,
3146 xmlSchemaFormatItemForReport(&
des,
NULL, WXS_BASIC_CAST ownerItem,
attr->parent);
3148 "%s: The attributes '%s' and '%s' are mutually exclusive.\n",
3166xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
3170 xmlSchemaTypePtr
type,
3179 xmlSchemaFormatNodeForError(&
msg, ACTXT_CAST ctxt,
node);
3185 if (
node->type == XML_ATTRIBUTE_NODE)
3190 if (! xmlSchemaIsGlobalItem(
type))
3195 if (WXS_IS_ATOMIC(
type))
3197 else if (WXS_IS_LIST(
type))
3199 else if (WXS_IS_UNION(
type))
3202 if (xmlSchemaIsGlobalItem(
type)) {
3205 if (
type->builtInType != 0) {
3209 const xmlChar *qName = xmlSchemaFormatQName(&
str,
type->targetNamespace,
type->name);
3218 if (
node->type == XML_ATTRIBUTE_NODE)
3228 FREE_AND_NULL(expectedEscaped);
3232 if (
node->type == XML_ATTRIBUTE_NODE)
3259xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
3261 xmlSchemaBasicItemPtr ownerItem,
3262 xmlNodePtr ownerElem,
3269 xmlSchemaFormatItemForReport(&
des,
NULL, ownerItem, ownerElem);
3271 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3276 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3277 "%s: The content is not valid. Expected is %s.\n",
3280 xmlSchemaPErr2(ctxt, ownerElem,
child,
error,
3281 "%s: The content is not valid.\n",
3319xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
3325 xmlSchemaPErrMemory(ctxt,
"allocating schema",
NULL);
3329 ret->dict = ctxt->dict;
3343xmlSchemaNewFacet(
void)
3345 xmlSchemaFacetPtr
ret;
3347 ret = (xmlSchemaFacetPtr)
xmlMalloc(
sizeof(xmlSchemaFacet));
3365static xmlSchemaAnnotPtr
3366xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node)
3368 xmlSchemaAnnotPtr
ret;
3370 ret = (xmlSchemaAnnotPtr)
xmlMalloc(
sizeof(xmlSchemaAnnot));
3372 xmlSchemaPErrMemory(ctxt,
"allocating annotation",
node);
3380static xmlSchemaItemListPtr
3381xmlSchemaItemListCreate(
void)
3383 xmlSchemaItemListPtr
ret;
3387 xmlSchemaPErrMemory(
NULL,
3388 "allocating an item list structure",
NULL);
3391 memset(
ret, 0,
sizeof(xmlSchemaItemList));
3396xmlSchemaItemListClear(xmlSchemaItemListPtr
list)
3403 list->sizeItems = 0;
3407xmlSchemaItemListAdd(xmlSchemaItemListPtr
list,
void *
item)
3409 if (
list->sizeItems <=
list->nbItems) {
3411 size_t newSize =
list->sizeItems == 0 ? 20 :
list->sizeItems * 2;
3413 tmp = (
void **)
xmlRealloc(
list->items, newSize *
sizeof(
void *));
3415 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3419 list->sizeItems = newSize;
3426xmlSchemaItemListAddSize(xmlSchemaItemListPtr
list,
3431 if (initialSize <= 0)
3434 initialSize *
sizeof(
void *));
3436 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3439 list->sizeItems = initialSize;
3440 }
else if (
list->sizeItems <=
list->nbItems) {
3443 list->sizeItems *= 2;
3445 list->sizeItems *
sizeof(
void *));
3447 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3448 list->sizeItems /= 2;
3458xmlSchemaItemListInsert(xmlSchemaItemListPtr
list,
void *
item,
int idx)
3460 if (
list->sizeItems <=
list->nbItems) {
3462 size_t newSize =
list->sizeItems == 0 ? 20 :
list->sizeItems * 2;
3464 tmp = (
void **)
xmlRealloc(
list->items, newSize *
sizeof(
void *));
3466 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3470 list->sizeItems = newSize;
3489xmlSchemaItemListInsertSize(xmlSchemaItemListPtr
list,
3495 if (initialSize <= 0)
3498 initialSize *
sizeof(
void *));
3500 xmlSchemaPErrMemory(
NULL,
"allocating new item list",
NULL);
3503 list->sizeItems = initialSize;
3504 }
else if (
list->sizeItems <=
list->nbItems) {
3505 list->sizeItems *= 2;
3507 list->sizeItems *
sizeof(
void *));
3509 xmlSchemaPErrMemory(
NULL,
"growing item list",
NULL);
3510 list->sizeItems = 0;
3531xmlSchemaItemListRemove(xmlSchemaItemListPtr
list,
int idx)
3535 xmlSchemaPSimpleErr(
"Internal error: xmlSchemaItemListRemove, "
3540 if (
list->nbItems == 1) {
3545 list->sizeItems = 0;
3546 }
else if (
list->nbItems -1 ==
idx) {
3563xmlSchemaItemListFree(xmlSchemaItemListPtr
list)
3573xmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
3577 if (bucket->globals !=
NULL) {
3578 xmlSchemaComponentListFree(bucket->globals);
3579 xmlSchemaItemListFree(bucket->globals);
3581 if (bucket->locals !=
NULL) {
3582 xmlSchemaComponentListFree(bucket->locals);
3583 xmlSchemaItemListFree(bucket->locals);
3585 if (bucket->relations !=
NULL) {
3586 xmlSchemaSchemaRelationPtr prev,
cur = bucket->relations;
3593 if ((! bucket->preserveDoc) && (bucket->doc !=
NULL)) {
3594 xmlFreeDoc(bucket->doc);
3596 if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
3598 xmlSchemaFree(WXS_IMPBUCKET(bucket)->
schema);
3606 xmlSchemaBucketFree((xmlSchemaBucketPtr) bucket);
3609static xmlSchemaBucketPtr
3610xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
3613 xmlSchemaBucketPtr
ret;
3615 xmlSchemaPtr mainSchema;
3617 if (WXS_CONSTRUCTOR(pctxt)->mainSchema ==
NULL) {
3618 PERROR_INT(
"xmlSchemaBucketCreate",
3619 "no main schema on constructor");
3622 mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
3624 if (WXS_IS_BUCKET_INCREDEF(
type))
3625 size =
sizeof(xmlSchemaInclude);
3627 size =
sizeof(xmlSchemaImport);
3630 xmlSchemaPErrMemory(
NULL,
"allocating schema bucket",
NULL);
3634 ret->targetNamespace = targetNamespace;
3636 ret->globals = xmlSchemaItemListCreate();
3638 xmlSchemaBucketFree(
ret);
3641 ret->locals = xmlSchemaItemListCreate();
3643 xmlSchemaBucketFree(
ret);
3653 if (! WXS_HAS_BUCKETS(pctxt)) {
3654 if (WXS_IS_BUCKET_INCREDEF(
type)) {
3655 PERROR_INT(
"xmlSchemaBucketCreate",
3656 "first bucket but it's an include or redefine");
3657 xmlSchemaBucketFree(
ret);
3661 ret->type = XML_SCHEMA_SCHEMA_MAIN;
3663 WXS_CONSTRUCTOR(pctxt)->mainBucket =
ret;
3664 WXS_IMPBUCKET(
ret)->schema = mainSchema;
3668 mainSchema->targetNamespace = targetNamespace;
3670 if (
type == XML_SCHEMA_SCHEMA_MAIN) {
3671 PERROR_INT(
"xmlSchemaBucketCreate",
3672 "main bucket but it's not the first one");
3673 xmlSchemaBucketFree(
ret);
3675 }
else if (
type == XML_SCHEMA_SCHEMA_IMPORT) {
3680 WXS_IMPBUCKET(
ret)->schema = xmlSchemaNewSchema(pctxt);
3682 xmlSchemaBucketFree(
ret);
3685 WXS_IMPBUCKET(
ret)->schema->targetNamespace = targetNamespace;
3688 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
3695 if (mainSchema->schemasImports ==
NULL) {
3697 WXS_CONSTRUCTOR(pctxt)->dict);
3698 if (mainSchema->schemasImports ==
NULL) {
3699 xmlSchemaBucketFree(
ret);
3703 if (targetNamespace ==
NULL)
3705 XML_SCHEMAS_NO_NAMESPACE,
ret);
3708 targetNamespace,
ret);
3710 PERROR_INT(
"xmlSchemaBucketCreate",
3711 "failed to add the schema bucket to the hash");
3712 xmlSchemaBucketFree(
ret);
3717 if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
3718 WXS_INCBUCKET(
ret)->ownerImport =
3719 WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
3721 WXS_INCBUCKET(
ret)->ownerImport =
3722 WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
3725 if (mainSchema->includes ==
NULL) {
3726 mainSchema->includes = xmlSchemaItemListCreate();
3727 if (mainSchema->includes ==
NULL) {
3728 xmlSchemaBucketFree(
ret);
3732 if (xmlSchemaItemListAdd(mainSchema->includes,
ret) < 0) {
3733 xmlSchemaBucketFree(
ret);
3741 if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->
buckets,
ret) == -1)
3747xmlSchemaAddItemSize(xmlSchemaItemListPtr *
list,
int initialSize,
void *
item)
3750 *
list = xmlSchemaItemListCreate();
3754 return(xmlSchemaItemListAddSize(*
list, initialSize,
item));
3764xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
3768 if (annot->next ==
NULL) {
3771 xmlSchemaAnnotPtr prev;
3775 annot = annot->next;
3777 }
while (annot !=
NULL);
3788xmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
3792 if (nota->annot !=
NULL)
3793 xmlSchemaFreeAnnot(nota->annot);
3804xmlSchemaFreeAttribute(xmlSchemaAttributePtr
attr)
3809 xmlSchemaFreeAnnot(
attr->annot);
3811 xmlSchemaFreeValue(
attr->defVal);
3822xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
3826 if (use->annot !=
NULL)
3827 xmlSchemaFreeAnnot(use->annot);
3828 if (use->defVal !=
NULL)
3829 xmlSchemaFreeValue(use->defVal);
3840xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
3854xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr
set)
3856 xmlSchemaWildcardNsPtr
next;
3872xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
3874 if (wildcard ==
NULL)
3876 if (wildcard->annot !=
NULL)
3877 xmlSchemaFreeAnnot(wildcard->annot);
3878 if (wildcard->nsSet !=
NULL)
3879 xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
3880 if (wildcard->negNsSet !=
NULL)
3892xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
3896 if (attrGr->annot !=
NULL)
3897 xmlSchemaFreeAnnot(attrGr->annot);
3898 if (attrGr->attrUses !=
NULL)
3899 xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
3910xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr
item)
3922xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr
link)
3924 xmlSchemaTypeLinkPtr
next;
3934xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
3936 xmlSchemaIDCStateObjPtr
next;
3937 while (sto !=
NULL) {
3939 if (sto->history !=
NULL)
3941 if (sto->xpathCtxt !=
NULL)
3942 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
3955xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
3957 xmlSchemaIDCSelectPtr
cur, prev;
3961 if (idcDef->annot !=
NULL)
3962 xmlSchemaFreeAnnot(idcDef->annot);
3964 if (idcDef->selector !=
NULL) {
3965 if (idcDef->selector->xpathComp !=
NULL)
3966 xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
3970 if (idcDef->fields !=
NULL) {
3971 cur = idcDef->fields;
3975 if (prev->xpathComp !=
NULL)
3976 xmlFreePattern((xmlPatternPtr) prev->xpathComp);
3990xmlSchemaFreeElement(xmlSchemaElementPtr
elem)
3995 xmlSchemaFreeAnnot(
elem->annot);
3997 xmlRegFreeRegexp(
elem->contModel);
3999 xmlSchemaFreeValue(
elem->defVal);
4010xmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
4014 if (facet->val !=
NULL)
4015 xmlSchemaFreeValue(facet->val);
4016 if (facet->regexp !=
NULL)
4017 xmlRegFreeRegexp(facet->regexp);
4018 if (facet->annot !=
NULL)
4019 xmlSchemaFreeAnnot(facet->annot);
4030xmlSchemaFreeType(xmlSchemaTypePtr
type)
4035 xmlSchemaFreeAnnot(
type->annot);
4037 xmlSchemaFacetPtr facet,
next;
4039 facet =
type->facets;
4040 while (facet !=
NULL) {
4042 xmlSchemaFreeFacet(facet);
4047 xmlSchemaItemListFree((xmlSchemaItemListPtr)
type->attrUses);
4049 xmlSchemaFreeTypeLinkList(
type->memberTypes);
4061 xmlRegFreeRegexp(
type->contModel);
4072xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr
item)
4075 xmlSchemaFreeAnnot(
item->annot);
4086xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr
item)
4089 xmlSchemaFreeAnnot(
item->annot);
4094xmlSchemaComponentListFree(xmlSchemaItemListPtr
list)
4099 xmlSchemaTreeItemPtr
item;
4100 xmlSchemaTreeItemPtr *
items = (xmlSchemaTreeItemPtr *)
list->items;
4108 case XML_SCHEMA_TYPE_SIMPLE:
4109 case XML_SCHEMA_TYPE_COMPLEX:
4110 xmlSchemaFreeType((xmlSchemaTypePtr)
item);
4112 case XML_SCHEMA_TYPE_ATTRIBUTE:
4113 xmlSchemaFreeAttribute((xmlSchemaAttributePtr)
item);
4115 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
4116 xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr)
item);
4118 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
4119 xmlSchemaFreeAttributeUseProhib(
4120 (xmlSchemaAttributeUseProhibPtr)
item);
4122 case XML_SCHEMA_TYPE_ELEMENT:
4123 xmlSchemaFreeElement((xmlSchemaElementPtr)
item);
4125 case XML_SCHEMA_TYPE_PARTICLE:
4127 xmlSchemaFreeAnnot(
item->annot);
4130 case XML_SCHEMA_TYPE_SEQUENCE:
4131 case XML_SCHEMA_TYPE_CHOICE:
4132 case XML_SCHEMA_TYPE_ALL:
4133 xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr)
item);
4135 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
4136 xmlSchemaFreeAttributeGroup(
4137 (xmlSchemaAttributeGroupPtr)
item);
4139 case XML_SCHEMA_TYPE_GROUP:
4140 xmlSchemaFreeModelGroupDef(
4141 (xmlSchemaModelGroupDefPtr)
item);
4143 case XML_SCHEMA_TYPE_ANY:
4144 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
4145 xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
item);
4147 case XML_SCHEMA_TYPE_IDC_KEY:
4148 case XML_SCHEMA_TYPE_IDC_UNIQUE:
4149 case XML_SCHEMA_TYPE_IDC_KEYREF:
4150 xmlSchemaFreeIDC((xmlSchemaIDCPtr)
item);
4152 case XML_SCHEMA_TYPE_NOTATION:
4153 xmlSchemaFreeNotation((xmlSchemaNotationPtr)
item);
4155 case XML_SCHEMA_EXTRA_QNAMEREF:
4156 xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr)
item);
4160 xmlSchemaPSimpleInternalErr(
NULL,
4161 "Internal error: xmlSchemaComponentListFree, "
4162 "unexpected component type '%s'\n",
4179xmlSchemaFree(xmlSchemaPtr
schema)
4209 xmlSchemaItemListPtr
list = (xmlSchemaItemListPtr)
schema->includes;
4212 xmlSchemaBucketFree((xmlSchemaBucketPtr)
list->items[
i]);
4214 xmlSchemaItemListFree(
list);
4217 xmlSchemaFreeAnnot(
schema->annot);
4230#ifdef LIBXML_OUTPUT_ENABLED
4233xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output);
4243xmlSchemaElementDump(
void *payload,
void *
data,
4248 xmlSchemaElementPtr
elem = (xmlSchemaElementPtr) payload;
4255 if (
elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
4258 if (
namespace !=
NULL)
4259 fprintf(output,
"ns '%s'",
namespace);
4262 if ((
elem->minOccurs != 1) || (
elem->maxOccurs != 1)) {
4264 if (
elem->maxOccurs >= UNBOUNDED)
4265 fprintf(output,
"max: unbounded\n");
4266 else if (
elem->maxOccurs != 1)
4275 if ((
elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
4276 (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
4277 (
elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
4278 (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
4280 if (
elem->flags & XML_SCHEMAS_ELEM_FIXED)
4282 if (
elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
4283 fprintf(output,
"[default] ");
4284 if (
elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
4285 fprintf(output,
"[abstract] ");
4286 if (
elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
4287 fprintf(output,
"[nillable] ");
4304 }
else if (
elem->subtypes !=
NULL) {
4308 xmlSchemaTypeDump(
elem->subtypes, output);
4314 fprintf(output,
" substitutionGroup: '%s' ",
elem->substGroup);
4330xmlSchemaAnnotDump(
FILE * output, xmlSchemaAnnotPtr annot)
4337 content = xmlNodeGetContent(annot->content);
4342 fprintf(output,
" Annot: empty\n");
4354xmlSchemaContentModelDump(xmlSchemaParticlePtr particle,
FILE * output,
int depth)
4357 xmlSchemaTreeItemPtr term;
4361 if (particle ==
NULL)
4363 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
4367 if (particle->children ==
NULL) {
4368 fprintf(output,
"MISSING particle term\n");
4371 term = particle->children;
4375 switch (term->type) {
4376 case XML_SCHEMA_TYPE_ELEMENT:
4377 fprintf(output,
"ELEM '%s'", xmlSchemaFormatQName(&
str,
4378 ((xmlSchemaElementPtr)term)->targetNamespace,
4379 ((xmlSchemaElementPtr)term)->
name));
4382 case XML_SCHEMA_TYPE_SEQUENCE:
4385 case XML_SCHEMA_TYPE_CHOICE:
4388 case XML_SCHEMA_TYPE_ALL:
4391 case XML_SCHEMA_TYPE_ANY:
4399 if (particle->minOccurs != 1)
4400 fprintf(output,
" min: %d", particle->minOccurs);
4401 if (particle->maxOccurs >= UNBOUNDED)
4402 fprintf(output,
" max: unbounded");
4403 else if (particle->maxOccurs != 1)
4404 fprintf(output,
" max: %d", particle->maxOccurs);
4407 ((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
4408 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
4409 (term->type == XML_SCHEMA_TYPE_ALL)) &&
4410 (term->children !=
NULL)) {
4411 xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
4414 if (particle->next !=
NULL)
4415 xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
4427xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses,
FILE * output)
4429 xmlSchemaAttributeUsePtr use;
4430 xmlSchemaAttributeUseProhibPtr prohib;
4431 xmlSchemaQNameRefPtr
ref;
4436 if ((uses ==
NULL) || (uses->nbItems == 0))
4439 fprintf(output,
" attributes:\n");
4440 for (
i = 0;
i < uses->nbItems;
i++) {
4441 use = uses->items[
i];
4442 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
4443 fprintf(output,
" [prohibition] ");
4444 prohib = (xmlSchemaAttributeUseProhibPtr) use;
4446 tns = prohib->targetNamespace;
4447 }
else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
4448 fprintf(output,
" [reference] ");
4449 ref = (xmlSchemaQNameRefPtr) use;
4451 tns =
ref->targetNamespace;
4454 name = WXS_ATTRUSE_DECL_NAME(use);
4455 tns = WXS_ATTRUSE_DECL_TNS(use);
4458 (
const char *) xmlSchemaFormatQName(&
str, tns,
name));
4471xmlSchemaTypeDump(xmlSchemaTypePtr
type,
FILE * output)
4474 fprintf(output,
"Type: NULL\n");
4481 fprintf(output,
"(no name) ");
4483 fprintf(output,
"ns '%s' ",
type->targetNamespace);
4484 switch (
type->type) {
4485 case XML_SCHEMA_TYPE_BASIC:
4488 case XML_SCHEMA_TYPE_SIMPLE:
4491 case XML_SCHEMA_TYPE_COMPLEX:
4492 fprintf(output,
"[complex] ");
4494 case XML_SCHEMA_TYPE_SEQUENCE:
4495 fprintf(output,
"[sequence] ");
4497 case XML_SCHEMA_TYPE_CHOICE:
4500 case XML_SCHEMA_TYPE_ALL:
4503 case XML_SCHEMA_TYPE_UR:
4506 case XML_SCHEMA_TYPE_RESTRICTION:
4507 fprintf(output,
"[restriction] ");
4509 case XML_SCHEMA_TYPE_EXTENSION:
4510 fprintf(output,
"[extension] ");
4513 fprintf(output,
"[unknown type %d] ",
type->type);
4517 switch (
type->contentType) {
4518 case XML_SCHEMA_CONTENT_UNKNOWN:
4519 fprintf(output,
"[unknown] ");
4521 case XML_SCHEMA_CONTENT_EMPTY:
4524 case XML_SCHEMA_CONTENT_ELEMENTS:
4525 fprintf(output,
"[element] ");
4527 case XML_SCHEMA_CONTENT_MIXED:
4530 case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
4533 case XML_SCHEMA_CONTENT_BASIC:
4536 case XML_SCHEMA_CONTENT_SIMPLE:
4539 case XML_SCHEMA_CONTENT_ANY:
4552 xmlSchemaAttrUsesDump(
type->attrUses, output);
4554 xmlSchemaAnnotDump(output,
type->annot);
4555#ifdef DUMP_CONTENT_MODEL
4556 if ((
type->type == XML_SCHEMA_TYPE_COMPLEX) &&
4558 xmlSchemaContentModelDump((xmlSchemaParticlePtr)
type->subtypes,
4565xmlSchemaTypeDumpEntry(
void *
type,
void *output,
4568 xmlSchemaTypeDump((xmlSchemaTypePtr)
type, (
FILE *) output);
4579xmlSchemaDump(
FILE * output, xmlSchemaPtr
schema)
4584 fprintf(output,
"Schemas: NULL\n");
4593 fprintf(output,
"%s", (
const char *)
schema->targetNamespace);
4595 fprintf(output,
"no target namespace");
4598 xmlSchemaAnnotDump(output,
schema->annot);
4622xmlSchemaGetPropNode(xmlNodePtr
node,
const char *
name)
4628 prop =
node->properties;
4629 while (prop !=
NULL) {
4649xmlSchemaGetPropNodeNs(xmlNodePtr
node,
const char *
uri,
const char *
name)
4655 prop =
node->properties;
4656 while (prop !=
NULL) {
4657 if ((prop->ns !=
NULL) &&
4667xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node)
4672 val = xmlNodeGetContent(
node);
4678 xmlSchemaPErrMemory(ctxt,
"getting node content",
node);
4683xmlSchemaGetNodeContentNoDict(xmlNodePtr
node)
4699xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
4719#define WXS_FIND_GLOBAL_ITEM(slot) \
4720 if (xmlStrEqual(nsName, schema->targetNamespace)) { \
4721 ret = xmlHashLookup(schema->slot, name); \
4722 if (ret != NULL) goto exit; \
4724 if (xmlHashSize(schema->schemasImports) > 1) { \
4725 xmlSchemaImportPtr import; \
4726 if (nsName == NULL) \
4727 import = xmlHashLookup(schema->schemasImports, \
4728 XML_SCHEMAS_NO_NAMESPACE); \
4730 import = xmlHashLookup(schema->schemasImports, nsName); \
4731 if (import == NULL) \
4733 ret = xmlHashLookup(import->schema->slot, name); \
4746static xmlSchemaElementPtr
4750 xmlSchemaElementPtr
ret =
NULL;
4755 WXS_FIND_GLOBAL_ITEM(elemDecl)
4771static xmlSchemaTypePtr
4781 ret = xmlSchemaGetPredefinedType(
name, nsName);
4792 WXS_FIND_GLOBAL_ITEM(typeDecl)
4809static xmlSchemaAttributePtr
4813 xmlSchemaAttributePtr
ret =
NULL;
4818 WXS_FIND_GLOBAL_ITEM(attrDecl)
4834static xmlSchemaAttributeGroupPtr
4838 xmlSchemaAttributeGroupPtr
ret =
NULL;
4843 WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
4865static xmlSchemaModelGroupDefPtr
4869 xmlSchemaModelGroupDefPtr
ret =
NULL;
4874 WXS_FIND_GLOBAL_ITEM(groupDecl)
4881static xmlSchemaNotationPtr
4882xmlSchemaGetNotation(xmlSchemaPtr
schema,
4886 xmlSchemaNotationPtr
ret =
NULL;
4891 WXS_FIND_GLOBAL_ITEM(notaDecl)
4897static xmlSchemaIDCPtr
4898xmlSchemaGetIDC(xmlSchemaPtr
schema,
4907 WXS_FIND_GLOBAL_ITEM(idcDef)
4923static xmlSchemaBasicItemPtr
4924xmlSchemaGetNamedComponent(xmlSchemaPtr
schema,
4925 xmlSchemaTypeType itemType,
4930 case XML_SCHEMA_TYPE_GROUP:
4931 return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(
schema,
4933 case XML_SCHEMA_TYPE_ELEMENT:
4934 return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(
schema,
4948#define IS_BLANK_NODE(n) \
4949 (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
4971 }
else while ((*
str != 0) && (
len != 0)) {
4981#define WXS_COMP_NAME(c, t) ((t) (c))->name
4982#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
4987static xmlSchemaBasicItemPtr
4988xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
4989 xmlSchemaTypeType
type,
4993 xmlSchemaBasicItemPtr
ret;
4998 if ((bucket->globals ==
NULL) ||
4999 (bucket->globals->nbItems == 0))
5004 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
5005 ret = bucket->globals->items[
i];
5008 case XML_SCHEMA_TYPE_COMPLEX:
5009 case XML_SCHEMA_TYPE_SIMPLE:
5010 if ((WXS_COMP_NAME(
ret, xmlSchemaTypePtr) ==
name) &&
5011 (WXS_COMP_TNS(
ret, xmlSchemaTypePtr) ==
5017 case XML_SCHEMA_TYPE_GROUP:
5018 if ((WXS_COMP_NAME(
ret,
5019 xmlSchemaModelGroupDefPtr) ==
name) &&
5021 xmlSchemaModelGroupDefPtr) == nsName))
5026 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
5027 if ((WXS_COMP_NAME(
ret,
5028 xmlSchemaAttributeGroupPtr) ==
name) &&
5030 xmlSchemaAttributeGroupPtr) == nsName))
5045 if (bucket->relations !=
NULL) {
5046 xmlSchemaSchemaRelationPtr rel = bucket->relations;
5052 bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
5054 if ((rel->bucket !=
NULL) &&
5055 ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
5056 ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
5062 }
while (rel !=
NULL);
5063 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
5079static xmlSchemaNotationPtr
5080xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5084 xmlSchemaNotationPtr
ret =
NULL;
5089 ret = (xmlSchemaNotationPtr)
xmlMalloc(
sizeof(xmlSchemaNotation));
5091 xmlSchemaPErrMemory(ctxt,
"add annotation",
NULL);
5094 memset(
ret, 0,
sizeof(xmlSchemaNotation));
5095 ret->type = XML_SCHEMA_TYPE_NOTATION;
5097 ret->targetNamespace = nsName;
5100 WXS_ADD_GLOBAL(ctxt,
ret);
5116static xmlSchemaAttributePtr
5117xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5119 xmlNodePtr
node,
int topLevel)
5121 xmlSchemaAttributePtr
ret =
NULL;
5126 ret = (xmlSchemaAttributePtr)
xmlMalloc(
sizeof(xmlSchemaAttribute));
5128 xmlSchemaPErrMemory(ctxt,
"allocating attribute",
NULL);
5131 memset(
ret, 0,
sizeof(xmlSchemaAttribute));
5132 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
5135 ret->targetNamespace = nsName;
5138 WXS_ADD_GLOBAL(ctxt,
ret);
5140 WXS_ADD_LOCAL(ctxt,
ret);
5141 WXS_ADD_PENDING(ctxt,
ret);
5157static xmlSchemaAttributeUsePtr
5158xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
5161 xmlSchemaAttributeUsePtr
ret =
NULL;
5166 ret = (xmlSchemaAttributeUsePtr)
xmlMalloc(
sizeof(xmlSchemaAttributeUse));
5168 xmlSchemaPErrMemory(pctxt,
"allocating attribute",
NULL);
5171 memset(
ret, 0,
sizeof(xmlSchemaAttributeUse));
5172 ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
5175 WXS_ADD_LOCAL(pctxt,
ret);
5185static xmlSchemaRedefPtr
5186xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
5187 xmlSchemaBucketPtr targetBucket,
5192 xmlSchemaRedefPtr
ret;
5194 ret = (xmlSchemaRedefPtr)
5197 xmlSchemaPErrMemory(pctxt,
5198 "allocating redefinition info",
NULL);
5203 ret->targetBucket = targetBucket;
5204 ret->refName = refName;
5205 ret->refTargetNs = refTargetNs;
5206 if (WXS_CONSTRUCTOR(pctxt)->redefs ==
NULL)
5207 WXS_CONSTRUCTOR(pctxt)->redefs =
ret;
5209 WXS_CONSTRUCTOR(pctxt)->lastRedef->next =
ret;
5210 WXS_CONSTRUCTOR(pctxt)->lastRedef =
ret;
5227static xmlSchemaAttributeGroupPtr
5228xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
5234 xmlSchemaAttributeGroupPtr
ret =
NULL;
5239 ret = (xmlSchemaAttributeGroupPtr)
5240 xmlMalloc(
sizeof(xmlSchemaAttributeGroup));
5242 xmlSchemaPErrMemory(pctxt,
"allocating attribute group",
NULL);
5245 memset(
ret, 0,
sizeof(xmlSchemaAttributeGroup));
5246 ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
5248 ret->targetNamespace = nsName;
5252 ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
5253 if (pctxt->isRedefine) {
5254 pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
5256 if (pctxt->redef ==
NULL) {
5260 pctxt->redefCounter = 0;
5262 WXS_ADD_GLOBAL(pctxt,
ret);
5263 WXS_ADD_PENDING(pctxt,
ret);
5279static xmlSchemaElementPtr
5280xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
5282 xmlNodePtr
node,
int topLevel)
5284 xmlSchemaElementPtr
ret =
NULL;
5289 ret = (xmlSchemaElementPtr)
xmlMalloc(
sizeof(xmlSchemaElement));
5291 xmlSchemaPErrMemory(ctxt,
"allocating element",
NULL);
5294 memset(
ret, 0,
sizeof(xmlSchemaElement));
5295 ret->type = XML_SCHEMA_TYPE_ELEMENT;
5297 ret->targetNamespace = nsName;
5301 WXS_ADD_GLOBAL(ctxt,
ret);
5303 WXS_ADD_LOCAL(ctxt,
ret);
5304 WXS_ADD_PENDING(ctxt,
ret);
5320static xmlSchemaTypePtr
5321xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5322 xmlSchemaTypeType
type,
5324 xmlNodePtr
node,
int topLevel)
5331 ret = (xmlSchemaTypePtr)
xmlMalloc(
sizeof(xmlSchemaType));
5333 xmlSchemaPErrMemory(ctxt,
"allocating type",
NULL);
5339 ret->targetNamespace = nsName;
5342 if (ctxt->isRedefine) {
5343 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5345 if (ctxt->redef ==
NULL) {
5349 ctxt->redefCounter = 0;
5351 WXS_ADD_GLOBAL(ctxt,
ret);
5353 WXS_ADD_LOCAL(ctxt,
ret);
5354 WXS_ADD_PENDING(ctxt,
ret);
5358static xmlSchemaQNameRefPtr
5359xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
5360 xmlSchemaTypeType refType,
5364 xmlSchemaQNameRefPtr
ret;
5366 ret = (xmlSchemaQNameRefPtr)
5369 xmlSchemaPErrMemory(pctxt,
5370 "allocating QName reference item",
NULL);
5374 ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
5375 ret->name = refName;
5376 ret->targetNamespace = refNs;
5378 ret->itemType = refType;
5382 WXS_ADD_LOCAL(pctxt,
ret);
5386static xmlSchemaAttributeUseProhibPtr
5387xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
5389 xmlSchemaAttributeUseProhibPtr
ret;
5391 ret = (xmlSchemaAttributeUseProhibPtr)
5392 xmlMalloc(
sizeof(xmlSchemaAttributeUseProhib));
5394 xmlSchemaPErrMemory(pctxt,
5395 "allocating attribute use prohibition",
NULL);
5398 memset(
ret, 0,
sizeof(xmlSchemaAttributeUseProhib));
5399 ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
5400 WXS_ADD_LOCAL(pctxt,
ret);
5417static xmlSchemaModelGroupPtr
5418xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
5420 xmlSchemaTypeType
type,
5423 xmlSchemaModelGroupPtr
ret =
NULL;
5428 ret = (xmlSchemaModelGroupPtr)
5431 xmlSchemaPErrMemory(ctxt,
"allocating model group component",
5435 memset(
ret, 0,
sizeof(xmlSchemaModelGroup));
5438 WXS_ADD_LOCAL(ctxt,
ret);
5439 if ((
type == XML_SCHEMA_TYPE_SEQUENCE) ||
5440 (
type == XML_SCHEMA_TYPE_CHOICE))
5441 WXS_ADD_PENDING(ctxt,
ret);
5459static xmlSchemaParticlePtr
5460xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
5463 xmlSchemaParticlePtr
ret =
NULL;
5467 ret = (xmlSchemaParticlePtr)
5470 xmlSchemaPErrMemory(ctxt,
"allocating particle component",
5474 ret->type = XML_SCHEMA_TYPE_PARTICLE;
5482 WXS_ADD_LOCAL(ctxt,
ret);
5502static xmlSchemaModelGroupDefPtr
5503xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
5509 xmlSchemaModelGroupDefPtr
ret =
NULL;
5514 ret = (xmlSchemaModelGroupDefPtr)
5515 xmlMalloc(
sizeof(xmlSchemaModelGroupDef));
5517 xmlSchemaPErrMemory(ctxt,
"adding group",
NULL);
5520 memset(
ret, 0,
sizeof(xmlSchemaModelGroupDef));
5522 ret->type = XML_SCHEMA_TYPE_GROUP;
5524 ret->targetNamespace = nsName;
5526 if (ctxt->isRedefine) {
5527 ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5529 if (ctxt->redef ==
NULL) {
5533 ctxt->redefCounter = 0;
5535 WXS_ADD_GLOBAL(ctxt,
ret);
5536 WXS_ADD_PENDING(ctxt,
ret);
5548static xmlSchemaWildcardNsPtr
5549xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
5551 xmlSchemaWildcardNsPtr
ret;
5553 ret = (xmlSchemaWildcardNsPtr)
5556 xmlSchemaPErrMemory(ctxt,
"creating wildcard namespace constraint",
NULL);
5564static xmlSchemaIDCPtr
5565xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5574 ret = (xmlSchemaIDCPtr)
xmlMalloc(
sizeof(xmlSchemaIDC));
5576 xmlSchemaPErrMemory(ctxt,
5577 "allocating an identity-constraint definition",
NULL);
5582 ret->targetNamespace = nsName;
5587 WXS_ADD_GLOBAL(ctxt,
ret);
5591 if (
category == XML_SCHEMA_TYPE_IDC_KEYREF)
5592 WXS_ADD_PENDING(ctxt,
ret);
5606static xmlSchemaWildcardPtr
5607xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
5608 xmlSchemaTypeType
type, xmlNodePtr
node)
5610 xmlSchemaWildcardPtr
ret =
NULL;
5615 ret = (xmlSchemaWildcardPtr)
xmlMalloc(
sizeof(xmlSchemaWildcard));
5617 xmlSchemaPErrMemory(ctxt,
"adding wildcard",
NULL);
5620 memset(
ret, 0,
sizeof(xmlSchemaWildcard));
5623 WXS_ADD_LOCAL(ctxt,
ret);
5628xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr
group)
5633 xmlSchemaItemListFree(
group->members);
5640 xmlSchemaSubstGroupFree((xmlSchemaSubstGroupPtr)
group);
5643static xmlSchemaSubstGroupPtr
5644xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
5645 xmlSchemaElementPtr
head)
5647 xmlSchemaSubstGroupPtr
ret;
5650 if (WXS_SUBST_GROUPS(pctxt) ==
NULL) {
5652 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5656 ret = (xmlSchemaSubstGroupPtr)
xmlMalloc(
sizeof(xmlSchemaSubstGroup));
5658 xmlSchemaPErrMemory(
NULL,
5659 "allocating a substitution group container",
NULL);
5662 memset(
ret, 0,
sizeof(xmlSchemaSubstGroup));
5665 ret->members = xmlSchemaItemListCreate();
5667 xmlSchemaSubstGroupFree(
ret);
5673 PERROR_INT(
"xmlSchemaSubstGroupAdd",
5674 "failed to add a new substitution container");
5675 xmlSchemaSubstGroupFree(
ret);
5681static xmlSchemaSubstGroupPtr
5682xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
5683 xmlSchemaElementPtr
head)
5685 if (WXS_SUBST_GROUPS(pctxt) ==
NULL)
5688 head->name,
head->targetNamespace));
5703xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
5704 xmlSchemaElementPtr
head,
5705 xmlSchemaElementPtr
member)
5707 xmlSchemaSubstGroupPtr substGroup =
NULL;
5712 substGroup = xmlSchemaSubstGroupGet(pctxt,
head);
5713 if (substGroup ==
NULL)
5714 substGroup = xmlSchemaSubstGroupAdd(pctxt,
head);
5715 if (substGroup ==
NULL)
5717 if (xmlSchemaItemListAdd(substGroup->members,
member) == -1)
5745xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
5747 xmlSchemaBasicItemPtr ownerItem,
5761 xmlSchemaPSimpleTypeErr(ctxt,
5763 ownerItem, (xmlNodePtr)
attr,
5764 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
5773 if (
ns &&
ns->href &&
ns->href[0])
5775 else if (
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
5782 *
uri = ctxt->targetNamespace;
5793 ns = xmlSearchNs(
attr->doc,
attr->parent, pref);
5795 xmlSchemaPSimpleTypeErr(ctxt,
5797 ownerItem, (xmlNodePtr)
attr,
5798 xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
NULL,
value,
5799 "The value '%s' of simple type 'xs:QName' has no "
5800 "corresponding namespace declaration in scope",
value,
NULL);
5825xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
5827 xmlSchemaBasicItemPtr ownerItem,
5834 value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
5835 return (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
5855xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
5857 xmlSchemaBasicItemPtr ownerItem,
5858 xmlNodePtr ownerElem,
5865 attr = xmlSchemaGetPropNode(ownerElem,
name);
5871 return (xmlSchemaPValAttrNodeQName(ctxt,
schema,
5885xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr
attr)
5892 value = xmlSchemaGetNodeContentNoDict((xmlNodePtr)
attr);
5898 if (
attr->atype != XML_ATTRIBUTE_ID) {
5906 strip = xmlSchemaCollapseString(
value);
5907 if (strip !=
NULL) {
5914 xmlSchemaPSimpleTypeErr(ctxt,
5917 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5918 NULL,
NULL,
"Duplicate value '%s' of simple "
5921 attr->atype = XML_ATTRIBUTE_ID;
5923 }
else if (
ret > 0) {
5925 xmlSchemaPSimpleTypeErr(ctxt,
5928 xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5929 NULL,
NULL,
"The value '%s' of simple type 'xs:ID' is "
5930 "not a valid 'xs:NCName'",
5940xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
5941 xmlNodePtr ownerElem,
5946 attr = xmlSchemaGetPropNode(ownerElem, (
const char *)
name);
5949 return(xmlSchemaPValAttrNodeID(ctxt,
attr));
5963xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
5970 attr = xmlSchemaGetPropNode(
node,
"maxOccurs");
5973 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
5978 if (
max != UNBOUNDED) {
5979 xmlSchemaPSimpleTypeErr(ctxt,
5993 xmlSchemaPSimpleTypeErr(ctxt,
6000 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6019 xmlSchemaPSimpleTypeErr(ctxt,
6039xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
6046 attr = xmlSchemaGetPropNode(
node,
"minOccurs");
6049 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6056 xmlSchemaPSimpleTypeErr(ctxt,
6063 while ((*
cur >=
'0') && (*
cur <=
'9')) {
6082 xmlSchemaPSimpleTypeErr(ctxt,
6103xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
6104 xmlSchemaBasicItemPtr ownerItem,
6125 xmlSchemaPSimpleTypeErr(ctxt,
6128 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6150xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
6152 const char *
name,
int def)
6173 xmlSchemaPSimpleTypeErr(ctxt,
6176 (xmlNodePtr) xmlSchemaGetPropNode(
node,
name),
6177 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6188static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
6189 ctxt, xmlSchemaPtr
schema,
6192static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
6197static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
6201 xmlSchemaTypeType parentType);
6202static xmlSchemaBasicItemPtr
6203xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
6206 xmlSchemaItemListPtr uses,
6208static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
6211static xmlSchemaWildcardPtr
6212xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
6232xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
6233 xmlSchemaBasicItemPtr ownerItem,
6236 xmlSchemaTypePtr
type)
6247 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6248 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6249 "the given type is not a built-in type");
6252 switch (
type->builtInType) {
6253 case XML_SCHEMAS_NCNAME:
6254 case XML_SCHEMAS_QNAME:
6255 case XML_SCHEMAS_ANYURI:
6256 case XML_SCHEMAS_TOKEN:
6257 case XML_SCHEMAS_LANGUAGE:
6262 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6263 "validation using the given type is not supported while "
6264 "parsing a schema");
6272 PERROR_INT(
"xmlSchemaPValAttrNodeValue",
6273 "failed to validate a schema attribute value");
6275 }
else if (
ret > 0) {
6276 if (WXS_IS_LIST(
type))
6280 xmlSchemaPSimpleTypeErr(pctxt,
6281 ret, ownerItem, (xmlNodePtr)
attr,
6304xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
6305 xmlSchemaBasicItemPtr ownerItem,
6307 xmlSchemaTypePtr
type,
6315 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6319 return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem,
attr,
6342xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
6343 xmlSchemaBasicItemPtr ownerItem,
6344 xmlNodePtr ownerElem,
6346 xmlSchemaTypePtr
type,
6356 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
6359 xmlSchemaPErr(ctxt, ownerElem,
6361 "Internal error: xmlSchemaPValAttr, the given "
6362 "type '%s' is not a built-in type.\n",
6366 attr = xmlSchemaGetPropNode(ownerElem,
name);
6372 return (xmlSchemaPValAttrNode(ctxt, ownerItem,
attr,
6377xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
6384 if (
xmlStrEqual(pctxt->targetNamespace, namespaceName))
6391 if (WXS_BUCKET(pctxt)->relations !=
NULL) {
6392 xmlSchemaSchemaRelationPtr rel;
6394 rel = WXS_BUCKET(pctxt)->relations;
6396 if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
6400 }
while (rel !=
NULL);
6408 if (namespaceName ==
NULL)
6409 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6411 "References from this schema to components in no "
6412 "namespace are not allowed, since not indicated by an "
6415 xmlSchemaCustomErr(ACTXT_CAST pctxt,
6417 "References from this schema to components in the "
6418 "namespace '%s' are not allowed, since not indicated by an "
6419 "import statement", namespaceName,
NULL);
6435xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6436 xmlNodePtr *
child, xmlSchemaItemListPtr *
list,
6437 int parentType,
int *hasRefs)
6441 while ((IS_SCHEMA((*
child),
"attribute")) ||
6442 (IS_SCHEMA((*
child),
"attributeGroup"))) {
6443 if (IS_SCHEMA((*
child),
"attribute")) {
6454 *
list = xmlSchemaItemListCreate();
6458 if (xmlSchemaItemListAddSize(*
list, 2,
item) == -1)
6461 *
child = (*child)->next;
6478static xmlSchemaAnnotPtr
6479xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
node,
int needed)
6481 xmlSchemaAnnotPtr
ret;
6497 ret = xmlSchemaNewAnnot(ctxt,
node);
6507 xmlSchemaPIllegalAttrErr(ctxt,
6518 if (IS_SCHEMA(
child,
"appinfo")) {
6532 xmlSchemaPIllegalAttrErr(ctxt,
6537 xmlSchemaPValAttr(ctxt,
NULL,
child,
"source",
6538 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
6540 }
else if (IS_SCHEMA(
child,
"documentation")) {
6551 xmlSchemaPIllegalAttrErr(ctxt,
6559 xmlSchemaPIllegalAttrErr(ctxt,
6568 attr = xmlSchemaGetPropNodeNs(
child, (
const char *) XML_XML_NAMESPACE,
"lang");
6570 xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
6571 xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE),
NULL);
6575 xmlSchemaPContentErr(ctxt,
6597static xmlSchemaFacetPtr
6598xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6601 xmlSchemaFacetPtr facet;
6608 facet = xmlSchemaNewFacet();
6609 if (facet ==
NULL) {
6610 xmlSchemaPErrMemory(ctxt,
"allocating facet",
node);
6614 value = xmlSchemaGetProp(ctxt,
node,
"value");
6617 "Facet %s has no value\n",
node->name,
NULL);
6618 xmlSchemaFreeFacet(facet);
6621 if (IS_SCHEMA(
node,
"minInclusive")) {
6622 facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
6623 }
else if (IS_SCHEMA(
node,
"minExclusive")) {
6624 facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
6625 }
else if (IS_SCHEMA(
node,
"maxInclusive")) {
6626 facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
6627 }
else if (IS_SCHEMA(
node,
"maxExclusive")) {
6628 facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
6629 }
else if (IS_SCHEMA(
node,
"totalDigits")) {
6630 facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
6631 }
else if (IS_SCHEMA(
node,
"fractionDigits")) {
6632 facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
6633 }
else if (IS_SCHEMA(
node,
"pattern")) {
6634 facet->type = XML_SCHEMA_FACET_PATTERN;
6635 }
else if (IS_SCHEMA(
node,
"enumeration")) {
6636 facet->type = XML_SCHEMA_FACET_ENUMERATION;
6637 }
else if (IS_SCHEMA(
node,
"whiteSpace")) {
6638 facet->type = XML_SCHEMA_FACET_WHITESPACE;
6639 }
else if (IS_SCHEMA(
node,
"length")) {
6640 facet->type = XML_SCHEMA_FACET_LENGTH;
6641 }
else if (IS_SCHEMA(
node,
"maxLength")) {
6642 facet->type = XML_SCHEMA_FACET_MAXLENGTH;
6643 }
else if (IS_SCHEMA(
node,
"minLength")) {
6644 facet->type = XML_SCHEMA_FACET_MINLENGTH;
6647 "Unknown facet type %s\n",
node->name,
NULL);
6648 xmlSchemaFreeFacet(facet);
6652 facet->value =
value;
6653 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
6654 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
6657 fixed = xmlSchemaGetProp(ctxt,
node,
"fixed");
6665 if (IS_SCHEMA(
child,
"annotation")) {
6666 facet->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6671 "Facet %s has unexpected child content\n",
6691xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
6693 xmlSchemaWildcardPtr wildc,
6699 xmlSchemaWildcardNsPtr tmp, lastNs =
NULL;
6702 pc = xmlSchemaGetProp(ctxt,
node,
"processContents");
6705 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6707 wildc->processContents = XML_SCHEMAS_ANY_SKIP;
6709 wildc->processContents = XML_SCHEMAS_ANY_LAX;
6711 xmlSchemaPSimpleTypeErr(ctxt,
6714 NULL,
"(strict | skip | lax)", pc,
6716 wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6722 attr = xmlSchemaGetPropNode(
node,
"namespace");
6723 ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
6729 wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
6730 if (wildc->negNsSet ==
NULL) {
6733 wildc->negNsSet->value = ctxt->targetNamespace;
6749 xmlSchemaPSimpleTypeErr(ctxt,
6753 "((##any | ##other) | List of (xs:anyURI | "
6754 "(##targetNamespace | ##local)))",
6759 dictnsItem = ctxt->targetNamespace;
6766 xmlSchemaPValAttrNodeValue(ctxt,
NULL,
attr,
6767 nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
6774 while (tmp !=
NULL) {
6775 if (dictnsItem == tmp->value)
6780 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
6785 tmp->value = dictnsItem;
6787 if (wildc->nsSet ==
NULL)
6789 else if (lastNs !=
NULL)
6797 }
while (*
cur != 0);
6803xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
6809 if ((maxOccurs == 0) && ( minOccurs == 0))
6811 if (maxOccurs != UNBOUNDED) {
6821 if (maxOccurs < 1) {
6825 xmlSchemaPCustomAttrErr(ctxt,
6828 xmlSchemaGetPropNode(
node,
"maxOccurs"),
6829 "The value must be greater than or equal to 1");
6831 }
else if (minOccurs > maxOccurs) {
6835 xmlSchemaPCustomAttrErr(ctxt,
6838 xmlSchemaGetPropNode(
node,
"minOccurs"),
6839 "The value must not be greater than the value of 'maxOccurs'");
6859static xmlSchemaParticlePtr
6860xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6863 xmlSchemaParticlePtr particle;
6865 xmlSchemaWildcardPtr wild;
6868 xmlSchemaAnnotPtr annot =
NULL;
6883 xmlSchemaPIllegalAttrErr(ctxt,
6887 xmlSchemaPIllegalAttrErr(ctxt,
6896 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
6897 "(xs:nonNegativeInteger | unbounded)");
6898 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
6899 "xs:nonNegativeInteger");
6904 wild = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY,
node);
6907 xmlSchemaParseWildcardNs(ctxt,
schema, wild,
node);
6912 if (IS_SCHEMA(
child,
"annotation")) {
6913 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6917 xmlSchemaPContentErr(ctxt,
6920 NULL,
"(annotation?)");
6925 if ((
min == 0) && (
max == 0)) {
6932 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
6933 if (particle ==
NULL)
6935 particle->annot = annot;
6936 particle->children = (xmlSchemaTreeItemPtr) wild;
6951static xmlSchemaNotationPtr
6952xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
6956 xmlSchemaNotationPtr
ret;
6961 name = xmlSchemaGetProp(ctxt,
node,
"name");
6964 "Notation has no name\n",
NULL,
NULL);
6968 ctxt->targetNamespace,
node);
6974 if (IS_SCHEMA(
child,
"annotation")) {
6975 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
6979 xmlSchemaPContentErr(ctxt,
6982 NULL,
"(annotation?)");
6999static xmlSchemaWildcardPtr
7000xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
7003 xmlSchemaWildcardPtr
ret;
7010 ret = xmlSchemaAddWildcard(ctxt,
schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
7024 xmlSchemaPIllegalAttrErr(ctxt,
7028 xmlSchemaPIllegalAttrErr(ctxt,
7043 if (IS_SCHEMA(
child,
"annotation")) {
7044 ret->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
7048 xmlSchemaPContentErr(ctxt,
7051 NULL,
"(annotation?)");
7069static xmlSchemaBasicItemPtr
7070xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
7073 xmlSchemaItemListPtr uses,
7077 xmlSchemaAttributeUsePtr use =
NULL;
7081 int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7082 int nberrors, hasForm = 0, defValueType = 0;
7084#define WXS_ATTR_DEF_VAL_DEFAULT 1
7085#define WXS_ATTR_DEF_VAL_FIXED 2
7093 attr = xmlSchemaGetPropNode(
node,
"ref");
7095 if (xmlSchemaPValAttrNodeQName(pctxt,
schema,
7096 NULL,
attr, &tmpNs, &tmpName) != 0) {
7099 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, tmpNs) != 0)
7103 nberrors = pctxt->nberrors;
7112 xmlSchemaPValAttrNodeID(pctxt,
attr);
7121 xmlSchemaPValAttrNodeID(pctxt,
attr);
7124 xmlSchemaPValAttrNodeQName(pctxt,
schema,
NULL,
7125 attr, &tmpNs, &tmpName);
7132 attrValue = xmlSchemaGetNodeContent(pctxt,
7135 ns = pctxt->targetNamespace;
7138 xmlSchemaPSimpleTypeErr(pctxt,
7141 NULL,
"(qualified | unqualified)",
7149 attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7152 occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7154 occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
7156 occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
7158 xmlSchemaPSimpleTypeErr(pctxt,
7161 NULL,
"(optional | prohibited | required)",
7171 xmlSchemaPMutualExclAttrErr(pctxt,
7175 defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7176 defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
7185 xmlSchemaPMutualExclAttrErr(pctxt,
7189 defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7190 defValueType = WXS_ATTR_DEF_VAL_FIXED;
7197 xmlSchemaPIllegalAttrErr(pctxt,
7208 if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
7209 (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
7210 xmlSchemaPSimpleTypeErr(pctxt,
7213 "(optional | prohibited | required)",
NULL,
7214 "The value of the attribute 'use' must be 'optional' "
7215 "if the attribute 'default' is present",
7221 if (nberrors != pctxt->nberrors)
7224 xmlSchemaAttributePtr attrDecl;
7227 if ((! hasForm) && (
schema->flags & XML_SCHEMAS_QUALIF_ATTR))
7228 ns = pctxt->targetNamespace;
7234 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7237 "The target namespace must not match '%s'",
7238 xmlSchemaInstanceNs,
NULL);
7240 attr = xmlSchemaGetPropNode(
node,
"name");
7246 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7247 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7255 xmlSchemaPSimpleTypeErr(pctxt,
7258 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7259 "The value of the attribute must not match 'xmlns'",
7263 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
7264 goto check_children;
7268 use = xmlSchemaAddAttributeUse(pctxt,
node);
7271 use->occurs = occurs;
7276 if (attrDecl ==
NULL)
7278 if (tmpName !=
NULL) {
7279 attrDecl->typeName = tmpName;
7280 attrDecl->typeNs = tmpNs;
7282 use->attrDecl = attrDecl;
7286 if (defValue !=
NULL) {
7287 attrDecl->defValue = defValue;
7288 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7289 attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
7291 }
else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7292 xmlSchemaQNameRefPtr
ref;
7297 use = xmlSchemaAddAttributeUse(pctxt,
node);
7303 WXS_ADD_PENDING(pctxt, use);
7304 use->occurs = occurs;
7308 ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
7316 use->attrDecl = WXS_ATTR_CAST
ref;
7320 if (defValue !=
NULL)
7321 use->defValue = defValue;
7322 if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7323 use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
7331 if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7332 xmlSchemaAttributeUseProhibPtr prohib;
7334 if (IS_SCHEMA(
child,
"annotation")) {
7335 xmlSchemaParseAnnotation(pctxt,
child, 0);
7339 xmlSchemaPContentErr(pctxt,
7347 if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
7348 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7351 "Skipping attribute use prohibition, since it is "
7352 "pointless inside an <attributeGroup>",
7355 }
else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
7356 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7359 "Skipping attribute use prohibition, since it is "
7360 "pointless when extending a type",
7374 for (
i = 0;
i < uses->nbItems;
i++) {
7375 use = uses->items[
i];
7376 if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
7377 (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
7378 (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
7382 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7385 "Skipping duplicate attribute use prohibition '%s'",
7386 xmlSchemaFormatQName(&
str, tmpNs, tmpName),
7396 prohib = xmlSchemaAddAttributeUseProhib(pctxt);
7399 prohib->node =
node;
7400 prohib->name = tmpName;
7401 prohib->targetNamespace = tmpNs;
7406 WXS_ADD_PENDING(pctxt, prohib);
7408 return(WXS_BASIC_CAST prohib);
7410 if (IS_SCHEMA(
child,
"annotation")) {
7414 use->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7419 if (IS_SCHEMA(
child,
"simpleType"))
7425 xmlSchemaPContentErr(pctxt,
7430 xmlSchemaPContentErr(pctxt,
7436 if (IS_SCHEMA(
child,
"simpleType")) {
7437 if (WXS_ATTRUSE_DECL(use)->typeName !=
NULL) {
7444 "The attribute 'type' and the <simpleType> child "
7445 "are mutually exclusive",
NULL);
7447 WXS_ATTRUSE_TYPEDEF(use) =
7448 xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7454 "(annotation?, simpleType?)");
7457 return (WXS_BASIC_CAST use);
7461static xmlSchemaAttributePtr
7462xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
7467 xmlSchemaAttributePtr
ret;
7483 attr = xmlSchemaGetPropNode(
node,
"name");
7489 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
7490 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
7498 xmlSchemaPSimpleTypeErr(pctxt,
7501 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME),
NULL,
NULL,
7502 "The value of the attribute must not match 'xmlns'",
7512 if (
xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
7513 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7515 "The target namespace must not match '%s'",
7516 xmlSchemaInstanceNs,
NULL);
7519 ret = xmlSchemaAddAttribute(pctxt,
schema, attrValue,
7520 pctxt->targetNamespace,
node, 1);
7523 ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
7537 xmlSchemaPIllegalAttrErr(pctxt,
7541 xmlSchemaPIllegalAttrErr(pctxt,
7553 ret->defValue = xmlSchemaGetProp(pctxt,
node,
"fixed");
7555 ret->flags |= XML_SCHEMAS_ATTR_FIXED;
7559 attr = xmlSchemaGetPropNode(
node,
"default");
7565 if (
ret->flags & XML_SCHEMAS_ATTR_FIXED) {
7567 WXS_BASIC_CAST
ret,
attr,
"default",
"fixed");
7569 ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr)
attr);
7575 if (IS_SCHEMA(
child,
"annotation")) {
7576 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7579 if (IS_SCHEMA(
child,
"simpleType")) {
7587 "The attribute 'type' and the <simpleType> child "
7588 "are mutually exclusive",
NULL);
7590 ret->subtypes = xmlSchemaParseSimpleType(pctxt,
schema,
child, 0);
7596 "(annotation?, simpleType?)");
7614static xmlSchemaQNameRefPtr
7615xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
7619 xmlSchemaQNameRefPtr
ret;
7627 attr = xmlSchemaGetPropNode(
node,
"ref");
7629 xmlSchemaPMissingAttrErr(pctxt,
7634 xmlSchemaPValAttrNodeQName(pctxt,
schema,
7636 if (xmlSchemaCheckReference(pctxt,
schema,
node,
attr, refNs) != 0)
7648 xmlSchemaPIllegalAttrErr(pctxt,
7652 xmlSchemaPIllegalAttrErr(pctxt,
7664 if (IS_SCHEMA(
child,
"annotation")) {
7668 xmlSchemaParseAnnotation(pctxt,
child, 0);
7672 xmlSchemaPContentErr(pctxt,
7681 if (pctxt->isRedefine && pctxt->redef &&
7682 (pctxt->redef->item->type ==
7683 XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
7684 (
ref == pctxt->redef->refName) &&
7685 (refNs == pctxt->redef->refTargetNs))
7694 if (pctxt->redefCounter != 0) {
7697 xmlSchemaCustomErr(ACTXT_CAST pctxt,
7699 "The redefining attribute group definition "
7700 "'%s' must not contain more than one "
7701 "reference to the redefined definition",
7702 xmlSchemaFormatQName(&
str, refNs,
ref),
NULL);
7706 pctxt->redefCounter++;
7711 ret = xmlSchemaNewQNameRef(pctxt,
7712 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7716 pctxt->redef->reference = WXS_BASIC_CAST
ret;
7723 ret = xmlSchemaNewQNameRef(pctxt,
7724 XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
ref, refNs);
7729 WXS_ADD_PENDING(pctxt,
ret);
7745static xmlSchemaAttributeGroupPtr
7746xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
7751 xmlSchemaAttributeGroupPtr
ret;
7759 attr = xmlSchemaGetPropNode(
node,
"name");
7761 xmlSchemaPMissingAttrErr(pctxt,
7769 if (xmlSchemaPValAttrNode(pctxt,
7771 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
7774 ret = xmlSchemaAddAttributeGroupDefinition(pctxt,
schema,
7775 name, pctxt->targetNamespace,
node);
7787 xmlSchemaPIllegalAttrErr(pctxt,
7791 xmlSchemaPIllegalAttrErr(pctxt,
7802 if (IS_SCHEMA(
child,
"annotation")) {
7803 ret->annot = xmlSchemaParseAnnotation(pctxt,
child, 1);
7809 if (xmlSchemaParseLocalAttributes(pctxt,
schema, &
child,
7810 (xmlSchemaItemListPtr *) &(
ret->attrUses),
7811 XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
7814 ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
7818 if (IS_SCHEMA(
child,
"anyAttribute")) {
7819 ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
7824 xmlSchemaPContentErr(pctxt,
7827 "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
7846 if ((*
flags & flagQualified) == 0)
7847 *
flags |= flagQualified;
7876 int flagRestriction,
7877 int flagSubstitution,
7894 if (flagExtension != -1)
7895 *
flags |= flagExtension;
7896 if (flagRestriction != -1)
7897 *
flags |= flagRestriction;
7898 if (flagSubstitution != -1)
7899 *
flags |= flagSubstitution;
7902 if (flagUnion != -1)
7903 *
flags |= flagUnion;
7919 if (flagExtension != -1) {
7920 if ((*
flags & flagExtension) == 0)
7921 *
flags |= flagExtension;
7925 if (flagRestriction != -1) {
7926 if ((*
flags & flagRestriction) == 0)
7927 *
flags |= flagRestriction;
7931 if (flagSubstitution != -1) {
7932 if ((*
flags & flagSubstitution) == 0)
7933 *
flags |= flagSubstitution;
7937 if (flagList != -1) {
7938 if ((*
flags & flagList) == 0)
7943 if (flagUnion != -1) {
7944 if ((*
flags & flagUnion) == 0)
7945 *
flags |= flagUnion;
7953 }
while ((
ret == 0) && (*
cur != 0));
7960xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
7961 xmlSchemaIDCPtr idc,
7962 xmlSchemaIDCSelectPtr selector,
7975 if (selector ==
NULL) {
7976 xmlSchemaPErr(ctxt, idc->node,
7978 "Internal error: xmlSchemaCheckCSelectorXPath, "
7979 "the selector is not specified.\n",
NULL,
NULL);
7986 if (selector->xpath ==
NULL) {
7987 xmlSchemaPCustomErr(ctxt,
7991 "The XPath expression of the selector is not valid",
NULL);
7995 xmlNsPtr *nsList =
NULL;
8007 nsList = xmlGetNsList(
attr->doc,
attr->parent);
8011 if (nsList !=
NULL) {
8014 for (
i = 0; nsList[
i] !=
NULL;
i++)
8019 if (nsArray ==
NULL) {
8020 xmlSchemaPErrMemory(ctxt,
"allocating a namespace array",
8026 nsArray[2 *
i] = nsList[
i]->href;
8027 nsArray[2 *
i + 1] = nsList[
i]->prefix;
8036 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8037 NULL, XML_PATTERN_XSFIELD, nsArray);
8039 selector->xpathComp = (
void *) xmlPatterncompile(selector->xpath,
8040 NULL, XML_PATTERN_XSSEL, nsArray);
8041 if (nsArray !=
NULL)
8044 if (selector->xpathComp ==
NULL) {
8045 xmlSchemaPCustomErr(ctxt,
8049 "The XPath expression '%s' could not be "
8050 "compiled", selector->xpath);
8057#define ADD_ANNOTATION(annot) \
8058 xmlSchemaAnnotPtr cur = item->annot; \
8059 if (item->annot == NULL) { \
8060 item->annot = annot; \
8063 cur = item->annot; \
8064 if (cur->next != NULL) { \
8078static xmlSchemaAnnotPtr
8079xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
8080 xmlSchemaAnnotPtr annot)
8082 if ((annItem ==
NULL) || (annot ==
NULL))
8084 switch (annItem->type) {
8085 case XML_SCHEMA_TYPE_ELEMENT: {
8086 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) annItem;
8087 ADD_ANNOTATION(annot)
8090 case XML_SCHEMA_TYPE_ATTRIBUTE: {
8091 xmlSchemaAttributePtr
item = (xmlSchemaAttributePtr) annItem;
8092 ADD_ANNOTATION(annot)
8095 case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
8096 case XML_SCHEMA_TYPE_ANY: {
8097 xmlSchemaWildcardPtr
item = (xmlSchemaWildcardPtr) annItem;
8098 ADD_ANNOTATION(annot)
8101 case XML_SCHEMA_TYPE_PARTICLE:
8102 case XML_SCHEMA_TYPE_IDC_KEY:
8103 case XML_SCHEMA_TYPE_IDC_KEYREF:
8104 case XML_SCHEMA_TYPE_IDC_UNIQUE: {
8105 xmlSchemaAnnotItemPtr
item = (xmlSchemaAnnotItemPtr) annItem;
8106 ADD_ANNOTATION(annot)
8109 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
8110 xmlSchemaAttributeGroupPtr
item =
8111 (xmlSchemaAttributeGroupPtr) annItem;
8112 ADD_ANNOTATION(annot)
8115 case XML_SCHEMA_TYPE_NOTATION: {
8116 xmlSchemaNotationPtr
item = (xmlSchemaNotationPtr) annItem;
8117 ADD_ANNOTATION(annot)
8120 case XML_SCHEMA_FACET_MININCLUSIVE:
8121 case XML_SCHEMA_FACET_MINEXCLUSIVE:
8122 case XML_SCHEMA_FACET_MAXINCLUSIVE:
8123 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
8124 case XML_SCHEMA_FACET_TOTALDIGITS:
8125 case XML_SCHEMA_FACET_FRACTIONDIGITS:
8126 case XML_SCHEMA_FACET_PATTERN:
8127 case XML_SCHEMA_FACET_ENUMERATION:
8128 case XML_SCHEMA_FACET_WHITESPACE:
8129 case XML_SCHEMA_FACET_LENGTH:
8130 case XML_SCHEMA_FACET_MAXLENGTH:
8131 case XML_SCHEMA_FACET_MINLENGTH: {
8132 xmlSchemaFacetPtr
item = (xmlSchemaFacetPtr) annItem;
8133 ADD_ANNOTATION(annot)
8136 case XML_SCHEMA_TYPE_SIMPLE:
8137 case XML_SCHEMA_TYPE_COMPLEX: {
8138 xmlSchemaTypePtr
item = (xmlSchemaTypePtr) annItem;
8139 ADD_ANNOTATION(annot)
8142 case XML_SCHEMA_TYPE_GROUP: {
8143 xmlSchemaModelGroupDefPtr
item = (xmlSchemaModelGroupDefPtr) annItem;
8144 ADD_ANNOTATION(annot)
8147 case XML_SCHEMA_TYPE_SEQUENCE:
8148 case XML_SCHEMA_TYPE_CHOICE:
8149 case XML_SCHEMA_TYPE_ALL: {
8150 xmlSchemaModelGroupPtr
item = (xmlSchemaModelGroupPtr) annItem;
8151 ADD_ANNOTATION(annot)
8155 xmlSchemaPCustomErr(
NULL,
8158 "Internal error: xmlSchemaAddAnnotation, "
8159 "The item is not a annotated schema component",
NULL);
8176static xmlSchemaIDCSelectPtr
8177xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
8178 xmlSchemaIDCPtr idc,
8182 xmlSchemaIDCSelectPtr
item;
8194 xmlSchemaPIllegalAttrErr(ctxt,
8198 xmlSchemaPIllegalAttrErr(ctxt,
8206 item = (xmlSchemaIDCSelectPtr)
xmlMalloc(
sizeof(xmlSchemaIDCSelect));
8208 xmlSchemaPErrMemory(ctxt,
8209 "allocating a 'selector' of an identity-constraint definition",
8217 attr = xmlSchemaGetPropNode(
node,
"xpath");
8219 xmlSchemaPMissingAttrErr(ctxt,
8224 item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8229 if (xmlSchemaCheckCSelectorXPath(ctxt, idc,
item,
attr,
8234 "Internal error: xmlSchemaParseIDCSelectorAndField, "
8235 "validating the XPath expression of a IDC selector.\n",
8245 if (IS_SCHEMA(
child,
"annotation")) {
8249 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
8250 xmlSchemaParseAnnotation(ctxt,
child, 1));
8254 xmlSchemaPContentErr(ctxt,
8257 NULL,
"(annotation?)");
8273static xmlSchemaIDCPtr
8274xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
8277 xmlSchemaTypeType idcCategory,
8278 const xmlChar *targetNamespace)
8294 ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
8296 xmlSchemaPIllegalAttrErr(ctxt,
8300 xmlSchemaPIllegalAttrErr(ctxt,
8308 attr = xmlSchemaGetPropNode(
node,
"name");
8310 xmlSchemaPMissingAttrErr(ctxt,
8315 }
else if (xmlSchemaPValAttrNode(ctxt,
8317 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
8327 if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
8331 attr = xmlSchemaGetPropNode(
node,
"refer");
8333 xmlSchemaPMissingAttrErr(ctxt,
8341 item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
8345 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8347 &(
item->ref->targetNamespace),
8348 &(
item->ref->name));
8350 item->ref->targetNamespace);
8357 if (IS_SCHEMA(
child,
"annotation")) {
8358 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8362 xmlSchemaPContentErr(ctxt,
8365 "A child element is missing",
8366 "(annotation?, (selector, field+))");
8371 if (IS_SCHEMA(
child,
"selector")) {
8372 item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
8378 if (IS_SCHEMA(
child,
"field")) {
8380 field = xmlSchemaParseIDCSelectorAndField(ctxt,
8385 if (lastField !=
NULL)
8386 lastField->next =
field;
8392 }
while (IS_SCHEMA(
child,
"field"));
8394 xmlSchemaPContentErr(ctxt,
8397 NULL,
"(annotation?, (selector, field+))");
8401 xmlSchemaPContentErr(ctxt,
8404 NULL,
"(annotation?, (selector, field+))");
8423static xmlSchemaBasicItemPtr
8424xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8425 xmlNodePtr
node,
int *isElemRef,
int topLevel)
8427 xmlSchemaElementPtr decl =
NULL;
8428 xmlSchemaParticlePtr particle =
NULL;
8429 xmlSchemaAnnotPtr annot =
NULL;
8431 xmlAttrPtr
attr, nameAttr;
8441 if (isElemRef !=
NULL)
8448 nameAttr = xmlSchemaGetPropNode(
node,
"name");
8449 attr = xmlSchemaGetPropNode(
node,
"ref");
8450 if ((topLevel) || (
attr ==
NULL)) {
8451 if (nameAttr ==
NULL) {
8452 xmlSchemaPMissingAttrErr(ctxt,
8462 if (IS_SCHEMA(
child,
"annotation")) {
8463 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
8470 goto declaration_part;
8474 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
8475 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
"(xs:nonNegativeInteger | unbounded)");
8477 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
8478 if (particle ==
NULL)
8485 xmlSchemaQNameRefPtr refer =
NULL;
8489 if (isElemRef !=
NULL)
8492 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8498 if (nameAttr !=
NULL) {
8499 xmlSchemaPMutualExclAttrErr(ctxt,
8518 xmlSchemaPCustomAttrErr(ctxt,
8521 "Only the attributes 'minOccurs', 'maxOccurs' and "
8522 "'id' are allowed in addition to 'ref'");
8526 xmlSchemaPIllegalAttrErr(ctxt,
8538 if ((
min == 0) && (
max == 0))
8543 refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
8547 particle->children = (xmlSchemaTreeItemPtr) refer;
8548 particle->annot = annot;
8553 WXS_ADD_PENDING(ctxt, particle);
8554 return ((xmlSchemaBasicItemPtr) particle);
8562 xmlSchemaIDCPtr curIDC =
NULL, lastIDC =
NULL;
8564 if (xmlSchemaPValAttrNode(ctxt,
NULL, nameAttr,
8565 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0)
8571 ns = ctxt->targetNamespace;
8573 attr = xmlSchemaGetPropNode(
node,
"form");
8575 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8577 ns = ctxt->targetNamespace;
8579 xmlSchemaPSimpleTypeErr(ctxt,
8582 NULL,
"(qualified | unqualified)",
8585 }
else if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
8586 ns = ctxt->targetNamespace;
8588 decl = xmlSchemaAddElement(ctxt,
name,
ns,
node, topLevel);
8606 if (topLevel == 0) {
8611 xmlSchemaPIllegalAttrErr(ctxt,
8618 xmlSchemaPIllegalAttrErr(ctxt,
8624 xmlSchemaPIllegalAttrErr(ctxt,
8636 decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
8637 decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
8638 xmlSchemaPValAttrQName(ctxt,
schema,
8640 &(decl->substGroupNs), &(decl->substGroup));
8641 if (xmlGetBooleanProp(ctxt,
node,
"abstract", 0))
8642 decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
8646 attr = xmlSchemaGetPropNode(
node,
"final");
8648 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
8649 decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
8650 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
8651 decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
8653 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8654 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8656 XML_SCHEMAS_ELEM_FINAL_EXTENSION,
8657 XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
8658 xmlSchemaPSimpleTypeErr(ctxt,
8661 NULL,
"(#all | List of (extension | restriction))",
8669 attr = xmlSchemaGetPropNode(
node,
"block");
8674 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
8675 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
8676 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
8677 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
8678 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
8679 decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
8681 attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8682 if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8684 XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
8685 XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
8686 XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
8687 xmlSchemaPSimpleTypeErr(ctxt,
8690 NULL,
"(#all | List of (extension | "
8691 "restriction | substitution))", attrValue,
8695 if (xmlGetBooleanProp(ctxt,
node,
"nillable", 0))
8696 decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
8698 attr = xmlSchemaGetPropNode(
node,
"type");
8700 xmlSchemaPValAttrNodeQName(ctxt,
schema,
8702 &(decl->namedTypeNs), &(decl->namedType));
8704 attr, decl->namedTypeNs);
8706 decl->value = xmlSchemaGetProp(ctxt,
node,
"default");
8707 attr = xmlSchemaGetPropNode(
node,
"fixed");
8709 fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8710 if (decl->value !=
NULL) {
8715 xmlSchemaPMutualExclAttrErr(ctxt,
8719 decl->flags |= XML_SCHEMAS_ELEM_FIXED;
8720 decl->value =
fixed;
8726 if (IS_SCHEMA(
child,
"complexType")) {
8732 if (decl->namedType !=
NULL) {
8733 xmlSchemaPContentErr(ctxt,
8736 "The attribute 'type' and the <complexType> child are "
8737 "mutually exclusive",
NULL);
8739 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt,
schema,
child, 0);
8741 }
else if (IS_SCHEMA(
child,
"simpleType")) {
8747 if (decl->namedType !=
NULL) {
8748 xmlSchemaPContentErr(ctxt,
8751 "The attribute 'type' and the <simpleType> child are "
8752 "mutually exclusive",
NULL);
8754 WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
8757 while ((IS_SCHEMA(
child,
"unique")) ||
8758 (IS_SCHEMA(
child,
"key")) || (IS_SCHEMA(
child,
"keyref"))) {
8759 if (IS_SCHEMA(
child,
"unique")) {
8761 XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
8762 }
else if (IS_SCHEMA(
child,
"key")) {
8764 XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
8765 }
else if (IS_SCHEMA(
child,
"keyref")) {
8767 XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
8769 if (lastIDC !=
NULL)
8770 lastIDC->next = curIDC;
8772 decl->idcs = (
void *) curIDC;
8777 xmlSchemaPContentErr(ctxt,
8780 NULL,
"(annotation?, ((simpleType | complexType)?, "
8781 "(unique | key | keyref)*))");
8783 decl->annot = annot;
8791 return ((xmlSchemaBasicItemPtr) decl);
8793 particle->children = (xmlSchemaTreeItemPtr) decl;
8794 return ((xmlSchemaBasicItemPtr) particle);
8799 if (annot !=
NULL) {
8800 if (particle !=
NULL)
8801 particle->annot =
NULL;
8804 xmlSchemaFreeAnnot(annot);
8822xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
8825 xmlSchemaTypePtr
type;
8833 type = ctxt->ctxtType;
8837 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
8842 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
8851 xmlSchemaPIllegalAttrErr(ctxt,
8855 xmlSchemaPIllegalAttrErr(ctxt,
8865 attr = xmlSchemaGetPropNode(
node,
"memberTypes");
8869 const xmlChar *localName, *nsName;
8870 xmlSchemaTypeLinkPtr
link, lastLink =
NULL;
8871 xmlSchemaQNameRefPtr
ref;
8873 cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
8887 xmlSchemaPErrMemory(ctxt,
"xmlSchemaParseUnion, "
8888 "duplicating type name",
NULL);
8891 if (xmlSchemaPValAttrNodeQNameValue(ctxt,
schema,
8896 link = (xmlSchemaTypeLinkPtr)
8899 xmlSchemaPErrMemory(ctxt,
"xmlSchemaParseUnion, "
8900 "allocating a type link",
NULL);
8906 if (lastLink ==
NULL)
8909 lastLink->next =
link;
8914 ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
8924 link->type = (xmlSchemaTypePtr)
ref;
8928 }
while (*
cur != 0);
8935 if (IS_SCHEMA(
child,
"annotation")) {
8939 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
8940 xmlSchemaParseAnnotation(ctxt,
child, 1));
8943 if (IS_SCHEMA(
child,
"simpleType")) {
8944 xmlSchemaTypePtr subtype,
last =
NULL;
8950 while (IS_SCHEMA(
child,
"simpleType")) {
8951 subtype = (xmlSchemaTypePtr)
8953 if (subtype !=
NULL) {
8955 type->subtypes = subtype;
8958 last->next = subtype;
8967 xmlSchemaPContentErr(ctxt,
8977 xmlSchemaPCustomErr(ctxt,
8980 "Either the attribute 'memberTypes' or "
8981 "at least one <simpleType> child must be present",
NULL);
8998static xmlSchemaTypePtr
8999xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9002 xmlSchemaTypePtr
type;
9009 type = ctxt->ctxtType;
9013 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
9018 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
9027 xmlSchemaPIllegalAttrErr(ctxt,
9031 xmlSchemaPIllegalAttrErr(ctxt,
9052 if (IS_SCHEMA(
child,
"annotation")) {
9053 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
9054 xmlSchemaParseAnnotation(ctxt,
child, 1));
9057 if (IS_SCHEMA(
child,
"simpleType")) {
9064 xmlSchemaPCustomErr(ctxt,
9067 "The attribute 'itemType' and the <simpleType> child "
9068 "are mutually exclusive",
NULL);
9074 xmlSchemaPCustomErr(ctxt,
9077 "Either the attribute 'itemType' or the <simpleType> child "
9078 "must be present",
NULL);
9081 xmlSchemaPContentErr(ctxt,
9087 (xmlSchemaGetPropNode(
node,
"itemType") ==
NULL)) {
9088 xmlSchemaPCustomErr(ctxt,
9091 "Either the attribute 'itemType' or the <simpleType> child "
9092 "must be present",
NULL);
9109static xmlSchemaTypePtr
9110xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
9111 xmlNodePtr
node,
int topLevel)
9113 xmlSchemaTypePtr
type, oldCtxtType;
9117 int hasRestriction = 0;
9123 attr = xmlSchemaGetPropNode(
node,
"name");
9125 xmlSchemaPMissingAttrErr(ctxt,
9131 if (xmlSchemaPValAttrNode(ctxt,
9133 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
9139 xmlSchemaTypePtr biType;
9141 if (ctxt->isRedefine) {
9149 "Redefinition of built-in simple types is not "
9153 biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
9165 if (topLevel == 0) {
9166#ifdef ENABLE_NAMED_LOCALS
9172#ifdef ENABLE_NAMED_LOCALS
9175 XML_SCHEMA_TYPE_SIMPLE,
9177 ctxt->targetNamespace,
node, 0);
9180 XML_SCHEMA_TYPE_SIMPLE,
9181 NULL, ctxt->targetNamespace,
node, 0);
9185 type->type = XML_SCHEMA_TYPE_SIMPLE;
9186 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9194 xmlSchemaPIllegalAttrErr(ctxt,
9198 xmlSchemaPIllegalAttrErr(ctxt,
9209 type = xmlSchemaAddType(ctxt,
schema, XML_SCHEMA_TYPE_SIMPLE,
9210 attrValue, ctxt->targetNamespace,
node, 1);
9213 type->type = XML_SCHEMA_TYPE_SIMPLE;
9214 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9215 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
9225 xmlSchemaPIllegalAttrErr(ctxt,
9229 xmlSchemaPIllegalAttrErr(ctxt,
9237 attr = xmlSchemaGetPropNode(
node,
"final");
9239 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9240 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
9241 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9242 type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
9243 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9244 type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
9246 attrValue = xmlSchemaGetProp(ctxt,
node,
"final");
9247 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
9248 -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
9249 XML_SCHEMAS_TYPE_FINAL_LIST,
9250 XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
9252 xmlSchemaPSimpleTypeErr(ctxt,
9254 WXS_BASIC_CAST
type, (xmlNodePtr)
attr,
9255 NULL,
"(#all | List of (list | union | restriction)",
9260 type->targetNamespace = ctxt->targetNamespace;
9265 oldCtxtType = ctxt->ctxtType;
9267 ctxt->ctxtType =
type;
9270 if (IS_SCHEMA(
child,
"annotation")) {
9271 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9277 "(annotation?, (restriction | list | union))");
9278 }
else if (IS_SCHEMA(
child,
"restriction")) {
9280 XML_SCHEMA_TYPE_SIMPLE);
9283 }
else if (IS_SCHEMA(
child,
"list")) {
9286 }
else if (IS_SCHEMA(
child,
"union")) {
9293 "(annotation?, (restriction | list | union))");
9302 if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
9304 NULL,
node,
"This is a redefinition, thus the "
9305 "<simpleType> must have a <restriction> child",
NULL);
9308 ctxt->ctxtType = oldCtxtType;
9323static xmlSchemaTreeItemPtr
9324xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
9328 xmlSchemaParticlePtr
item;
9337 attr = xmlSchemaGetPropNode(
node,
"ref");
9339 xmlSchemaPMissingAttrErr(ctxt,
9343 }
else if (xmlSchemaPValAttrNodeQName(ctxt,
schema,
NULL,
9348 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
9349 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
9350 "(xs:nonNegativeInteger | unbounded)");
9361 xmlSchemaPIllegalAttrErr(ctxt,
9365 xmlSchemaPIllegalAttrErr(ctxt,
9378 item->children = (xmlSchemaTreeItemPtr)
9379 xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP,
ref, refNs);
9386 if (IS_SCHEMA(
child,
"annotation")) {
9390 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9394 xmlSchemaPContentErr(ctxt,
9402 if ((
min == 0) && (
max == 0))
9405 return ((xmlSchemaTreeItemPtr)
item);
9425static xmlSchemaModelGroupDefPtr
9426xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
9430 xmlSchemaModelGroupDefPtr
item;
9438 attr = xmlSchemaGetPropNode(
node,
"name");
9440 xmlSchemaPMissingAttrErr(ctxt,
9445 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
9446 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
9450 ctxt->targetNamespace,
node);
9461 xmlSchemaPIllegalAttrErr(ctxt,
9465 xmlSchemaPIllegalAttrErr(ctxt,
9475 if (IS_SCHEMA(
child,
"annotation")) {
9476 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9479 if (IS_SCHEMA(
child,
"all")) {
9481 XML_SCHEMA_TYPE_ALL, 0);
9483 }
else if (IS_SCHEMA(
child,
"choice")) {
9485 XML_SCHEMA_TYPE_CHOICE, 0);
9487 }
else if (IS_SCHEMA(
child,
"sequence")) {
9489 XML_SCHEMA_TYPE_SEQUENCE, 0);
9496 xmlSchemaPContentErr(ctxt,
9499 "(annotation?, (all | choice | sequence)?)");
9512xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr
root)
9514 xmlNodePtr
delete,
cur;
9524 if (
delete !=
NULL) {
9525 xmlUnlinkNode(
delete);
9526 xmlFreeNode(
delete);
9529 if (
cur->type == XML_TEXT_NODE) {
9531 if (xmlNodeGetSpacePreserve(
cur) != 1) {
9535 }
else if ((
cur->type != XML_ELEMENT_NODE) &&
9536 (
cur->type != XML_CDATA_SECTION_NODE)) {
9545 if ((
cur->children->type != XML_ENTITY_DECL) &&
9546 (
cur->children->type != XML_ENTITY_REF_NODE) &&
9547 (
cur->children->type != XML_ENTITY_NODE)) {
9572 if (
delete !=
NULL) {
9573 xmlUnlinkNode(
delete);
9574 xmlFreeNode(
delete);
9581xmlSchemaClearSchemaDefaults(xmlSchemaPtr
schema)
9583 if (
schema->flags & XML_SCHEMAS_QUALIF_ELEM)
9584 schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
9586 if (
schema->flags & XML_SCHEMAS_QUALIF_ATTR)
9587 schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
9589 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
9590 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
9591 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9592 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
9593 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9594 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
9595 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9596 schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
9598 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
9599 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
9600 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
9601 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
9602 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
9603 schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
9607xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
9613 int res = 0, oldErrs = ctxt->nberrors;
9635 attr = xmlSchemaGetPropNode(
node,
"targetNamespace");
9638 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
NULL);
9645 attr = xmlSchemaGetPropNode(
node,
"elementFormDefault");
9647 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9648 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9649 XML_SCHEMAS_QUALIF_ELEM);
9652 xmlSchemaPSimpleTypeErr(ctxt,
9658 attr = xmlSchemaGetPropNode(
node,
"attributeFormDefault");
9660 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9661 res = xmlSchemaPValAttrFormDefault(
val, &
schema->flags,
9662 XML_SCHEMAS_QUALIF_ATTR);
9665 xmlSchemaPSimpleTypeErr(ctxt,
9671 attr = xmlSchemaGetPropNode(
node,
"finalDefault");
9673 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9674 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9675 XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
9676 XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
9678 XML_SCHEMAS_FINAL_DEFAULT_LIST,
9679 XML_SCHEMAS_FINAL_DEFAULT_UNION);
9682 xmlSchemaPSimpleTypeErr(ctxt,
9685 "(#all | List of (extension | restriction | list | union))",
9689 attr = xmlSchemaGetPropNode(
node,
"blockDefault");
9691 val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr)
attr);
9692 res = xmlSchemaPValAttrBlockFinal(
val, &(
schema->flags), -1,
9693 XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
9694 XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
9695 XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
9698 xmlSchemaPSimpleTypeErr(ctxt,
9701 "(#all | List of (extension | restriction | substitution))",
9707 if (oldErrs != ctxt->nberrors)
9724xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
9725 xmlSchemaPtr
schema, xmlNodePtr nodes)
9728 xmlSchemaAnnotPtr annot;
9729 int res = 0, oldErrs, tmpOldErrs;
9734 oldErrs = ctxt->nberrors;
9736 while ((IS_SCHEMA(
child,
"include")) ||
9737 (IS_SCHEMA(
child,
"import")) ||
9738 (IS_SCHEMA(
child,
"redefine")) ||
9739 (IS_SCHEMA(
child,
"annotation"))) {
9740 if (IS_SCHEMA(
child,
"annotation")) {
9741 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9745 xmlSchemaFreeAnnot(annot);
9746 }
else if (IS_SCHEMA(
child,
"import")) {
9747 tmpOldErrs = ctxt->nberrors;
9751 if (tmpOldErrs != ctxt->nberrors)
9753 }
else if (IS_SCHEMA(
child,
"include")) {
9754 tmpOldErrs = ctxt->nberrors;
9758 if (tmpOldErrs != ctxt->nberrors)
9760 }
else if (IS_SCHEMA(
child,
"redefine")) {
9761 tmpOldErrs = ctxt->nberrors;
9765 if (tmpOldErrs != ctxt->nberrors)
9775 if (IS_SCHEMA(
child,
"complexType")) {
9776 xmlSchemaParseComplexType(ctxt,
schema,
child, 1);
9778 }
else if (IS_SCHEMA(
child,
"simpleType")) {
9781 }
else if (IS_SCHEMA(
child,
"element")) {
9784 }
else if (IS_SCHEMA(
child,
"attribute")) {
9785 xmlSchemaParseGlobalAttribute(ctxt,
schema,
child);
9787 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
9788 xmlSchemaParseAttributeGroupDefinition(ctxt,
schema,
child);
9790 }
else if (IS_SCHEMA(
child,
"group")) {
9791 xmlSchemaParseModelGroupDefinition(ctxt,
schema,
child);
9793 }
else if (IS_SCHEMA(
child,
"notation")) {
9797 xmlSchemaPContentErr(ctxt,
9800 NULL,
"((include | import | redefine | annotation)*, "
9801 "(((simpleType | complexType | group | attributeGroup) "
9802 "| element | attribute | notation), annotation*)*)");
9805 while (IS_SCHEMA(
child,
"annotation")) {
9809 annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
9813 xmlSchemaFreeAnnot(annot);
9818 ctxt->ctxtType =
NULL;
9819 if (oldErrs != ctxt->nberrors)
9826static xmlSchemaSchemaRelationPtr
9827xmlSchemaSchemaRelationCreate(
void)
9829 xmlSchemaSchemaRelationPtr
ret;
9831 ret = (xmlSchemaSchemaRelationPtr)
9832 xmlMalloc(
sizeof(xmlSchemaSchemaRelation));
9834 xmlSchemaPErrMemory(
NULL,
"allocating schema relation",
NULL);
9837 memset(
ret, 0,
sizeof(xmlSchemaSchemaRelation));
9843xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
9850xmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
9852 xmlSchemaRedefPtr prev;
9854 while (redef !=
NULL) {
9856 redef = redef->next;
9862xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
9870 if (con->buckets !=
NULL)
9871 xmlSchemaItemListFree(con->buckets);
9872 if (con->pending !=
NULL)
9873 xmlSchemaItemListFree(con->pending);
9874 if (con->substGroups !=
NULL)
9875 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
9876 if (con->redefs !=
NULL)
9877 xmlSchemaRedefListFree(con->redefs);
9878 if (con->dict !=
NULL)
9883static xmlSchemaConstructionCtxtPtr
9884xmlSchemaConstructionCtxtCreate(
xmlDictPtr dict)
9886 xmlSchemaConstructionCtxtPtr
ret;
9888 ret = (xmlSchemaConstructionCtxtPtr)
9889 xmlMalloc(
sizeof(xmlSchemaConstructionCtxt));
9891 xmlSchemaPErrMemory(
NULL,
9892 "allocating schema construction context",
NULL);
9895 memset(
ret, 0,
sizeof(xmlSchemaConstructionCtxt));
9897 ret->buckets = xmlSchemaItemListCreate();
9899 xmlSchemaPErrMemory(
NULL,
9900 "allocating list of schema buckets",
NULL);
9904 ret->pending = xmlSchemaItemListCreate();
9906 xmlSchemaPErrMemory(
NULL,
9907 "allocating list of pending global components",
NULL);
9908 xmlSchemaConstructionCtxtFree(
ret);
9916static xmlSchemaParserCtxtPtr
9917xmlSchemaParserCtxtCreate(
void)
9919 xmlSchemaParserCtxtPtr
ret;
9921 ret = (xmlSchemaParserCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaParserCtxt));
9923 xmlSchemaPErrMemory(
NULL,
"allocating schema parser context",
9927 memset(
ret, 0,
sizeof(xmlSchemaParserCtxt));
9928 ret->type = XML_SCHEMA_CTXT_PARSER;
9929 ret->attrProhibs = xmlSchemaItemListCreate();
9930 if (
ret->attrProhibs ==
NULL) {
9947static xmlSchemaParserCtxtPtr
9948xmlSchemaNewParserCtxtUseDict(
const char *URL,
xmlDictPtr dict)
9950 xmlSchemaParserCtxtPtr
ret;
9952 ret = xmlSchemaParserCtxtCreate();
9963xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
9965 if (vctxt->pctxt ==
NULL) {
9966 if (vctxt->schema !=
NULL)
9968 xmlSchemaNewParserCtxtUseDict(
"*", vctxt->schema->dict);
9970 vctxt->pctxt = xmlSchemaNewParserCtxt(
"*");
9971 if (vctxt->pctxt ==
NULL) {
9972 VERROR_INT(
"xmlSchemaCreatePCtxtOnVCtxt",
9973 "failed to create a temp. parser context");
9977 xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
9978 vctxt->warning, vctxt->errCtxt);
9979 xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
9995static xmlSchemaBucketPtr
9996xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
9997 const xmlChar *schemaLocation)
9999 xmlSchemaBucketPtr
cur;
10000 xmlSchemaItemListPtr
list;
10002 list = pctxt->constructor->buckets;
10003 if (
list->nbItems == 0)
10007 for (
i = 0;
i <
list->nbItems;
i++) {
10008 cur = (xmlSchemaBucketPtr)
list->items[
i];
10010 if (
cur->schemaLocation == schemaLocation)
10017static xmlSchemaBucketPtr
10018xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10019 const xmlChar *schemaLocation,
10020 const xmlChar *targetNamespace)
10022 xmlSchemaBucketPtr
cur;
10023 xmlSchemaItemListPtr
list;
10025 list = pctxt->constructor->buckets;
10026 if (
list->nbItems == 0)
10030 for (
i = 0;
i <
list->nbItems;
i++) {
10031 cur = (xmlSchemaBucketPtr)
list->items[
i];
10033 if ((
cur->origTargetNamespace ==
NULL) &&
10034 (
cur->schemaLocation == schemaLocation) &&
10035 (
cur->targetNamespace == targetNamespace))
10043#define IS_BAD_SCHEMA_DOC(b) \
10044 (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
10046static xmlSchemaBucketPtr
10047xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
10048 const xmlChar *targetNamespace,
10051 xmlSchemaBucketPtr
cur;
10052 xmlSchemaItemListPtr
list;
10054 list = pctxt->constructor->buckets;
10055 if (
list->nbItems == 0)
10059 for (
i = 0;
i <
list->nbItems;
i++) {
10060 cur = (xmlSchemaBucketPtr)
list->items[
i];
10061 if ((! IS_BAD_SCHEMA_DOC(
cur)) &&
10062 (
cur->origTargetNamespace == targetNamespace) &&
10063 ((imported &&
cur->imported) ||
10064 ((!imported) && (!
cur->imported))))
10072xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
10074 xmlSchemaBucketPtr bucket)
10080 xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
10088 oldFlags =
schema->flags;
10091 xmlSchemaClearSchemaDefaults(
schema);
10092 schema->doc = bucket->doc;
10098 pctxt->targetNamespace = bucket->targetNamespace;
10099 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
10101 if ((bucket->targetNamespace !=
NULL) &&
10102 xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
10111 node = xmlDocGetRootElement(bucket->doc);
10118 oldErrs = pctxt->nberrors;
10119 ret = xmlSchemaParseSchemaTopLevel(pctxt,
schema,
node->children);
10127 if ((
ret == 0) && (oldErrs != pctxt->nberrors)) {
10133 WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
10136 schema->flags = oldFlags;
10141xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
10143 xmlSchemaBucketPtr bucket)
10145 xmlSchemaParserCtxtPtr newpctxt;
10148 if (bucket ==
NULL)
10150 if (bucket->parsed) {
10151 PERROR_INT(
"xmlSchemaParseNewDoc",
10152 "reparsing a schema doc");
10155 if (bucket->doc ==
NULL) {
10156 PERROR_INT(
"xmlSchemaParseNewDoc",
10157 "parsing a schema doc, but there's no doc");
10160 if (pctxt->constructor ==
NULL) {
10161 PERROR_INT(
"xmlSchemaParseNewDoc",
10166 newpctxt = xmlSchemaNewParserCtxtUseDict(
10167 (
const char *) bucket->schemaLocation, pctxt->dict);
10168 if (newpctxt ==
NULL)
10170 newpctxt->constructor = pctxt->constructor;
10176 newpctxt->schema =
schema;
10177 xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
10179 xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
10181 newpctxt->counter = pctxt->counter;
10184 res = xmlSchemaParseNewDocWithContext(newpctxt,
schema, bucket);
10189 pctxt->nberrors += newpctxt->nberrors;
10190 pctxt->counter = newpctxt->counter;
10191 newpctxt->constructor =
NULL;
10193 xmlSchemaFreeParserCtxt(newpctxt);
10198xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
10199 xmlSchemaSchemaRelationPtr rel)
10201 xmlSchemaSchemaRelationPtr
cur = bucket->relations;
10204 bucket->relations = rel;
10215 xmlNodePtr ctxtNode)
10221 if (ctxtNode ==
NULL)
10227 base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
10259xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
10261 const xmlChar *schemaLocation,
10262 xmlDocPtr schemaDoc,
10263 const char *schemaBuffer,
10264 int schemaBufferLen,
10265 xmlNodePtr invokingNode,
10266 const xmlChar *sourceTargetNamespace,
10267 const xmlChar *importNamespace,
10268 xmlSchemaBucketPtr *bucket)
10271 xmlSchemaSchemaRelationPtr relation =
NULL;
10272 xmlDocPtr doc =
NULL;
10273 int res = 0,
err = 0, located = 0, preserveDoc = 0;
10274 xmlSchemaBucketPtr bkt =
NULL;
10276 if (bucket !=
NULL)
10280 case XML_SCHEMA_SCHEMA_IMPORT:
10281 case XML_SCHEMA_SCHEMA_MAIN:
10284 case XML_SCHEMA_SCHEMA_INCLUDE:
10287 case XML_SCHEMA_SCHEMA_REDEFINE:
10297 if ((
type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
10301 if (schemaLocation !=
NULL) {
10302 bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
10303 if ((bkt !=
NULL) &&
10304 (pctxt->constructor->bucket == bkt)) {
10307 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10308 invokingNode,
NULL,
10309 "The schema must not import/include/redefine itself",
10317 relation = xmlSchemaSchemaRelationCreate();
10318 if (relation ==
NULL)
10320 xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
10322 relation->type =
type;
10327 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10328 relation->importNamespace = importNamespace;
10329 if (schemaLocation ==
NULL) {
10337 targetNamespace = importNamespace;
10342 if ((WXS_IS_BUCKET_IMPMAIN(
type)) && (! bkt->imported)) {
10347 if (schemaLocation ==
NULL)
10348 schemaLocation =
BAD_CAST "in_memory_buffer";
10350 bkt->schemaLocation)) {
10351 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10352 invokingNode,
NULL,
10353 "The schema document '%s' cannot be imported, since "
10354 "it was already included or redefined",
10355 schemaLocation,
NULL);
10358 }
else if ((! WXS_IS_BUCKET_IMPMAIN(
type)) && (bkt->imported)) {
10364 if (schemaLocation ==
NULL)
10365 schemaLocation =
BAD_CAST "in_memory_buffer";
10367 bkt->schemaLocation)) {
10368 xmlSchemaCustomErr(ACTXT_CAST pctxt,
err,
10369 invokingNode,
NULL,
10370 "The schema document '%s' cannot be included or "
10371 "redefined, since it was already imported",
10372 schemaLocation,
NULL);
10378 if (WXS_IS_BUCKET_IMPMAIN(
type)) {
10400 relation->bucket = bkt;
10403 bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
10404 importNamespace, 1);
10407 relation->bucket = bkt;
10408 if (bkt->schemaLocation ==
NULL) {
10410 bkt->schemaLocation = schemaLocation;
10413 bkt->schemaLocation)) {
10419 if (schemaLocation ==
NULL)
10420 schemaLocation =
BAD_CAST "in_memory_buffer";
10422 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10424 invokingNode,
NULL,
10425 "Skipping import of schema located at '%s' for the "
10426 "namespace '%s', since this namespace was already "
10427 "imported with the schema located at '%s'",
10428 schemaLocation, importNamespace, bkt->schemaLocation);
10441 if ((bkt->origTargetNamespace ==
NULL) &&
10442 (bkt->targetNamespace != sourceTargetNamespace)) {
10443 xmlSchemaBucketPtr chamel;
10462 chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
10463 schemaLocation, sourceTargetNamespace);
10464 if (chamel !=
NULL) {
10466 relation->bucket = chamel;
10478 relation->bucket = bkt;
10483 if ((bkt !=
NULL) && (bkt->doc !=
NULL)) {
10484 PERROR_INT(
"xmlSchemaAddSchemaDoc",
10485 "trying to load a schema doc, but a doc is already "
10486 "assigned to the schema bucket");
10494 if (schemaDoc !=
NULL) {
10499 if (schemaDoc->URL !=
NULL)
10501 schemaDoc->URL, -1);
10503 schemaLocation =
BAD_CAST "in_memory_buffer";
10504 }
else if ((schemaLocation !=
NULL) || (schemaBuffer !=
NULL)) {
10505 xmlParserCtxtPtr parserCtxt;
10508 if (parserCtxt ==
NULL) {
10509 xmlSchemaPErrMemory(
NULL,
"xmlSchemaGetDoc, "
10510 "allocating a parser context",
NULL);
10513 if ((pctxt->dict !=
NULL) && (parserCtxt->dict !=
NULL)) {
10519 parserCtxt->dict = pctxt->dict;
10522 if (schemaLocation !=
NULL) {
10525 NULL, SCHEMAS_PARSE_OPTIONS);
10526 }
else if (schemaBuffer !=
NULL) {
10529 NULL,
NULL, SCHEMAS_PARSE_OPTIONS);
10530 schemaLocation =
BAD_CAST "in_memory_buffer";
10563 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10564 invokingNode,
NULL,
10565 "Failed to parse the XML resource '%s'",
10566 schemaLocation,
NULL);
10570 if ((doc ==
NULL) && located)
10573 xmlSchemaPErr(pctxt,
NULL,
10575 "No information for parsing was provided with the "
10576 "given schema parser context.\n",
10584 xmlNodePtr docElem =
NULL;
10587 docElem = xmlDocGetRootElement(doc);
10588 if (docElem ==
NULL) {
10590 invokingNode,
NULL,
10591 "The document '%s' has no document element",
10592 schemaLocation,
NULL);
10598 xmlSchemaCleanupDoc(pctxt, docElem);
10602 if (!IS_SCHEMA(docElem,
"schema")) {
10604 invokingNode,
NULL,
10605 "The XML document '%s' is not a schema document",
10606 schemaLocation,
NULL);
10613 targetNamespace = xmlSchemaGetProp(pctxt, docElem,
10614 "targetNamespace");
10618 if ((bkt ==
NULL) && located) {
10620 bkt = xmlSchemaBucketCreate(pctxt,
type,
10626 bkt->schemaLocation = schemaLocation;
10627 bkt->located = located;
10630 bkt->targetNamespace = targetNamespace;
10631 bkt->origTargetNamespace = targetNamespace;
10633 bkt->preserveDoc = 1;
10635 if (WXS_IS_BUCKET_IMPMAIN(
type))
10640 if (relation !=
NULL)
10641 relation->bucket = bkt;
10649 if (bucket !=
NULL)
10654 if ((doc !=
NULL) && (! preserveDoc)) {
10659 return(pctxt->err);
10662 if ((doc !=
NULL) && (! preserveDoc)) {
10683xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
10688 const xmlChar *thisTargetNamespace;
10691 xmlSchemaBucketPtr bucket =
NULL;
10705 xmlSchemaPIllegalAttrErr(pctxt,
10709 xmlSchemaPIllegalAttrErr(pctxt,
10717 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10718 "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10719 &namespaceName) != 0) {
10720 xmlSchemaPSimpleTypeErr(pctxt,
10723 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10725 return (pctxt->err);
10728 if (xmlSchemaPValAttr(pctxt,
NULL,
node,
10729 "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10730 &schemaLocation) != 0) {
10731 xmlSchemaPSimpleTypeErr(pctxt,
10734 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10736 return (pctxt->err);
10742 if (IS_SCHEMA(
child,
"annotation")) {
10750 xmlSchemaPContentErr(pctxt,
10763 thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
10764 if (namespaceName !=
NULL) {
10770 if (
xmlStrEqual(thisTargetNamespace, namespaceName)) {
10771 xmlSchemaPCustomErr(pctxt,
10774 "The value of the attribute 'namespace' must not match "
10775 "the target namespace '%s' of the importing schema",
10776 thisTargetNamespace);
10777 return (pctxt->err);
10784 if (thisTargetNamespace ==
NULL) {
10785 xmlSchemaPCustomErr(pctxt,
10788 "The attribute 'namespace' must be existent if "
10789 "the importing schema has no target namespace",
10791 return (pctxt->err);
10797 if (schemaLocation !=
NULL)
10798 schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
10799 schemaLocation,
node);
10800 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
10801 schemaLocation,
NULL,
NULL, 0,
node, thisTargetNamespace,
10802 namespaceName, &bucket);
10814 if ((bucket ==
NULL) && (schemaLocation !=
NULL)) {
10815 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10818 "Failed to locate a schema at location '%s'. "
10819 "Skipping the import", schemaLocation,
NULL,
NULL);
10822 if ((bucket !=
NULL) && CAN_PARSE_SCHEMA(bucket)) {
10823 ret = xmlSchemaParseNewDoc(pctxt,
schema, bucket);
10830xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
10839 (schemaLocation ==
NULL))
10842 *schemaLocation =
NULL;
10852 xmlSchemaPIllegalAttrErr(pctxt,
10856 xmlSchemaPIllegalAttrErr(pctxt,
10869 attr = xmlSchemaGetPropNode(
node,
"schemaLocation");
10874 if (xmlSchemaPValAttrNode(pctxt,
NULL,
attr,
10875 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10876 (
const xmlChar **) schemaLocation) != 0)
10886 PERROR_INT(
"xmlSchemaParseIncludeOrRedefine",
10887 "could not build an URI from the schemaLocation")
10893 xmlSchemaPMissingAttrErr(pctxt,
10902 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
10903 xmlSchemaPCustomErr(pctxt,
10906 "The schema document '%s' cannot redefine itself.",
10909 xmlSchemaPCustomErr(pctxt,
10912 "The schema document '%s' cannot include itself.",
10920 return(pctxt->err);
10926xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
10934 int isChameleon = 0, wasChameleon = 0;
10935 xmlSchemaBucketPtr bucket =
NULL;
10944 res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt,
schema,
10951 res = xmlSchemaAddSchemaDoc(pctxt,
type, schemaLocation,
NULL,
10952 NULL, 0,
node, pctxt->targetNamespace,
NULL, &bucket);
10960 if ((bucket ==
NULL) || (bucket->doc ==
NULL)) {
10961 if (
type == XML_SCHEMA_SCHEMA_INCLUDE) {
10974 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10976 "Failed to load the document '%s' for inclusion",
10977 schemaLocation,
NULL);
10991 xmlSchemaCustomErr(ACTXT_CAST pctxt,
res,
10993 "Failed to load the document '%s' for redefinition",
10994 schemaLocation,
NULL);
11002 if (bucket->origTargetNamespace !=
NULL) {
11009 if (pctxt->targetNamespace ==
NULL) {
11010 xmlSchemaCustomErr(ACTXT_CAST pctxt,
11013 "The target namespace of the included/redefined schema "
11014 "'%s' has to be absent, since the including/redefining "
11015 "schema has no target namespace",
11016 schemaLocation,
NULL);
11018 }
else if (!
xmlStrEqual(bucket->origTargetNamespace,
11019 pctxt->targetNamespace)) {
11021 xmlSchemaPCustomErrExt(pctxt,
11024 "The target namespace '%s' of the included/redefined "
11025 "schema '%s' differs from '%s' of the "
11026 "including/redefining schema",
11027 bucket->origTargetNamespace, schemaLocation,
11028 pctxt->targetNamespace);
11031 }
else if (pctxt->targetNamespace !=
NULL) {
11037 bucket->targetNamespace = pctxt->targetNamespace;
11043 if (bucket && (!bucket->parsed) && (bucket->doc !=
NULL)) {
11046 if ((
schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
11047 schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11051 xmlSchemaParseNewDoc(pctxt,
schema, bucket);
11053 if (isChameleon && (!wasChameleon))
11054 schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11060 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11064 pctxt->redefined = bucket;
11068 pctxt->isRedefine = 1;
11069 while (IS_SCHEMA(
child,
"annotation") ||
11070 IS_SCHEMA(
child,
"simpleType") ||
11071 IS_SCHEMA(
child,
"complexType") ||
11072 IS_SCHEMA(
child,
"group") ||
11073 IS_SCHEMA(
child,
"attributeGroup")) {
11074 if (IS_SCHEMA(
child,
"annotation")) {
11078 }
else if (IS_SCHEMA(
child,
"simpleType")) {
11079 xmlSchemaParseSimpleType(pctxt,
schema,
child, 1);
11080 }
else if (IS_SCHEMA(
child,
"complexType")) {
11081 xmlSchemaParseComplexType(pctxt,
schema,
child, 1);
11083 }
else if (IS_SCHEMA(
child,
"group")) {
11085 xmlSchemaParseModelGroupDefinition(pctxt,
11087 }
else if (IS_SCHEMA(
child,
"attributeGroup")) {
11089 xmlSchemaParseAttributeGroupDefinition(pctxt,
schema,
11094 pctxt->redefined =
NULL;
11095 pctxt->isRedefine = 0;
11097 if (IS_SCHEMA(
child,
"annotation")) {
11106 if (
type == XML_SCHEMA_SCHEMA_REDEFINE) {
11107 xmlSchemaPContentErr(pctxt,
res,
11109 "(annotation | (simpleType | complexType | group | attributeGroup))*");
11111 xmlSchemaPContentErr(pctxt,
res,
11119 return(pctxt->err);
11123xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11127#ifndef ENABLE_REDEFINE
11132 XML_SCHEMA_SCHEMA_REDEFINE);
11139xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr
schema,
11145 XML_SCHEMA_SCHEMA_INCLUDE);
11176static xmlSchemaTreeItemPtr
11177xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11178 xmlNodePtr
node, xmlSchemaTypeType
type,
11181 xmlSchemaModelGroupPtr
item;
11182 xmlSchemaParticlePtr particle =
NULL;
11185 int min = 1,
max = 1, isElemRef, hasRefs = 0;
11196 if (withParticle) {
11197 if (
type == XML_SCHEMA_TYPE_ALL) {
11198 min = xmlGetMinOccurs(ctxt,
node, 0, 1, 1,
"(0 | 1)");
11199 max = xmlGetMaxOccurs(ctxt,
node, 1, 1, 1,
"1");
11202 min = xmlGetMinOccurs(ctxt,
node, 0, -1, 1,
"xs:nonNegativeInteger");
11203 max = xmlGetMaxOccurs(ctxt,
node, 0, UNBOUNDED, 1,
11204 "(xs:nonNegativeInteger | unbounded)");
11210 particle = xmlSchemaAddParticle(ctxt,
node,
min,
max);
11211 if (particle ==
NULL)
11213 particle->children = (xmlSchemaTreeItemPtr)
item;
11223 xmlSchemaPIllegalAttrErr(ctxt,
11227 xmlSchemaPIllegalAttrErr(ctxt,
11240 xmlSchemaPIllegalAttrErr(ctxt,
11244 xmlSchemaPIllegalAttrErr(ctxt,
11259 if (IS_SCHEMA(
child,
"annotation")) {
11260 item->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
11263 if (
type == XML_SCHEMA_TYPE_ALL) {
11264 xmlSchemaParticlePtr part,
last =
NULL;
11266 while (IS_SCHEMA(
child,
"element")) {
11267 part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
11274 if (part !=
NULL) {
11277 if (part->minOccurs > 1) {
11278 xmlSchemaPCustomErr(ctxt,
11281 "Invalid value for minOccurs (must be 0 or 1)",
11284 part->minOccurs = 1;
11286 if (part->maxOccurs > 1) {
11287 xmlSchemaPCustomErr(ctxt,
11290 "Invalid value for maxOccurs (must be 0 or 1)",
11293 part->maxOccurs = 1;
11296 item->children = (xmlSchemaTreeItemPtr) part;
11298 last->next = (xmlSchemaTreeItemPtr) part;
11304 xmlSchemaPContentErr(ctxt,
11307 "(annotation?, (annotation?, element*)");
11313 while ((IS_SCHEMA(
child,
"element")) ||
11314 (IS_SCHEMA(
child,
"group")) ||
11315 (IS_SCHEMA(
child,
"any")) ||
11316 (IS_SCHEMA(
child,
"choice")) ||
11317 (IS_SCHEMA(
child,
"sequence"))) {
11319 if (IS_SCHEMA(
child,
"element")) {
11320 part = (xmlSchemaTreeItemPtr)
11321 xmlSchemaParseElement(ctxt,
schema,
child, &isElemRef, 0);
11322 if (part && isElemRef)
11324 }
else if (IS_SCHEMA(
child,
"group")) {
11326 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11332 if (ctxt->isRedefine && ctxt->redef &&
11333 (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
11334 part && part->children)
11336 if ((xmlSchemaGetQNameRefName(part->children) ==
11337 ctxt->redef->refName) &&
11338 (xmlSchemaGetQNameRefTargetNs(part->children) ==
11339 ctxt->redef->refTargetNs))
11350 if (ctxt->redefCounter != 0) {
11353 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11355 "The redefining model group definition "
11356 "'%s' must not contain more than one "
11357 "reference to the redefined definition",
11358 xmlSchemaFormatQName(&
str,
11359 ctxt->redef->refTargetNs,
11360 ctxt->redef->refName),
11364 }
else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
11365 ((WXS_PARTICLE(part))->maxOccurs != 1))
11374 xmlSchemaCustomErr(ACTXT_CAST ctxt,
11376 "The redefining model group definition "
11377 "'%s' must not contain a reference to the "
11378 "redefined definition with a "
11379 "maxOccurs/minOccurs other than 1",
11380 xmlSchemaFormatQName(&
str,
11381 ctxt->redef->refTargetNs,
11382 ctxt->redef->refName),
11387 ctxt->redef->reference = WXS_BASIC_CAST part;
11388 ctxt->redefCounter++;
11391 }
else if (IS_SCHEMA(
child,
"any")) {
11392 part = (xmlSchemaTreeItemPtr)
11394 }
else if (IS_SCHEMA(
child,
"choice")) {
11395 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11396 XML_SCHEMA_TYPE_CHOICE, 1);
11397 }
else if (IS_SCHEMA(
child,
"sequence")) {
11398 part = xmlSchemaParseModelGroup(ctxt,
schema,
child,
11399 XML_SCHEMA_TYPE_SEQUENCE, 1);
11401 if (part !=
NULL) {
11403 item->children = part;
11411 xmlSchemaPContentErr(ctxt,
11414 "(annotation?, (element | group | choice | sequence | any)*)");
11417 if ((
max == 0) && (
min == 0))
11423 WXS_ADD_PENDING(ctxt,
item);
11426 return ((xmlSchemaTreeItemPtr) particle);
11428 return ((xmlSchemaTreeItemPtr)
item);
11442static xmlSchemaTypePtr
11443xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11444 xmlNodePtr
node, xmlSchemaTypeType parentType)
11446 xmlSchemaTypePtr
type;
11453 type = ctxt->ctxtType;
11454 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
11464 xmlSchemaPIllegalAttrErr(ctxt,
11468 xmlSchemaPIllegalAttrErr(ctxt,
11490 &(
type->baseNs), &(
type->base)) == 0)
11492 if ((
type->base ==
NULL) && (
type->type == XML_SCHEMA_TYPE_COMPLEX)) {
11493 xmlSchemaPMissingAttrErr(ctxt,
11496 }
else if ((ctxt->isRedefine) &&
11497 (
type->flags & XML_SCHEMAS_TYPE_GLOBAL))
11500 xmlSchemaPMissingAttrErr(ctxt,
11515 NULL,
node,
"This is a redefinition, but the QName "
11516 "value '%s' of the 'base' attribute does not match the "
11517 "type's designation '%s'",
11518 xmlSchemaFormatQName(&
str1,
type->baseNs,
type->base),
11519 xmlSchemaFormatQName(&
str2,
type->targetNamespace,
11521 FREE_AND_NULL(
str1);
11522 FREE_AND_NULL(
str2);
11533 if (IS_SCHEMA(
child,
"annotation")) {
11537 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11538 xmlSchemaParseAnnotation(ctxt,
child, 1));
11541 if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
11545 if (IS_SCHEMA(
child,
"simpleType")) {
11552 xmlSchemaPContentErr(ctxt,
11555 "The attribute 'base' and the <simpleType> child are "
11556 "mutually exclusive",
NULL);
11558 type->baseType = (xmlSchemaTypePtr)
11559 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11563 xmlSchemaPContentErr(ctxt,
11566 "Either the attribute 'base' or a <simpleType> child "
11567 "must be present",
NULL);
11569 }
else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11576 if (IS_SCHEMA(
child,
"all")) {
11577 type->subtypes = (xmlSchemaTypePtr)
11579 XML_SCHEMA_TYPE_ALL, 1);
11581 }
else if (IS_SCHEMA(
child,
"choice")) {
11582 type->subtypes = (xmlSchemaTypePtr)
11583 xmlSchemaParseModelGroup(ctxt,
11586 }
else if (IS_SCHEMA(
child,
"sequence")) {
11587 type->subtypes = (xmlSchemaTypePtr)
11589 XML_SCHEMA_TYPE_SEQUENCE, 1);
11594 }
else if (IS_SCHEMA(
child,
"group")) {
11595 type->subtypes = (xmlSchemaTypePtr)
11596 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11603 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11610 if (IS_SCHEMA(
child,
"simpleType")) {
11615 type->contentTypeDef = (xmlSchemaTypePtr)
11616 xmlSchemaParseSimpleType(ctxt,
schema,
child, 0);
11617 if (
type->contentTypeDef ==
NULL)
11623 if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
11624 (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
11625 xmlSchemaFacetPtr facet, lastfacet =
NULL;
11639 while ((IS_SCHEMA(
child,
"minInclusive")) ||
11640 (IS_SCHEMA(
child,
"minExclusive")) ||
11641 (IS_SCHEMA(
child,
"maxInclusive")) ||
11642 (IS_SCHEMA(
child,
"maxExclusive")) ||
11643 (IS_SCHEMA(
child,
"totalDigits")) ||
11644 (IS_SCHEMA(
child,
"fractionDigits")) ||
11645 (IS_SCHEMA(
child,
"pattern")) ||
11646 (IS_SCHEMA(
child,
"enumeration")) ||
11647 (IS_SCHEMA(
child,
"whiteSpace")) ||
11648 (IS_SCHEMA(
child,
"length")) ||
11649 (IS_SCHEMA(
child,
"maxLength")) ||
11650 (IS_SCHEMA(
child,
"minLength"))) {
11651 facet = xmlSchemaParseFacet(ctxt,
schema,
child);
11652 if (facet !=
NULL) {
11653 if (lastfacet ==
NULL)
11654 type->facets = facet;
11656 lastfacet->next = facet;
11658 lastfacet->next =
NULL;
11666 xmlSchemaFacetLinkPtr facetLink, lastFacetLink =
NULL;
11668 facet =
type->facets;
11670 facetLink = (xmlSchemaFacetLinkPtr)
11672 if (facetLink ==
NULL) {
11673 xmlSchemaPErrMemory(ctxt,
"allocating a facet link",
NULL);
11677 facetLink->facet = facet;
11678 facetLink->next =
NULL;
11679 if (lastFacetLink ==
NULL)
11680 type->facetSet = facetLink;
11682 lastFacetLink->
next = facetLink;
11683 lastFacetLink = facetLink;
11684 facet = facet->next;
11685 }
while (facet !=
NULL);
11688 if (
type->type == XML_SCHEMA_TYPE_COMPLEX) {
11692 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11693 (xmlSchemaItemListPtr *) &(
type->attrUses),
11694 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
11699 if (IS_SCHEMA(
child,
"anyAttribute")) {
11700 type->attributeWildcard =
11706 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11707 xmlSchemaPContentErr(ctxt,
11710 "annotation?, (group | all | choice | sequence)?, "
11711 "((attribute | attributeGroup)*, anyAttribute?))");
11712 }
else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11713 xmlSchemaPContentErr(ctxt,
11716 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11717 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11718 "length | minLength | maxLength | enumeration | whiteSpace | "
11719 "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
11722 xmlSchemaPContentErr(ctxt,
11725 "(annotation?, (simpleType?, (minExclusive | minInclusive | "
11726 "maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11727 "length | minLength | maxLength | enumeration | whiteSpace | "
11746static xmlSchemaTypePtr
11747xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
11748 xmlNodePtr
node, xmlSchemaTypeType parentType)
11750 xmlSchemaTypePtr
type;
11757 type = ctxt->ctxtType;
11758 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
11768 xmlSchemaPIllegalAttrErr(ctxt,
11772 xmlSchemaPIllegalAttrErr(ctxt,
11784 "base", &(
type->baseNs), &(
type->base)) == 0) &&
11786 xmlSchemaPMissingAttrErr(ctxt,
11794 if (IS_SCHEMA(
child,
"annotation")) {
11798 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11799 xmlSchemaParseAnnotation(ctxt,
child, 1));
11802 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11808 if (IS_SCHEMA(
child,
"all")) {
11809 type->subtypes = (xmlSchemaTypePtr)
11810 xmlSchemaParseModelGroup(ctxt,
schema,
11811 child, XML_SCHEMA_TYPE_ALL, 1);
11813 }
else if (IS_SCHEMA(
child,
"choice")) {
11814 type->subtypes = (xmlSchemaTypePtr)
11815 xmlSchemaParseModelGroup(ctxt,
schema,
11816 child, XML_SCHEMA_TYPE_CHOICE, 1);
11818 }
else if (IS_SCHEMA(
child,
"sequence")) {
11819 type->subtypes = (xmlSchemaTypePtr)
11820 xmlSchemaParseModelGroup(ctxt,
schema,
11821 child, XML_SCHEMA_TYPE_SEQUENCE, 1);
11823 }
else if (IS_SCHEMA(
child,
"group")) {
11824 type->subtypes = (xmlSchemaTypePtr)
11825 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
11837 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
11838 (xmlSchemaItemListPtr *) &(
type->attrUses),
11839 XML_SCHEMA_TYPE_EXTENSION,
NULL) == -1)
11844 if (IS_SCHEMA(
child,
"anyAttribute")) {
11845 ctxt->ctxtType->attributeWildcard =
11851 if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11853 xmlSchemaPContentErr(ctxt,
11856 "(annotation?, ((group | all | choice | sequence)?, "
11857 "((attribute | attributeGroup)*, anyAttribute?)))");
11860 xmlSchemaPContentErr(ctxt,
11863 "(annotation?, ((attribute | attributeGroup)*, "
11864 "anyAttribute?))");
11882xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
11884 int *hasRestrictionOrExtension)
11886 xmlSchemaTypePtr
type;
11891 (hasRestrictionOrExtension ==
NULL))
11893 *hasRestrictionOrExtension = 0;
11895 type = ctxt->ctxtType;
11896 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
11904 xmlSchemaPIllegalAttrErr(ctxt,
11908 xmlSchemaPIllegalAttrErr(ctxt,
11920 if (IS_SCHEMA(
child,
"annotation")) {
11924 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
11925 xmlSchemaParseAnnotation(ctxt,
child, 1));
11929 xmlSchemaPContentErr(ctxt,
11932 "(annotation?, (restriction | extension))");
11935 xmlSchemaPContentErr(ctxt,
11938 "(annotation?, (restriction | extension))");
11940 if (IS_SCHEMA(
child,
"restriction")) {
11942 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11943 (*hasRestrictionOrExtension) = 1;
11945 }
else if (IS_SCHEMA(
child,
"extension")) {
11947 XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11948 (*hasRestrictionOrExtension) = 1;
11952 xmlSchemaPContentErr(ctxt,
11955 "(annotation?, (restriction | extension))");
11972xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
11974 int *hasRestrictionOrExtension)
11976 xmlSchemaTypePtr
type;
11981 (hasRestrictionOrExtension ==
NULL))
11983 *hasRestrictionOrExtension = 0;
11985 type = ctxt->ctxtType;
11995 xmlSchemaPIllegalAttrErr(ctxt,
11999 xmlSchemaPIllegalAttrErr(ctxt,
12010 if (xmlGetBooleanProp(ctxt,
node,
"mixed", 0)) {
12011 if ((
type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
12012 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12015 if (IS_SCHEMA(
child,
"annotation")) {
12019 xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr)
type,
12020 xmlSchemaParseAnnotation(ctxt,
child, 1));
12024 xmlSchemaPContentErr(ctxt,
12027 NULL,
"(annotation?, (restriction | extension))");
12030 xmlSchemaPContentErr(ctxt,
12033 NULL,
"(annotation?, (restriction | extension))");
12035 if (IS_SCHEMA(
child,
"restriction")) {
12037 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12038 (*hasRestrictionOrExtension) = 1;
12040 }
else if (IS_SCHEMA(
child,
"extension")) {
12042 XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12043 (*hasRestrictionOrExtension) = 1;
12047 xmlSchemaPContentErr(ctxt,
12050 NULL,
"(annotation?, (restriction | extension))");
12066static xmlSchemaTypePtr
12067xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr
schema,
12068 xmlNodePtr
node,
int topLevel)
12070 xmlSchemaTypePtr
type, ctxtType;
12075#ifdef ENABLE_NAMED_LOCALS
12078 int final = 0,
block = 0, hasRestrictionOrExtension = 0;
12084 ctxtType = ctxt->ctxtType;
12087 attr = xmlSchemaGetPropNode(
node,
"name");
12089 xmlSchemaPMissingAttrErr(ctxt,
12092 }
else if (xmlSchemaPValAttrNode(ctxt,
NULL,
attr,
12093 xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &
name) != 0) {
12098 if (topLevel == 0) {
12102#ifdef ENABLE_NAMED_LOCALS
12105 XML_SCHEMA_TYPE_COMPLEX,
12107 ctxt->targetNamespace,
node, 0);
12110 XML_SCHEMA_TYPE_COMPLEX,
12111 NULL, ctxt->targetNamespace,
node, 0);
12117 type->type = XML_SCHEMA_TYPE_COMPLEX;
12126 XML_SCHEMA_TYPE_COMPLEX,
12127 name, ctxt->targetNamespace,
node, 1);
12131 type->type = XML_SCHEMA_TYPE_COMPLEX;
12132 type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
12134 type->targetNamespace = ctxt->targetNamespace;
12150 if (xmlSchemaPGetBoolNodeValue(ctxt,
12152 type->flags |= XML_SCHEMAS_TYPE_MIXED;
12153 }
else if (topLevel) {
12163 if (xmlSchemaPGetBoolNodeValue(ctxt,
12165 type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
12170 attrValue = xmlSchemaGetNodeContent(ctxt,
12171 (xmlNodePtr)
attr);
12172 if (xmlSchemaPValAttrBlockFinal(attrValue,
12175 XML_SCHEMAS_TYPE_FINAL_EXTENSION,
12176 XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
12179 xmlSchemaPSimpleTypeErr(ctxt,
12182 "(#all | List of (extension | restriction))",
12190 attrValue = xmlSchemaGetNodeContent(ctxt,
12191 (xmlNodePtr)
attr);
12192 if (xmlSchemaPValAttrBlockFinal(attrValue, &(
type->flags),
12194 XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
12195 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
12196 -1, -1, -1) != 0) {
12197 xmlSchemaPSimpleTypeErr(ctxt,
12200 "(#all | List of (extension | restriction)) ",
12205 xmlSchemaPIllegalAttrErr(ctxt,
12209 xmlSchemaPIllegalAttrErr(ctxt,
12213 xmlSchemaPIllegalAttrErr(ctxt,
12222 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
12223 type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
12224 if (
schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
12225 type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
12231 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
12232 type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
12233 if (
schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
12234 type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
12240 if (IS_SCHEMA(
child,
"annotation")) {
12241 type->annot = xmlSchemaParseAnnotation(ctxt,
child, 1);
12244 ctxt->ctxtType =
type;
12245 if (IS_SCHEMA(
child,
"simpleContent")) {
12252 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
12253 type->flags ^= XML_SCHEMAS_TYPE_MIXED;
12255 &hasRestrictionOrExtension);
12257 }
else if (IS_SCHEMA(
child,
"complexContent")) {
12261 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
12262 xmlSchemaParseComplexContent(ctxt,
schema,
child,
12263 &hasRestrictionOrExtension);
12275 type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
12276 type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
12280 if (IS_SCHEMA(
child,
"all")) {
12281 type->subtypes = (xmlSchemaTypePtr)
12283 XML_SCHEMA_TYPE_ALL, 1);
12285 }
else if (IS_SCHEMA(
child,
"choice")) {
12286 type->subtypes = (xmlSchemaTypePtr)
12288 XML_SCHEMA_TYPE_CHOICE, 1);
12290 }
else if (IS_SCHEMA(
child,
"sequence")) {
12291 type->subtypes = (xmlSchemaTypePtr)
12293 XML_SCHEMA_TYPE_SEQUENCE, 1);
12295 }
else if (IS_SCHEMA(
child,
"group")) {
12296 type->subtypes = (xmlSchemaTypePtr)
12297 xmlSchemaParseModelGroupDefRef(ctxt,
schema,
child);
12307 if (xmlSchemaParseLocalAttributes(ctxt,
schema, &
child,
12308 (xmlSchemaItemListPtr *) &(
type->attrUses),
12309 XML_SCHEMA_TYPE_RESTRICTION,
NULL) == -1)
12314 if (IS_SCHEMA(
child,
"anyAttribute")) {
12315 type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt,
schema,
child);
12320 xmlSchemaPContentErr(ctxt,
12323 NULL,
"(annotation?, (simpleContent | complexContent | "
12324 "((group | all | choice | sequence)?, ((attribute | "
12325 "attributeGroup)*, anyAttribute?))))");
12330 if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
12332 NULL,
node,
"This is a redefinition, thus the "
12333 "<complexType> must have a <restriction> or <extension> "
12334 "grand-child",
NULL);
12336 ctxt->ctxtType = ctxtType;
12364xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
12376 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
12392xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
12398 return (ctxt->options);
12411xmlSchemaParserCtxtPtr
12412xmlSchemaNewParserCtxt(
const char *URL)
12414 xmlSchemaParserCtxtPtr
ret;
12419 ret = xmlSchemaParserCtxtCreate();
12437xmlSchemaParserCtxtPtr
12438xmlSchemaNewMemParserCtxt(
const char *
buffer,
int size)
12440 xmlSchemaParserCtxtPtr
ret;
12444 ret = xmlSchemaParserCtxtCreate();
12462xmlSchemaParserCtxtPtr
12463xmlSchemaNewDocParserCtxt(xmlDocPtr doc)
12465 xmlSchemaParserCtxtPtr
ret;
12469 ret = xmlSchemaParserCtxtCreate();
12487xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
12491 if (ctxt->doc !=
NULL && !ctxt->preserve)
12492 xmlFreeDoc(ctxt->doc);
12493 if (ctxt->vctxt !=
NULL) {
12494 xmlSchemaFreeValidCtxt(ctxt->vctxt);
12496 if (ctxt->ownsConstructor && (ctxt->constructor !=
NULL)) {
12497 xmlSchemaConstructionCtxtFree(ctxt->constructor);
12498 ctxt->constructor =
NULL;
12499 ctxt->ownsConstructor = 0;
12501 if (ctxt->attrProhibs !=
NULL)
12502 xmlSchemaItemListFree(ctxt->attrProhibs);
12519xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
12520 xmlSchemaParticlePtr particle,
int counter, xmlAutomataStatePtr
end)
12522 xmlAutomataStatePtr
start, tmp;
12523 xmlSchemaElementPtr elemDecl,
member;
12524 xmlSchemaSubstGroupPtr substGroup;
12528 elemDecl = (xmlSchemaElementPtr) particle->children;
12532 start = pctxt->state;
12534 end = xmlAutomataNewState(pctxt->am);
12535 substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
12536 if (substGroup ==
NULL) {
12537 xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
12539 "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
12540 "declaration is marked having a subst. group but none "
12541 "available.\n", elemDecl->name,
NULL);
12552 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12553 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12557 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12558 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12559 xmlAutomataNewTransition2(pctxt->am, tmp,
end,
12562 }
else if (particle->maxOccurs == 1) {
12566 xmlAutomataNewEpsilon(pctxt->am,
12567 xmlAutomataNewTransition2(pctxt->am,
12569 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
end);
12573 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12574 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12588 tmp = xmlAutomataNewTransition2(pctxt->am,
start,
NULL,
12590 xmlAutomataNewEpsilon(pctxt->am, tmp,
end);
12593 xmlAutomataStatePtr hop;
12594 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12595 UNBOUNDED : particle->maxOccurs - 1;
12596 int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12599 xmlAutomataNewCounter(pctxt->am, minOccurs,
12601 hop = xmlAutomataNewState(pctxt->am);
12603 xmlAutomataNewEpsilon(pctxt->am,
12604 xmlAutomataNewTransition2(pctxt->am,
12606 elemDecl->
name, elemDecl->targetNamespace, elemDecl),
12611 for (
i = 0;
i < substGroup->members->nbItems;
i++) {
12612 member = (xmlSchemaElementPtr) substGroup->members->items[
i];
12613 xmlAutomataNewEpsilon(pctxt->am,
12614 xmlAutomataNewTransition2(pctxt->am,
12619 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12620 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12622 if (particle->minOccurs == 0) {
12623 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12626 pctxt->state =
end;
12636xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
12637 xmlSchemaParticlePtr particle)
12641 if (((xmlSchemaElementPtr) particle->children)->flags &
12642 XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
12646 ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1,
NULL);
12648 xmlSchemaElementPtr elemDecl;
12649 xmlAutomataStatePtr
start;
12651 elemDecl = (xmlSchemaElementPtr) particle->children;
12653 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
12655 if (particle->maxOccurs == 1) {
12656 start = ctxt->state;
12657 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12658 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12659 }
else if ((particle->maxOccurs >= UNBOUNDED) &&
12660 (particle->minOccurs < 2)) {
12662 start = ctxt->state;
12663 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12664 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12665 ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
12666 elemDecl->name, elemDecl->targetNamespace, elemDecl);
12669 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12670 UNBOUNDED : particle->maxOccurs - 1;
12671 int minOccurs = particle->minOccurs < 1 ?
12672 0 : particle->minOccurs - 1;
12674 start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
NULL);
12675 counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
12676 ctxt->state = xmlAutomataNewTransition2(ctxt->am,
start,
NULL,
12677 elemDecl->
name, elemDecl->targetNamespace, elemDecl);
12678 xmlAutomataNewCountedTrans(ctxt->am, ctxt->state,
start,
counter);
12679 ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
12682 if (particle->minOccurs == 0) {
12683 xmlAutomataNewEpsilon(ctxt->am,
start, ctxt->state);
12701xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
12702 xmlSchemaParticlePtr particle)
12706 if (particle ==
NULL) {
12707 PERROR_INT(
"xmlSchemaBuildAContentModel",
"particle is NULL");
12710 if (particle->children ==
NULL) {
12718 switch (particle->children->type) {
12719 case XML_SCHEMA_TYPE_ANY: {
12721 xmlSchemaWildcardPtr wild;
12722 xmlSchemaWildcardNsPtr
ns;
12724 wild = (xmlSchemaWildcardPtr) particle->children;
12726 start = pctxt->state;
12727 end = xmlAutomataNewState(pctxt->am);
12729 if (particle->maxOccurs == 1) {
12730 if (wild->any == 1) {
12737 xmlAutomataNewTransition2(pctxt->am,
12739 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12744 xmlAutomataNewTransition2(pctxt->am,
12746 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12748 }
else if (wild->nsSet !=
NULL) {
12751 pctxt->state =
start;
12752 pctxt->state = xmlAutomataNewTransition2(pctxt->am,
12754 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12758 }
else if (wild->negNsSet !=
NULL) {
12759 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12765 xmlAutomataStatePtr hop;
12767 particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
12768 particle->maxOccurs - 1;
12770 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12772 counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12773 hop = xmlAutomataNewState(pctxt->am);
12774 if (wild->any == 1) {
12776 xmlAutomataNewTransition2(pctxt->am,
12778 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12780 xmlAutomataNewTransition2(pctxt->am,
12782 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12783 }
else if (wild->nsSet !=
NULL) {
12787 xmlAutomataNewTransition2(pctxt->am,
12789 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12793 }
else if (wild->negNsSet !=
NULL) {
12794 pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12798 xmlAutomataNewCountedTrans(pctxt->am, hop,
start,
counter);
12799 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12801 if (particle->minOccurs == 0) {
12802 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
12805 pctxt->state =
end;
12808 case XML_SCHEMA_TYPE_ELEMENT:
12809 ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
12811 case XML_SCHEMA_TYPE_SEQUENCE:{
12812 xmlSchemaTreeItemPtr sub;
12819 if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
12820 sub = particle->children->children;
12822 while (sub !=
NULL) {
12823 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12824 (xmlSchemaParticlePtr) sub);
12825 if (tmp2 != 1)
ret = 0;
12829 xmlAutomataStatePtr oldstate = pctxt->state;
12831 if (particle->maxOccurs >= UNBOUNDED) {
12832 if (particle->minOccurs > 1) {
12833 xmlAutomataStatePtr tmp;
12836 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12838 oldstate = pctxt->state;
12840 counter = xmlAutomataNewCounter(pctxt->am,
12841 particle->minOccurs - 1, UNBOUNDED);
12843 sub = particle->children->children;
12844 while (sub !=
NULL) {
12845 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12846 (xmlSchemaParticlePtr) sub);
12847 if (tmp2 != 1)
ret = 0;
12850 tmp = pctxt->state;
12851 xmlAutomataNewCountedTrans(pctxt->am, tmp,
12854 xmlAutomataNewCounterTrans(pctxt->am, tmp,
12857 xmlAutomataNewEpsilon(pctxt->am,
12858 oldstate, pctxt->state);
12861 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12863 oldstate = pctxt->state;
12865 sub = particle->children->children;
12866 while (sub !=
NULL) {
12867 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12868 (xmlSchemaParticlePtr) sub);
12869 if (tmp2 != 1)
ret = 0;
12872 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
12879 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12880 pctxt->state,
NULL);
12881 if (particle->minOccurs == 0) {
12882 xmlAutomataNewEpsilon(pctxt->am,
12883 oldstate, pctxt->state);
12887 }
else if ((particle->maxOccurs > 1)
12888 || (particle->minOccurs > 1)) {
12889 xmlAutomataStatePtr tmp;
12892 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12894 oldstate = pctxt->state;
12896 counter = xmlAutomataNewCounter(pctxt->am,
12897 particle->minOccurs - 1,
12898 particle->maxOccurs - 1);
12900 sub = particle->children->children;
12901 while (sub !=
NULL) {
12902 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12903 (xmlSchemaParticlePtr) sub);
12904 if (tmp2 != 1)
ret = 0;
12907 tmp = pctxt->state;
12908 xmlAutomataNewCountedTrans(pctxt->am,
12911 xmlAutomataNewCounterTrans(pctxt->am, tmp,
NULL,
12913 if ((particle->minOccurs == 0) || (
ret == 1)) {
12914 xmlAutomataNewEpsilon(pctxt->am,
12915 oldstate, pctxt->state);
12919 sub = particle->children->children;
12920 while (sub !=
NULL) {
12921 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12922 (xmlSchemaParticlePtr) sub);
12923 if (tmp2 != 1)
ret = 0;
12932 pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12933 pctxt->state,
NULL);
12935 if (particle->minOccurs == 0) {
12936 xmlAutomataNewEpsilon(pctxt->am, oldstate,
12944 case XML_SCHEMA_TYPE_CHOICE:{
12945 xmlSchemaTreeItemPtr sub;
12949 start = pctxt->state;
12950 end = xmlAutomataNewState(pctxt->am);
12956 if (particle->maxOccurs == 1) {
12957 sub = particle->children->children;
12958 while (sub !=
NULL) {
12959 pctxt->state =
start;
12960 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12961 (xmlSchemaParticlePtr) sub);
12962 if (tmp2 == 1)
ret = 1;
12963 xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
end);
12968 xmlAutomataStatePtr hop,
base;
12969 int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12970 UNBOUNDED : particle->maxOccurs - 1;
12972 particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12979 xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12980 hop = xmlAutomataNewState(pctxt->am);
12981 base = xmlAutomataNewState(pctxt->am);
12983 sub = particle->children->children;
12984 while (sub !=
NULL) {
12985 pctxt->state =
base;
12986 tmp2 = xmlSchemaBuildAContentModel(pctxt,
12987 (xmlSchemaParticlePtr) sub);
12988 if (tmp2 == 1)
ret = 1;
12989 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12992 xmlAutomataNewEpsilon(pctxt->am,
start,
base);
12993 xmlAutomataNewCountedTrans(pctxt->am, hop,
base,
counter);
12994 xmlAutomataNewCounterTrans(pctxt->am, hop,
end,
counter);
12996 xmlAutomataNewEpsilon(pctxt->am,
base,
end);
12998 if (particle->minOccurs == 0) {
12999 xmlAutomataNewEpsilon(pctxt->am,
start,
end);
13002 pctxt->state =
end;
13005 case XML_SCHEMA_TYPE_ALL:{
13006 xmlAutomataStatePtr
start, tmp;
13007 xmlSchemaParticlePtr sub;
13008 xmlSchemaElementPtr elemDecl;
13012 sub = (xmlSchemaParticlePtr) particle->children->children;
13018 start = pctxt->state;
13019 tmp = xmlAutomataNewState(pctxt->am);
13020 xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
13021 pctxt->state = tmp;
13022 while (sub !=
NULL) {
13023 pctxt->state = tmp;
13025 elemDecl = (xmlSchemaElementPtr) sub->children;
13027 PERROR_INT(
"xmlSchemaBuildAContentModel",
13028 "<element> particle has no term");
13037 if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
13045 counter = xmlAutomataNewCounter(pctxt->am,
13046 sub->minOccurs, sub->maxOccurs);
13047 xmlSchemaBuildContentModelForSubstGroup(pctxt,
13050 if ((sub->minOccurs == 1) &&
13051 (sub->maxOccurs == 1)) {
13052 xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
13055 elemDecl->targetNamespace,
13057 }
else if ((sub->minOccurs == 0) &&
13058 (sub->maxOccurs == 1)) {
13060 xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
13063 elemDecl->targetNamespace,
13069 sub = (xmlSchemaParticlePtr) sub->next;
13072 xmlAutomataNewAllTrans(pctxt->am, pctxt->state,
NULL, 0);
13073 if (particle->minOccurs == 0) {
13074 xmlAutomataNewEpsilon(pctxt->am,
start, pctxt->state);
13079 case XML_SCHEMA_TYPE_GROUP:
13090 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
13091 "xmlSchemaBuildAContentModel",
13092 "found unexpected term of type '%s' in content model",
13093 WXS_ITEM_TYPE_NAME(particle->children),
NULL);
13108xmlSchemaBuildContentModel(xmlSchemaTypePtr
type,
13109 xmlSchemaParserCtxtPtr ctxt)
13111 if ((
type->type != XML_SCHEMA_TYPE_COMPLEX) ||
13113 ((
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
13114 (
type->contentType != XML_SCHEMA_CONTENT_MIXED)))
13118 ctxt->am = xmlNewAutomata();
13119 if (ctxt->am ==
NULL) {
13121 "Cannot create automata for complex type %s\n",
type->name);
13124 ctxt->state = xmlAutomataGetInitState(ctxt->am);
13128 xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(
type));
13129 xmlAutomataSetFinalState(ctxt->am, ctxt->state);
13130 type->contModel = xmlAutomataCompile(ctxt->am);
13132 xmlSchemaPCustomErr(ctxt,
13135 "Failed to compile the content model",
NULL);
13137 }
else if (xmlRegexpIsDeterminist(
type->contModel) != 1) {
13138 xmlSchemaPCustomErr(ctxt,
13142 "The content model is not determinist",
NULL);
13146 ctxt->state =
NULL;
13147 xmlFreeAutomata(ctxt->am);
13161xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
13162 xmlSchemaParserCtxtPtr ctxt)
13164 if ((ctxt ==
NULL) || (elemDecl ==
NULL) ||
13165 ((elemDecl !=
NULL) &&
13166 (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
13168 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
13170 if ((elemDecl->subtypes ==
NULL) && (elemDecl->namedType !=
NULL)) {
13171 xmlSchemaTypePtr
type;
13176 type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
13177 elemDecl->namedTypeNs);
13179 xmlSchemaPResCompAttrErr(ctxt,
13181 WXS_BASIC_CAST elemDecl, elemDecl->node,
13182 "type", elemDecl->namedType, elemDecl->namedTypeNs,
13183 XML_SCHEMA_TYPE_BASIC,
"type definition");
13185 elemDecl->subtypes =
type;
13187 if (elemDecl->substGroup !=
NULL) {
13188 xmlSchemaElementPtr substHead;
13194 substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
13195 elemDecl->substGroupNs);
13196 if (substHead ==
NULL) {
13197 xmlSchemaPResCompAttrErr(ctxt,
13199 WXS_BASIC_CAST elemDecl,
NULL,
13200 "substitutionGroup", elemDecl->substGroup,
13201 elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT,
NULL);
13203 xmlSchemaResolveElementReferences(substHead, ctxt);
13208 WXS_SUBST_HEAD(elemDecl) = substHead;
13215 if (elemDecl->subtypes ==
NULL) {
13216 if (substHead->subtypes ==
NULL) {
13222 elemDecl->subtypes = xmlSchemaGetBuiltInType(
13223 XML_SCHEMAS_ANYTYPE);
13225 elemDecl->subtypes = substHead->subtypes;
13234 if ((elemDecl->subtypes ==
NULL) &&
13235 (elemDecl->namedType ==
NULL) &&
13236 (elemDecl->substGroup ==
NULL))
13237 elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
13252xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
13253 xmlSchemaTypePtr
type)
13256 xmlSchemaTypeLinkPtr
link, lastLink, newLink;
13257 xmlSchemaTypePtr memberType;
13275 nsName = ((xmlSchemaQNameRefPtr)
link->type)->targetNamespace;
13277 memberType = xmlSchemaGetType(ctxt->schema,
name, nsName);
13278 if ((memberType ==
NULL) || (! WXS_IS_SIMPLE(memberType))) {
13280 WXS_BASIC_CAST
type,
type->node,
"memberTypes",
13281 name, nsName, XML_SCHEMA_TYPE_SIMPLE,
NULL);
13285 if (lastLink ==
NULL)
13288 lastLink->next =
link->next;
13293 link->type = memberType;
13301 memberType =
type->subtypes;
13302 while (memberType !=
NULL) {
13303 link = (xmlSchemaTypeLinkPtr)
xmlMalloc(
sizeof(xmlSchemaTypeLink));
13305 xmlSchemaPErrMemory(ctxt,
"allocating a type link",
NULL);
13308 link->type = memberType;
13310 if (lastLink ==
NULL)
13313 lastLink->next =
link;
13315 memberType = memberType->next;
13331xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13335 if (WXS_IS_COMPLEX(
type))
13337 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13338 if (
type->builtInType == valType)
13340 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13341 (
type->builtInType == XML_SCHEMAS_ANYTYPE))
13343 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13345 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13360xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr
type,
int valType)
13364 if (WXS_IS_COMPLEX(
type))
13366 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
13367 if (
type->builtInType == valType)
13371 return(xmlSchemaIsDerivedFromBuiltInType(
type->subtypes, valType));
13376static xmlSchemaTypePtr
13377xmlSchemaQueryBuiltInType(xmlSchemaTypePtr
type)
13381 if (WXS_IS_COMPLEX(
type))
13383 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13385 return(xmlSchemaQueryBuiltInType(
type->subtypes));
13396static xmlSchemaTypePtr
13397xmlSchemaGetPrimitiveType(xmlSchemaTypePtr
type)
13405 if ((
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13406 (
type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
13422static xmlSchemaTypePtr
13423xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr
type)
13425 if (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))
13428 if (
type->type == XML_SCHEMA_TYPE_BASIC)
13448xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
13449 xmlSchemaWildcardPtr
dest,
13450 xmlSchemaWildcardPtr
source)
13452 xmlSchemaWildcardNsPtr
cur, tmp,
last;
13460 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13463 tmp->value =
cur->value;
13472 xmlSchemaFreeWildcardNsSet(
dest->negNsSet);
13474 dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13477 dest->negNsSet->value =
source->negNsSet->value;
13495xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
13496 xmlSchemaWildcardPtr completeWild,
13497 xmlSchemaWildcardPtr curWild)
13499 xmlSchemaWildcardNsPtr
cur, curB, tmp;
13505 if ((completeWild->any == curWild->any) &&
13506 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13507 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13509 if ((completeWild->negNsSet ==
NULL) ||
13510 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13512 if (completeWild->nsSet !=
NULL) {
13518 cur = completeWild->nsSet;
13521 curB = curWild->nsSet;
13522 while (curB !=
NULL) {
13523 if (
cur->value == curB->value) {
13542 if (completeWild->any != curWild->any) {
13543 if (completeWild->any == 0) {
13544 completeWild->any = 1;
13545 if (completeWild->nsSet !=
NULL) {
13546 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13547 completeWild->nsSet =
NULL;
13549 if (completeWild->negNsSet !=
NULL) {
13550 xmlFree(completeWild->negNsSet);
13551 completeWild->negNsSet =
NULL;
13560 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13562 xmlSchemaWildcardNsPtr
start;
13564 cur = curWild->nsSet;
13565 start = completeWild->nsSet;
13569 while (curB !=
NULL) {
13570 if (
cur->value == curB->value) {
13577 tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13580 tmp->value =
cur->value;
13581 tmp->next = completeWild->nsSet;
13582 completeWild->nsSet = tmp;
13593 if ((completeWild->negNsSet !=
NULL) &&
13594 (curWild->negNsSet !=
NULL) &&
13595 (completeWild->negNsSet->value != curWild->negNsSet->value)) {
13596 completeWild->negNsSet->value =
NULL;
13603 if (((completeWild->negNsSet !=
NULL) &&
13604 (completeWild->negNsSet->value !=
NULL) &&
13605 (curWild->nsSet !=
NULL)) ||
13606 ((curWild->negNsSet !=
NULL) &&
13607 (curWild->negNsSet->value !=
NULL) &&
13608 (completeWild->nsSet !=
NULL))) {
13610 int nsFound, absentFound = 0;
13612 if (completeWild->nsSet !=
NULL) {
13613 cur = completeWild->nsSet;
13614 curB = curWild->negNsSet;
13616 cur = curWild->nsSet;
13617 curB = completeWild->negNsSet;
13623 else if (
cur->value == curB->value)
13625 if (nsFound && absentFound)
13630 if (nsFound && absentFound) {
13635 completeWild->any = 1;
13636 if (completeWild->nsSet !=
NULL) {
13637 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13638 completeWild->nsSet =
NULL;
13640 if (completeWild->negNsSet !=
NULL) {
13641 xmlFree(completeWild->negNsSet);
13642 completeWild->negNsSet =
NULL;
13644 }
else if (nsFound && (!absentFound)) {
13650 if (completeWild->nsSet !=
NULL) {
13651 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13652 completeWild->nsSet =
NULL;
13654 if (completeWild->negNsSet ==
NULL) {
13655 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13656 if (completeWild->negNsSet ==
NULL)
13659 completeWild->negNsSet->value =
NULL;
13660 }
else if ((!nsFound) && absentFound) {
13665 xmlSchemaPErr(ctxt, completeWild->node,
13667 "The union of the wildcard is not expressible.\n",
13670 }
else if ((!nsFound) && (!absentFound)) {
13676 if (completeWild->negNsSet ==
NULL) {
13677 if (completeWild->nsSet !=
NULL) {
13678 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13679 completeWild->nsSet =
NULL;
13681 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13682 if (completeWild->negNsSet ==
NULL)
13684 completeWild->negNsSet->value = curWild->negNsSet->value;
13692 if (((completeWild->negNsSet !=
NULL) &&
13693 (completeWild->negNsSet->value ==
NULL) &&
13694 (curWild->nsSet !=
NULL)) ||
13695 ((curWild->negNsSet !=
NULL) &&
13696 (curWild->negNsSet->value ==
NULL) &&
13697 (completeWild->nsSet !=
NULL))) {
13699 if (completeWild->nsSet !=
NULL) {
13700 cur = completeWild->nsSet;
13702 cur = curWild->nsSet;
13710 completeWild->any = 1;
13711 if (completeWild->nsSet !=
NULL) {
13712 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13713 completeWild->nsSet =
NULL;
13715 if (completeWild->negNsSet !=
NULL) {
13716 xmlFree(completeWild->negNsSet);
13717 completeWild->negNsSet =
NULL;
13723 if (completeWild->negNsSet ==
NULL) {
13728 if (completeWild->nsSet !=
NULL) {
13729 xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13730 completeWild->nsSet =
NULL;
13732 completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13733 if (completeWild->negNsSet ==
NULL)
13735 completeWild->negNsSet->value =
NULL;
13755xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
13756 xmlSchemaWildcardPtr completeWild,
13757 xmlSchemaWildcardPtr curWild)
13759 xmlSchemaWildcardNsPtr
cur, curB, prev, tmp;
13765 if ((completeWild->any == curWild->any) &&
13766 ((completeWild->nsSet ==
NULL) == (curWild->nsSet ==
NULL)) &&
13767 ((completeWild->negNsSet ==
NULL) == (curWild->negNsSet ==
NULL))) {
13769 if ((completeWild->negNsSet ==
NULL) ||
13770 (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13772 if (completeWild->nsSet !=
NULL) {
13778 cur = completeWild->nsSet;
13781 curB = curWild->nsSet;
13782 while (curB !=
NULL) {
13783 if (
cur->value == curB->value) {
13802 if ((completeWild->any != curWild->any) && (completeWild->any)) {
13803 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13813 if (((completeWild->negNsSet !=
NULL) && (curWild->nsSet !=
NULL)) ||
13814 ((curWild->negNsSet !=
NULL) && (completeWild->nsSet !=
NULL))) {
13817 if (completeWild->nsSet ==
NULL) {
13818 neg = completeWild->negNsSet->value;
13819 if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13822 neg = curWild->negNsSet->value;
13827 cur = completeWild->nsSet;
13831 completeWild->nsSet =
cur->next;
13833 prev->next =
cur->next;
13842 cur = completeWild->nsSet;
13844 if (
cur->value == neg) {
13846 completeWild->nsSet =
cur->next;
13848 prev->next =
cur->next;
13863 if ((completeWild->nsSet !=
NULL) && (curWild->nsSet !=
NULL)) {
13866 cur = completeWild->nsSet;
13870 curB = curWild->nsSet;
13871 while (curB !=
NULL) {
13872 if (
cur->value == curB->value) {
13880 completeWild->nsSet =
cur->next;
13882 prev->next =
cur->next;
13897 if ((completeWild->negNsSet !=
NULL) &&
13898 (curWild->negNsSet !=
NULL) &&
13899 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
13900 (completeWild->negNsSet->value !=
NULL) &&
13901 (curWild->negNsSet->value !=
NULL)) {
13904 "The intersection of the wildcard is not expressible.\n",
13913 if ((completeWild->negNsSet !=
NULL) && (curWild->negNsSet !=
NULL) &&
13914 (completeWild->negNsSet->value != curWild->negNsSet->value) &&
13915 (completeWild->negNsSet->value ==
NULL)) {
13916 completeWild->negNsSet->value = curWild->negNsSet->value;
13933xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
13934 xmlSchemaWildcardPtr super)
13945 if ((sub->negNsSet !=
NULL) &&
13946 (super->negNsSet !=
NULL) &&
13947 (sub->negNsSet->value == super->negNsSet->value))
13952 if (sub->nsSet !=
NULL) {
13956 if (super->nsSet !=
NULL) {
13957 xmlSchemaWildcardNsPtr
cur, curB;
13963 curB = super->nsSet;
13964 while (curB !=
NULL) {
13965 if (
cur->value == curB->value) {
13977 }
else if (super->negNsSet !=
NULL) {
13978 xmlSchemaWildcardNsPtr
cur;
13985 if (
cur->value == super->negNsSet->value)
13996xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
13999 xmlSchemaValPtr *
val)
14006 if (attruse->defValue !=
NULL) {
14007 *
value = attruse->defValue;
14009 *
val = attruse->defVal;
14010 if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
14013 }
else if ((attruse->attrDecl !=
NULL) &&
14014 (attruse->attrDecl->defValue !=
NULL)) {
14015 *
value = attruse->attrDecl->defValue;
14017 *
val = attruse->attrDecl->defVal;
14018 if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
14036xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
14044 else if (wild->nsSet !=
NULL) {
14045 xmlSchemaWildcardNsPtr
cur;
14053 }
else if ((wild->negNsSet !=
NULL) && (
ns !=
NULL) &&
14060#define XML_SCHEMA_ACTION_DERIVE 0
14061#define XML_SCHEMA_ACTION_REDEFINE 1
14063#define WXS_ACTION_STR(a) \
14064((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
14078xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
14080 xmlSchemaBasicItemPtr
item,
14081 xmlSchemaBasicItemPtr baseItem,
14082 xmlSchemaItemListPtr uses,
14083 xmlSchemaItemListPtr baseUses,
14084 xmlSchemaWildcardPtr wild,
14085 xmlSchemaWildcardPtr baseWild)
14087 xmlSchemaAttributeUsePtr
cur =
NULL, bcur;
14092 if (uses !=
NULL) {
14093 for (
i = 0;
i < uses->nbItems;
i++) {
14094 cur = uses->items[
i];
14096 if (baseUses ==
NULL)
14098 for (
j = 0;
j < baseUses->nbItems;
j++) {
14099 bcur = baseUses->items[
j];
14100 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14101 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14102 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14103 WXS_ATTRUSE_DECL_TNS(bcur)))
14113 if ((
cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
14114 (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
14122 xmlSchemaPAttrUseErr4(pctxt,
14125 "The 'optional' attribute use is inconsistent "
14126 "with the corresponding 'required' attribute use of "
14129 xmlSchemaGetComponentDesignation(&
str, baseItem),
14131 FREE_AND_NULL(
str);
14133 }
else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
14134 WXS_ATTRUSE_TYPEDEF(
cur),
14135 WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
14145 xmlSchemaPAttrUseErr4(pctxt,
14148 "The attribute declaration's %s "
14149 "is not validly derived from "
14150 "the corresponding %s of the "
14151 "attribute declaration in the %s %s",
14152 xmlSchemaGetComponentDesignation(&
strA,
14153 WXS_ATTRUSE_TYPEDEF(
cur)),
14154 xmlSchemaGetComponentDesignation(&strB,
14155 WXS_ATTRUSE_TYPEDEF(bcur)),
14157 xmlSchemaGetComponentDesignation(&strC, baseItem));
14159 FREE_AND_NULL(
strA);
14160 FREE_AND_NULL(strB);
14161 FREE_AND_NULL(strC);
14170 xmlSchemaGetEffectiveValueConstraint(bcur,
14171 &effFixed, &bEffValue,
NULL);
14178 if ((bEffValue !=
NULL) &&
14182 xmlSchemaGetEffectiveValueConstraint(bcur,
14183 &effFixed, &rEffValue,
NULL);
14191 if ((effFixed == 0) ||
14192 (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
14196 xmlSchemaPAttrUseErr4(pctxt,
14199 "The effective value constraint of the "
14200 "attribute use is inconsistent with "
14201 "its correspondent in the %s %s",
14203 xmlSchemaGetComponentDesignation(&
str,
14206 FREE_AND_NULL(
str);
14223 if ((baseWild ==
NULL) ||
14224 (xmlSchemaCheckCVCWildcardNamespace(baseWild,
14225 (WXS_ATTRUSE_DECL(
cur))->targetNamespace) != 0))
14229 xmlSchemaPAttrUseErr4(pctxt,
14232 "Neither a matching attribute use, "
14233 "nor a matching wildcard exists in the %s %s",
14235 xmlSchemaGetComponentDesignation(&
str, baseItem),
14237 FREE_AND_NULL(
str);
14251 if (baseUses !=
NULL) {
14252 for (
j = 0;
j < baseUses->nbItems;
j++) {
14253 bcur = baseUses->items[
j];
14254 if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
14257 if (uses !=
NULL) {
14258 for (
i = 0;
i < uses->nbItems;
i++) {
14259 cur = uses->items[
i];
14260 if ((WXS_ATTRUSE_DECL_NAME(
cur) ==
14261 WXS_ATTRUSE_DECL_NAME(bcur)) &&
14262 (WXS_ATTRUSE_DECL_TNS(
cur) ==
14263 WXS_ATTRUSE_DECL_TNS(bcur))) {
14272 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14275 "A matching attribute use for the "
14276 "'required' %s of the %s %s is missing",
14277 xmlSchemaGetComponentDesignation(&
strA, bcur),
14279 xmlSchemaGetComponentDesignation(&strB, baseItem),
14281 FREE_AND_NULL(
strA);
14282 FREE_AND_NULL(strB);
14289 if (wild !=
NULL) {
14294 if (baseWild ==
NULL) {
14300 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14303 "The %s has an attribute wildcard, "
14304 "but the %s %s '%s' does not have one",
14305 WXS_ITEM_TYPE_NAME(
item),
14307 WXS_ITEM_TYPE_NAME(baseItem),
14308 xmlSchemaGetComponentQName(&
str, baseItem));
14309 FREE_AND_NULL(
str);
14310 return(pctxt->err);
14311 }
else if ((baseWild->any == 0) &&
14312 xmlSchemaCheckCOSNSSubset(wild, baseWild))
14321 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14324 "The attribute wildcard is not a valid "
14325 "subset of the wildcard in the %s %s '%s'",
14327 WXS_ITEM_TYPE_NAME(baseItem),
14328 xmlSchemaGetComponentQName(&
str, baseItem),
14330 FREE_AND_NULL(
str);
14331 return(pctxt->err);
14340 if ((! WXS_IS_ANYTYPE(baseItem)) &&
14341 (wild->processContents < baseWild->processContents)) {
14343 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14346 "The {process contents} of the attribute wildcard is "
14347 "weaker than the one in the %s %s '%s'",
14349 WXS_ITEM_TYPE_NAME(baseItem),
14350 xmlSchemaGetComponentQName(&
str, baseItem),
14353 return(pctxt->err);
14361xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
14362 xmlSchemaBasicItemPtr
item,
14363 xmlSchemaWildcardPtr *completeWild,
14364 xmlSchemaItemListPtr
list,
14365 xmlSchemaItemListPtr prohibs);
14381xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
14382 xmlSchemaTypePtr
type)
14384 xmlSchemaTypePtr baseType =
NULL;
14385 xmlSchemaAttributeUsePtr use;
14386 xmlSchemaItemListPtr uses, baseUses, prohibs =
NULL;
14389 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14393 baseType =
type->baseType;
14394 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14395 if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
14398 uses =
type->attrUses;
14399 baseUses = baseType->attrUses;
14405 if (uses !=
NULL) {
14406 if (WXS_IS_RESTRICTION(
type)) {
14411 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14412 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14413 pctxt->attrProhibs) == -1)
14415 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14416 "failed to expand attributes");
14419 if (pctxt->attrProhibs->nbItems != 0)
14420 prohibs = pctxt->attrProhibs;
14422 if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14423 WXS_BASIC_CAST
type, &(
type->attributeWildcard), uses,
14426 PERROR_INT(
"xmlSchemaFixupTypeAttributeUses",
14427 "failed to expand attributes");
14435 if (baseUses !=
NULL) {
14437 xmlSchemaAttributeUseProhibPtr pro;
14439 if (WXS_IS_RESTRICTION(
type)) {
14441 xmlSchemaAttributeUsePtr tmp;
14444 usesCount = uses->nbItems;
14449 for (
i = 0;
i < baseUses->nbItems;
i++) {
14450 use = baseUses->items[
i];
14455 for (
j = 0;
j < prohibs->nbItems;
j++) {
14456 pro = prohibs->items[
j];
14457 if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
14458 (WXS_ATTRUSE_DECL_TNS(use) ==
14459 pro->targetNamespace))
14469 for (
j = 0;
j < usesCount;
j++) {
14470 tmp = uses->items[
j];
14471 if ((WXS_ATTRUSE_DECL_NAME(use) ==
14472 WXS_ATTRUSE_DECL_NAME(tmp)) &&
14473 (WXS_ATTRUSE_DECL_TNS(use) ==
14474 WXS_ATTRUSE_DECL_TNS(tmp)))
14480 if (uses ==
NULL) {
14481 type->attrUses = xmlSchemaItemListCreate();
14484 uses =
type->attrUses;
14486 xmlSchemaItemListAddSize(uses, 2, use);
14491 for (
i = 0;
i < baseUses->nbItems;
i++) {
14492 use = baseUses->items[
i];
14493 if (uses ==
NULL) {
14494 type->attrUses = xmlSchemaItemListCreate();
14497 uses =
type->attrUses;
14499 xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
14507 if (uses->nbItems == 0) {
14508 xmlSchemaItemListFree(uses);
14519 if (WXS_IS_EXTENSION(
type)) {
14520 if (baseType->attributeWildcard !=
NULL) {
14525 if (
type->attributeWildcard !=
NULL) {
14536 if (xmlSchemaUnionWildcards(pctxt,
type->attributeWildcard,
14537 baseType->attributeWildcard) == -1)
14544 type->attributeWildcard = baseType->attributeWildcard;
14581xmlSchemaTypeFinalContains(xmlSchemaTypePtr
type,
int final)
14585 if (
type->flags &
final)
14598static xmlSchemaTypeLinkPtr
14599xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr
type)
14601 while ((
type !=
NULL) && (
type->type == XML_SCHEMA_TYPE_SIMPLE)) {
14603 return (
type->memberTypes);
14621xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
14623 if ((particle->children ==
NULL) ||
14624 (particle->minOccurs == 0))
14626 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14628 xmlSchemaParticlePtr part =
14629 (xmlSchemaParticlePtr) particle->children->children;
14633 while (part !=
NULL) {
14634 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14635 (part->children->type == XML_SCHEMA_TYPE_ANY))
14636 cur = part->minOccurs;
14638 cur = xmlSchemaGetParticleTotalRangeMin(part);
14643 part = (xmlSchemaParticlePtr) part->next;
14645 return (particle->minOccurs *
min);
14649 xmlSchemaParticlePtr part =
14650 (xmlSchemaParticlePtr) particle->children->children;
14655 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14656 (part->children->type == XML_SCHEMA_TYPE_ANY))
14657 sum += part->minOccurs;
14659 sum += xmlSchemaGetParticleTotalRangeMin(part);
14660 part = (xmlSchemaParticlePtr) part->next;
14661 }
while (part !=
NULL);
14662 return (particle->minOccurs *
sum);
14676xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
14678 if ((particle->children ==
NULL) ||
14679 (particle->children->children ==
NULL))
14681 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14683 xmlSchemaParticlePtr part =
14684 (xmlSchemaParticlePtr) particle->children->children;
14686 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14687 if (part->children ==
NULL)
14689 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14690 (part->children->type == XML_SCHEMA_TYPE_ANY))
14691 cur = part->maxOccurs;
14693 cur = xmlSchemaGetParticleTotalRangeMax(part);
14694 if (
cur == UNBOUNDED)
14695 return (UNBOUNDED);
14700 return (particle->maxOccurs *
max);
14704 xmlSchemaParticlePtr part =
14705 (xmlSchemaParticlePtr) particle->children->children;
14707 for (; part !=
NULL; part = (xmlSchemaParticlePtr) part->
next) {
14708 if (part->children ==
NULL)
14710 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14711 (part->children->type == XML_SCHEMA_TYPE_ANY))
14712 cur = part->maxOccurs;
14714 cur = xmlSchemaGetParticleTotalRangeMax(part);
14715 if (
cur == UNBOUNDED)
14716 return (UNBOUNDED);
14717 if ((
cur > 0) && (particle->maxOccurs == UNBOUNDED))
14718 return (UNBOUNDED);
14722 return (particle->maxOccurs *
sum);
14734xmlSchemaGetParticleEmptiable(xmlSchemaParticlePtr particle)
14736 xmlSchemaParticlePtr part;
14739 if ((particle->children ==
NULL) || (particle->minOccurs == 0))
14742 part = (xmlSchemaParticlePtr) particle->children->children;
14746 while (part !=
NULL) {
14747 if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14748 (part->children->type == XML_SCHEMA_TYPE_ANY))
14749 emptiable = (part->minOccurs == 0);
14751 emptiable = xmlSchemaGetParticleEmptiable(part);
14752 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14760 part = (xmlSchemaParticlePtr) part->next;
14763 if (particle->children->type == XML_SCHEMA_TYPE_CHOICE)
14779xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
14784 if ((particle ==
NULL) || (particle->minOccurs == 0) ||
14785 (particle->children ==
NULL))
14791 if (WXS_IS_MODEL_GROUP(particle->children))
14792 return (xmlSchemaGetParticleEmptiable(particle));
14812xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
14813 xmlSchemaTypePtr
type,
14814 xmlSchemaTypePtr baseType,
14821 if (
type == baseType)
14832 if (WXS_IS_TYPE_NOT_FIXED(
type))
14833 if (xmlSchemaTypeFixup(
type, actxt) == -1)
14835 if (WXS_IS_TYPE_NOT_FIXED(baseType))
14836 if (xmlSchemaTypeFixup(baseType, actxt) == -1)
14838 if ((subset & SUBSET_RESTRICTION) ||
14839 (xmlSchemaTypeFinalContains(
type->baseType,
14840 XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
14844 if (
type->baseType == baseType) {
14855 if ((! WXS_IS_ANYTYPE(
type->baseType)) &&
14856 (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
14857 baseType, subset) == 0)) {
14864 if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
14865 (WXS_IS_LIST(
type) || WXS_IS_UNION(
type))) {
14876 if (WXS_IS_UNION(baseType)) {
14877 xmlSchemaTypeLinkPtr
cur;
14879 cur = baseType->memberTypes;
14881 if (WXS_IS_TYPE_NOT_FIXED(
cur->type))
14882 if (xmlSchemaTypeFixup(
cur->type, actxt) == -1)
14884 if (xmlSchemaCheckCOSSTDerivedOK(actxt,
14885 type,
cur->type, subset) == 0)
14912xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
14913 xmlSchemaTypePtr ctxtType,
14914 xmlSchemaTypePtr ancestor)
14918 if ((ancestor ==
NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
14921 if (ctxtType == ancestor) {
14922 xmlSchemaPCustomErr(pctxt,
14924 WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
14925 "The definition is circular",
NULL);
14928 if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
14934 ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
14935 ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
14936 ancestor->baseType);
14937 ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
14950xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr
item,
14951 xmlSchemaParserCtxtPtr ctxt)
14954 (
item->
type == XML_SCHEMA_TYPE_BASIC) ||
14957 xmlSchemaCheckTypeDefCircularInternal(ctxt,
item,
14975xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
14976 xmlSchemaTypePtr ctxType,
14977 xmlSchemaTypeLinkPtr members)
14979 xmlSchemaTypeLinkPtr
member;
14980 xmlSchemaTypePtr memberType;
14985 while ((memberType !=
NULL) &&
14986 (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
14987 if (memberType == ctxType) {
14988 xmlSchemaPCustomErr(pctxt,
14990 WXS_BASIC_CAST ctxType,
NULL,
14991 "The union type definition is circular",
NULL);
14994 if ((WXS_IS_UNION(memberType)) &&
14995 ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
14998 memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
14999 res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
15001 xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
15002 memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
15006 memberType = memberType->baseType;
15014xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
15015 xmlSchemaTypePtr
type)
15017 if (! WXS_IS_UNION(
type))
15019 return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
type,
15020 type->memberTypes));
15032xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
15033 xmlSchemaParserCtxtPtr ctxt)
15035 if (typeDef ==
NULL)
15041 if (typeDef->baseType ==
NULL) {
15042 typeDef->baseType = xmlSchemaGetType(ctxt->schema,
15043 typeDef->base, typeDef->baseNs);
15044 if (typeDef->baseType ==
NULL) {
15045 xmlSchemaPResCompAttrErr(ctxt,
15047 WXS_BASIC_CAST typeDef, typeDef->node,
15048 "base", typeDef->base, typeDef->baseNs,
15049 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15053 if (WXS_IS_SIMPLE(typeDef)) {
15054 if (WXS_IS_UNION(typeDef)) {
15058 xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
15060 }
else if (WXS_IS_LIST(typeDef)) {
15064 if ((typeDef->subtypes ==
NULL) && (typeDef->base !=
NULL)) {
15066 typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
15067 typeDef->base, typeDef->baseNs);
15069 if ((typeDef->subtypes ==
NULL) ||
15070 (! WXS_IS_SIMPLE(typeDef->subtypes)))
15072 typeDef->subtypes =
NULL;
15073 xmlSchemaPResCompAttrErr(ctxt,
15075 WXS_BASIC_CAST typeDef, typeDef->node,
15076 "itemType", typeDef->base, typeDef->baseNs,
15077 XML_SCHEMA_TYPE_SIMPLE,
NULL);
15088 else if ((WXS_TYPE_CONTENTTYPE(typeDef) !=
NULL) &&
15089 ((WXS_TYPE_CONTENTTYPE(typeDef))->
type ==
15090 XML_SCHEMA_TYPE_PARTICLE) &&
15091 (WXS_TYPE_PARTICLE_TERM(typeDef) !=
NULL) &&
15092 ((WXS_TYPE_PARTICLE_TERM(typeDef))->
type ==
15093 XML_SCHEMA_EXTRA_QNAMEREF))
15095 xmlSchemaQNameRefPtr
ref =
15096 WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
15097 xmlSchemaModelGroupDefPtr groupDef;
15102 WXS_TYPE_PARTICLE_TERM(typeDef) =
NULL;
15107 WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
15109 if (groupDef ==
NULL) {
15111 NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
15115 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15116 }
else if (WXS_MODELGROUPDEF_MODEL(groupDef) ==
NULL)
15118 WXS_TYPE_CONTENTTYPE(typeDef) =
NULL;
15124 WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
15126 if (WXS_MODELGROUPDEF_MODEL(groupDef)->
type == XML_SCHEMA_TYPE_ALL) {
15133 if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
15134 xmlSchemaCustomErr(ACTXT_CAST ctxt,
15137 WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
NULL,
15138 "The particle's {max occurs} must be 1, since the "
15139 "reference resolves to an 'all' model group",
15161xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
15162 xmlSchemaTypePtr
type)
15164 xmlSchemaTypePtr baseType =
type->baseType;
15178 if (baseType ==
NULL) {
15183 xmlSchemaPCustomErr(ctxt,
15186 "No base type existent",
NULL);
15190 if (! WXS_IS_SIMPLE(baseType)) {
15191 xmlSchemaPCustomErr(ctxt,
15194 "The base type '%s' is not a simple type",
15195 xmlSchemaGetComponentQName(&
str, baseType));
15199 if ((WXS_IS_LIST(
type) || WXS_IS_UNION(
type)) &&
15200 (WXS_IS_RESTRICTION(
type) == 0) &&
15201 ((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) &&
15202 (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) {
15203 xmlSchemaPCustomErr(ctxt,
15206 "A type, derived by list or union, must have "
15207 "the simple ur-type definition as base type, not '%s'",
15208 xmlSchemaGetComponentQName(&
str, baseType));
15215 if ((! WXS_IS_ATOMIC(
type)) && (! WXS_IS_UNION(
type)) &&
15216 (! WXS_IS_LIST(
type))) {
15217 xmlSchemaPCustomErr(ctxt,
15220 "The variety is absent",
NULL);
15228 if (xmlSchemaTypeFinalContains(baseType,
15229 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15230 xmlSchemaPCustomErr(ctxt,
15233 "The 'final' of its base type '%s' must not contain "
15235 xmlSchemaGetComponentQName(&
str, baseType));
15266xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
15267 xmlSchemaTypePtr
type)
15271 if (
type->type != XML_SCHEMA_TYPE_SIMPLE) {
15272 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15273 "given type is not a user-derived simpleType");
15277 if (WXS_IS_ATOMIC(
type)) {
15278 xmlSchemaTypePtr primitive;
15283 if (! WXS_IS_ATOMIC(
type->baseType)) {
15284 xmlSchemaPCustomErr(pctxt,
15287 "The base type '%s' is not an atomic simple type",
15288 xmlSchemaGetComponentQName(&
str,
type->baseType));
15296 if (xmlSchemaTypeFinalContains(
type->baseType,
15297 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15298 xmlSchemaPCustomErr(pctxt,
15301 "The final of its base type '%s' must not contain 'restriction'",
15302 xmlSchemaGetComponentQName(&
str,
type->baseType));
15313 xmlSchemaFacetPtr facet;
15316 primitive = xmlSchemaGetPrimitiveType(
type);
15317 if (primitive ==
NULL) {
15318 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15319 "failed to get primitive type");
15322 facet =
type->facets;
15324 if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
15326 xmlSchemaPIllegalFacetAtomicErr(pctxt,
15328 type, primitive, facet);
15330 facet = facet->next;
15331 }
while (facet !=
NULL);
15344 }
else if (WXS_IS_LIST(
type)) {
15345 xmlSchemaTypePtr itemType =
NULL;
15347 itemType =
type->subtypes;
15348 if ((itemType ==
NULL) || (! WXS_IS_SIMPLE(itemType))) {
15349 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15350 "failed to evaluate the item type");
15353 if (WXS_IS_TYPE_NOT_FIXED(itemType))
15354 xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
15360 if ((! WXS_IS_ATOMIC(itemType)) &&
15361 (! WXS_IS_UNION(itemType))) {
15362 xmlSchemaPCustomErr(pctxt,
15365 "The item type '%s' does not have a variety of atomic or union",
15366 xmlSchemaGetComponentQName(&
str, itemType));
15369 }
else if (WXS_IS_UNION(itemType)) {
15370 xmlSchemaTypeLinkPtr
member;
15372 member = itemType->memberTypes;
15375 xmlSchemaPCustomErr(pctxt,
15378 "The item type is a union type, but the "
15379 "member type '%s' of this item type is not atomic",
15388 if (WXS_IS_ANY_SIMPLE_TYPE(
type->baseType)) {
15389 xmlSchemaFacetPtr facet;
15398 if (xmlSchemaTypeFinalContains(itemType,
15399 XML_SCHEMAS_TYPE_FINAL_LIST)) {
15400 xmlSchemaPCustomErr(pctxt,
15403 "The final of its item type '%s' must not contain 'list'",
15404 xmlSchemaGetComponentQName(&
str, itemType));
15415 facet =
type->facets;
15417 if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
15418 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15423 facet = facet->next;
15424 }
while (facet !=
NULL);
15442 if (! WXS_IS_LIST(
type->baseType)) {
15443 xmlSchemaPCustomErr(pctxt,
15446 "The base type '%s' must be a list type",
15447 xmlSchemaGetComponentQName(&
str,
type->baseType));
15455 if (xmlSchemaTypeFinalContains(
type->baseType,
15456 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15457 xmlSchemaPCustomErr(pctxt,
15460 "The 'final' of the base type '%s' must not contain 'restriction'",
15461 xmlSchemaGetComponentQName(&
str,
type->baseType));
15471 xmlSchemaTypePtr baseItemType;
15473 baseItemType =
type->baseType->subtypes;
15474 if ((baseItemType ==
NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
15475 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15476 "failed to eval the item type of a base type");
15479 if ((itemType != baseItemType) &&
15480 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
15481 baseItemType, 0) != 0)) {
15483 xmlSchemaPCustomErrExt(pctxt,
15486 "The item type '%s' is not validly derived from "
15487 "the item type '%s' of the base type '%s'",
15488 xmlSchemaGetComponentQName(&
str, itemType),
15489 xmlSchemaGetComponentQName(&strBIT, baseItemType),
15490 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15493 FREE_AND_NULL(strBIT)
15494 FREE_AND_NULL(strBT)
15500 xmlSchemaFacetPtr facet;
15506 facet =
type->facets;
15508 switch (facet->type) {
15509 case XML_SCHEMA_FACET_LENGTH:
15510 case XML_SCHEMA_FACET_MINLENGTH:
15511 case XML_SCHEMA_FACET_MAXLENGTH:
15512 case XML_SCHEMA_FACET_WHITESPACE:
15517 case XML_SCHEMA_FACET_PATTERN:
15518 case XML_SCHEMA_FACET_ENUMERATION:
15521 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15531 facet = facet->
next;
15532 }
while (facet !=
NULL);
15543 }
else if (WXS_IS_UNION(
type)) {
15548 xmlSchemaTypeLinkPtr
member;
15553 xmlSchemaTypeFixup(
member->
type, ACTXT_CAST pctxt);
15557 xmlSchemaPCustomErr(pctxt,
15560 "The member type '%s' is neither an atomic, nor a list type",
15571 if (
type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
15578 if (xmlSchemaTypeFinalContains(
member->
type,
15579 XML_SCHEMAS_TYPE_FINAL_UNION)) {
15580 xmlSchemaPCustomErr(pctxt,
15583 "The 'final' of member type '%s' contains 'union'",
15594 xmlSchemaPCustomErr(pctxt,
15597 "No facets allowed",
NULL);
15605 if (! WXS_IS_UNION(
type->baseType)) {
15606 xmlSchemaPCustomErr(pctxt,
15609 "The base type '%s' is not a union type",
15610 xmlSchemaGetComponentQName(&
str,
type->baseType));
15617 if (xmlSchemaTypeFinalContains(
type->baseType,
15618 XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15619 xmlSchemaPCustomErr(pctxt,
15622 "The 'final' of its base type '%s' must not contain 'restriction'",
15623 xmlSchemaGetComponentQName(&
str,
type->baseType));
15634 xmlSchemaTypeLinkPtr baseMember;
15650 baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(
type->baseType);
15652 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15653 "different number of member types in base");
15656 if (baseMember ==
NULL) {
15657 PERROR_INT(
"xmlSchemaCheckCOSSTRestricts",
15658 "different number of member types in base");
15659 }
else if ((
member->
type != baseMember->type) &&
15660 (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
15664 xmlSchemaPCustomErrExt(pctxt,
15667 "The member type %s is not validly "
15668 "derived from its corresponding member "
15669 "type %s of the base type %s",
15671 xmlSchemaGetComponentQName(&strBMT, baseMember->type),
15672 xmlSchemaGetComponentQName(&strBT,
type->baseType));
15674 FREE_AND_NULL(strBMT)
15675 FREE_AND_NULL(strBT)
15679 if (baseMember !=
NULL)
15680 baseMember = baseMember->next;
15689 xmlSchemaFacetPtr facet;
15692 facet =
type->facets;
15694 if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
15695 (facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
15696 xmlSchemaPIllegalFacetListUnionErr(pctxt,
15701 facet = facet->
next;
15702 }
while (facet !=
NULL);
15732xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
15733 xmlSchemaTypePtr
type)
15740 if (WXS_IS_RESTRICTION(
type)) {
15750 }
else if (WXS_IS_LIST(
type)) {
15757 }
else if (WXS_IS_UNION(
type)) {
15767xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
15769 if (ctxt->vctxt ==
NULL) {
15770 ctxt->vctxt = xmlSchemaNewValidCtxt(
NULL);
15771 if (ctxt->vctxt ==
NULL) {
15772 xmlSchemaPErr(ctxt,
NULL,
15774 "Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
15775 "failed to create a temp. validation context.\n",
15780 xmlSchemaSetValidErrors(ctxt->vctxt,
15781 ctxt->error, ctxt->warning, ctxt->errCtxt);
15782 xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
15783 ctxt->serror, ctxt->errCtxt);
15789xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
15791 xmlSchemaTypePtr
type,
15793 xmlSchemaValPtr *retVal,
15815xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
15817 xmlSchemaTypePtr
type,
15819 xmlSchemaValPtr *
val)
15829 if WXS_IS_COMPLEX(
type) {
15839 if ((! WXS_HAS_SIMPLE_CONTENT(
type)) &&
15840 ((! WXS_HAS_MIXED_CONTENT(
type)) || (! WXS_EMPTIABLE(
type)))) {
15842 xmlSchemaPCustomErr(pctxt,
15845 "For a string to be a valid default, the type definition "
15846 "must be a simple type or a complex type with mixed content "
15847 "and a particle emptiable",
NULL);
15862 if (WXS_IS_SIMPLE(
type))
15863 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15865 else if (WXS_HAS_SIMPLE_CONTENT(
type))
15866 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
node,
15872 PERROR_INT(
"xmlSchemaParseCheckCOSValidDefault",
15873 "calling xmlSchemaVCheckCVCSimpleType()");
15893xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
15894 xmlSchemaTypePtr
type)
15905 (WXS_IS_SIMPLE(
type->baseType)) &&
15906 (WXS_IS_EXTENSION(
type) == 0)) {
15911 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15914 "If the base type is a simple type, the derivation method must be "
15931 if (
type->attrUses &&
15932 (((xmlSchemaItemListPtr)
type->attrUses)->nbItems > 1))
15934 xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr)
type->attrUses;
15935 xmlSchemaAttributeUsePtr use, tmp;
15936 int i,
j, hasId = 0;
15938 for (
i = uses->nbItems -1;
i >= 0;
i--) {
15939 use = uses->items[
i];
15948 for (
j =
i -1;
j >= 0;
j--) {
15949 tmp = uses->items[
j];
15950 if ((WXS_ATTRUSE_DECL_NAME(use) ==
15951 WXS_ATTRUSE_DECL_NAME(tmp)) &&
15952 (WXS_ATTRUSE_DECL_TNS(use) ==
15953 WXS_ATTRUSE_DECL_TNS(tmp)))
15957 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15961 xmlSchemaGetComponentDesignation(&
str, use),
15963 FREE_AND_NULL(
str);
15967 if (xmlSchemaItemListRemove(uses,
i) == -1)
15979 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
15980 if (xmlSchemaIsDerivedFromBuiltInType(
15981 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
15986 xmlSchemaCustomErr(ACTXT_CAST pctxt,
15989 "There must not exist more than one attribute "
15990 "declaration of type 'xs:ID' "
15991 "(or derived from 'xs:ID'). The %s violates this "
15993 xmlSchemaGetComponentDesignation(&
str, use),
15995 FREE_AND_NULL(
str);
15996 if (xmlSchemaItemListRemove(uses,
i) == -1)
16012xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
16013 xmlSchemaTypePtr typeB)
16019 if ((typeA ==
NULL) || (typeB ==
NULL))
16021 return (typeA == typeB);
16040xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16041 xmlSchemaTypePtr
type,
16042 xmlSchemaTypePtr baseType,
16045 int equal = xmlSchemaAreEqualTypes(
type, baseType);
16058 if (((
set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(
type))) ||
16059 ((
set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(
type))))
16070 if (
type->baseType == baseType)
16076 if (WXS_IS_ANYTYPE(
type->baseType))
16079 if (WXS_IS_COMPLEX(
type->baseType)) {
16085 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type->baseType,
16093 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type->baseType,
16111xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16112 xmlSchemaTypePtr
type,
16113 xmlSchemaTypePtr baseType,
16116 if (WXS_IS_SIMPLE(
type))
16117 return (xmlSchemaCheckCOSSTDerivedOK(actxt,
type, baseType,
set));
16119 return (xmlSchemaCheckCOSCTDerivedOK(actxt,
type, baseType,
set));
16140xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
16141 xmlSchemaTypePtr
type)
16143 xmlSchemaTypePtr
base =
type->baseType;
16152 if (WXS_IS_COMPLEX(
base)) {
16157 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16158 xmlSchemaPCustomErr(ctxt,
16161 "The 'final' of the base type definition "
16162 "contains 'extension'",
NULL);
16186 xmlSchemaAttributeUsePtr use, buse;
16188 for (
i = 0;
i < (WXS_LIST_CAST
base->attrUses)->nbItems;
i ++) {
16189 buse = (WXS_LIST_CAST
base->attrUses)->
items[
i];
16192 use = (WXS_LIST_CAST
type->attrUses)->
items[
j];
16193 for (
j = 0;
j < (WXS_LIST_CAST
type->attrUses)->nbItems;
j ++)
16195 if ((WXS_ATTRUSE_DECL_NAME(use) ==
16196 WXS_ATTRUSE_DECL_NAME(buse)) &&
16197 (WXS_ATTRUSE_DECL_TNS(use) ==
16198 WXS_ATTRUSE_DECL_TNS(buse)) &&
16199 (WXS_ATTRUSE_TYPEDEF(use) ==
16200 WXS_ATTRUSE_TYPEDEF(buse))
16210 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16217 "This type is missing a matching correspondent "
16218 "for its {base type}'s %s in its {attribute uses}",
16219 xmlSchemaGetComponentDesignation(&
str,
16238 if (
base->attributeWildcard !=
NULL) {
16239 if (
type->attributeWildcard ==
NULL) {
16242 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16245 "The base %s has an attribute wildcard, "
16246 "but this type is missing an attribute wildcard",
16247 xmlSchemaGetComponentDesignation(&
str,
base));
16250 }
else if (xmlSchemaCheckCOSNSSubset(
16251 base->attributeWildcard,
type->attributeWildcard))
16255 xmlSchemaCustomErr(ACTXT_CAST pctxt,
16258 "The attribute wildcard is not a valid "
16259 "superset of the one in the base %s",
16260 xmlSchemaGetComponentDesignation(&
str,
base));
16268 if ((
type->contentTypeDef !=
NULL) &&
16269 (
type->contentTypeDef ==
base->contentTypeDef)) {
16276 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
16277 (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
16293 xmlSchemaPCustomErr(ctxt,
16296 "The content type must specify a particle",
NULL);
16302 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16312 if ((
type->contentType !=
base->contentType) ||
16313 ((
type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
16314 (
type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
16319 xmlSchemaPCustomErr(ctxt,
16322 "The content type of both, the type and its base "
16323 "type, must either 'mixed' or 'element-only'",
NULL);
16348 if (
type->contentTypeDef !=
base) {
16353 xmlSchemaPCustomErr(ctxt,
16356 "The content type must be the simple base type",
NULL);
16359 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16365 xmlSchemaPCustomErr(ctxt,
16368 "The 'final' of the base type definition "
16369 "contains 'extension'",
NULL);
16397xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
16398 xmlSchemaTypePtr
type)
16400 xmlSchemaTypePtr
base;
16407 if (! WXS_IS_COMPLEX(
base)) {
16408 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16411 "The base type must be a complex type",
NULL,
NULL);
16414 if (
base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
16419 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16422 "The 'final' of the base type definition "
16423 "contains 'restriction'",
NULL,
NULL);
16424 return (ctxt->err);
16432 if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
16433 XML_SCHEMA_ACTION_DERIVE,
16434 WXS_BASIC_CAST
type, WXS_BASIC_CAST
base,
16436 type->attributeWildcard,
16437 base->attributeWildcard) == -1)
16444 if (
base->builtInType == XML_SCHEMAS_ANYTYPE) {
16450 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16451 (
type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16458 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16459 (
base->contentType == XML_SCHEMA_CONTENT_BASIC))
16472 err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
16473 type->contentTypeDef,
base->contentTypeDef, 0);
16479 xmlSchemaCustomErr(ACTXT_CAST ctxt,
16482 "The {content type} %s is not validly derived from the "
16483 "base type's {content type} %s",
16484 xmlSchemaGetComponentDesignation(&
strA,
16485 type->contentTypeDef),
16486 xmlSchemaGetComponentDesignation(&strB,
16487 base->contentTypeDef));
16488 FREE_AND_NULL(
strA);
16489 FREE_AND_NULL(strB);
16492 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16493 (xmlSchemaIsParticleEmptiable(
16494 (xmlSchemaParticlePtr)
base->subtypes))) {
16502 xmlSchemaPCustomErr(ctxt,
16505 "The content type of the base type must be either "
16506 "a simple type or 'mixed' and an emptiable particle",
NULL);
16507 return (ctxt->err);
16509 }
else if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16514 if (
base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16520 }
else if (((
base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16521 (
base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
16522 xmlSchemaIsParticleEmptiable(
16523 (xmlSchemaParticlePtr)
base->subtypes)) {
16531 xmlSchemaPCustomErr(ctxt,
16534 "The content type of the base type must be either "
16535 "empty or 'mixed' (or 'elements-only') and an emptiable "
16537 return (ctxt->err);
16539 }
else if ((
type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16540 WXS_HAS_MIXED_CONTENT(
type)) {
16545 if (WXS_HAS_MIXED_CONTENT(
type) && (! WXS_HAS_MIXED_CONTENT(
base))) {
16551 xmlSchemaPCustomErr(ctxt,
16554 "If the content type is 'mixed', then the content type of the "
16555 "base type must also be 'mixed'",
NULL);
16556 return (ctxt->err);
16567 xmlSchemaPCustomErr(ctxt,
16570 "The type is not a valid restriction of its base type",
NULL);
16571 return (ctxt->err);
16587xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
16588 xmlSchemaTypePtr
type)
16594 ret = xmlSchemaCheckCTPropsCorrect(ctxt,
type);
16597 if (WXS_IS_EXTENSION(
type))
16598 ret = xmlSchemaCheckCOSCTExtends(ctxt,
type);
16600 ret = xmlSchemaCheckDerivationOKRestriction(ctxt,
type);
16617xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
16618 xmlSchemaTypePtr
type)
16620 xmlSchemaTypePtr
base;
16628 if (! WXS_HAS_SIMPLE_CONTENT(
type)) {
16634 if (! WXS_IS_COMPLEX(
base)) {
16636 xmlSchemaPCustomErr(ctxt,
16639 "If using <complexContent>, the base type is expected to be "
16640 "a complex type. The base type '%s' is a simple type",
16641 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16654 if (WXS_IS_SIMPLE(
base)) {
16655 if (WXS_IS_EXTENSION(
type) == 0) {
16662 xmlSchemaPCustomErr(ctxt,
16665 "If using <simpleContent> and <restriction>, the base "
16666 "type must be a complex type. The base type '%s' is "
16668 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16675 if ((
base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16676 (
base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16682 if (
base->contentTypeDef ==
NULL) {
16685 "Internal error: xmlSchemaCheckSRCCT, "
16686 "'%s', base type has no content type",
16690 }
else if ((
base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16691 (WXS_IS_RESTRICTION(
type))) {
16698 if (! xmlSchemaIsParticleEmptiable(
16699 (xmlSchemaParticlePtr)
base->subtypes)) {
16706 if (
type->contentTypeDef ==
NULL) {
16714 xmlSchemaPCustomErr(ctxt,
16717 "A <simpleType> is expected among the children "
16718 "of <restriction>, if <simpleContent> is used and "
16719 "the base type '%s' is a complex type",
16720 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16731 if (WXS_IS_RESTRICTION(
type)) {
16732 xmlSchemaPCustomErr(ctxt,
16735 "If <simpleContent> and <restriction> is used, the "
16736 "base type must be a simple type or a complex type with "
16737 "mixed content and particle emptiable. The base type "
16738 "'%s' is none of those",
16739 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16742 xmlSchemaPCustomErr(ctxt,
16745 "If <simpleContent> and <extension> is used, the "
16746 "base type must be a simple type. The base type '%s' "
16747 "is a complex type",
16748 xmlSchemaFormatQName(&
str,
base->targetNamespace,
16770#ifdef ENABLE_PARTICLE_RESTRICTION
16786xmlSchemaCheckParticleRangeOK(
int rmin,
int rmax,
16787 int bmin,
int bmax)
16791 if ((bmax != UNBOUNDED) &&
16816xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
16817 xmlSchemaParticlePtr
r,
16818 xmlSchemaParticlePtr
b)
16820 xmlSchemaElementPtr elemR, elemB;
16823 elemR = (xmlSchemaElementPtr)
r->children;
16824 elemB = (xmlSchemaElementPtr)
b->children;
16829 if ((elemR != elemB) &&
16831 (!
xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
16837 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
16838 b->minOccurs,
b->maxOccurs) != 0)
16844 if (elemR == elemB)
16849 if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
16850 (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
16857 if ((elemB->value !=
NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
16858 ((elemR->value ==
NULL) ||
16859 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
16868 if (elemB->idcs !=
NULL) {
16875 if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
16876 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
16877 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
16878 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
16879 ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
16880 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
16894 set |= SUBSET_EXTENSION;
16895 set |= SUBSET_LIST;
16896 set |= SUBSET_UNION;
16897 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
16898 elemB->subtypes,
set) != 0)
16921xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
16922 xmlSchemaParticlePtr
r,
16923 xmlSchemaParticlePtr
b)
16934 if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr)
b->children,
16935 ((xmlSchemaElementPtr)
r->children)->targetNamespace) != 0)
16941 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
16942 b->minOccurs,
b->maxOccurs) != 0)
16965xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
16966 xmlSchemaParticlePtr
r,
16967 xmlSchemaParticlePtr
b)
16991xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
16992 xmlSchemaParticlePtr
r,
16993 xmlSchemaParticlePtr
b,
17001 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17002 b->minOccurs,
b->maxOccurs))
17008 if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr)
r->children,
17009 (xmlSchemaWildcardPtr)
b->children))
17017 if (! isAnyTypeBase) {
17018 if ( ((xmlSchemaWildcardPtr)
r->children)->processContents <
17019 ((xmlSchemaWildcardPtr)
b->children)->processContents)
17041xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
17042 xmlSchemaParticlePtr
r,
17043 xmlSchemaParticlePtr
b)
17082xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
17083 xmlSchemaParticlePtr
r,
17084 xmlSchemaParticlePtr
b)
17086 xmlSchemaParticlePtr part;
17088 if ((
r->children ==
NULL) || (
r->children->children ==
NULL))
17098 part = (xmlSchemaParticlePtr)
r->children->children;
17100 if (xmlSchemaCheckCOSParticleRestrict(ctxt, part,
b))
17102 part = (xmlSchemaParticlePtr) part->next;
17103 }
while (part !=
NULL);
17109 if (xmlSchemaCheckParticleRangeOK(
17110 xmlSchemaGetParticleTotalRangeMin(
r),
17111 xmlSchemaGetParticleTotalRangeMax(
r),
17112 b->minOccurs,
b->maxOccurs) != 0)
17137xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
17138 xmlSchemaParticlePtr
r,
17139 xmlSchemaParticlePtr
b)
17143 if ((
r->children ==
NULL) || (
b->children ==
NULL) ||
17144 (
r->children->type !=
b->children->type))
17153 if (xmlSchemaCheckParticleRangeOK(
r->minOccurs,
r->maxOccurs,
17154 b->minOccurs,
b->maxOccurs))
17163#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
17164 xmlSchemaPCustomErrExt(pctxt, \
17165 XML_SCHEMAP_INVALID_FACET_VALUE, \
17166 WXS_BASIC_CAST fac1, fac1->node, \
17167 "It is an error for both '%s' and '%s' to be specified on the "\
17168 "same type definition", \
17169 BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
17170 BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
17172#define FACET_RESTR_ERR(fac1, msg) \
17173 xmlSchemaPCustomErr(pctxt, \
17174 XML_SCHEMAP_INVALID_FACET_VALUE, \
17175 WXS_BASIC_CAST fac1, fac1->node, \
17178#define FACET_RESTR_FIXED_ERR(fac) \
17179 xmlSchemaPCustomErr(pctxt, \
17180 XML_SCHEMAP_INVALID_FACET_VALUE, \
17181 WXS_BASIC_CAST fac, fac->node, \
17182 "The base type's facet is 'fixed', thus the value must not " \
17186xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
17187 xmlSchemaFacetPtr facet1,
17188 xmlSchemaFacetPtr facet2,
17198 if (lessGreater == 0)
17200 if (lessGreater == 1)
17214 xmlSchemaPCustomErr(pctxt,
17216 WXS_BASIC_CAST facet1,
NULL,
17230xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
17231 xmlSchemaTypePtr
type)
17233 xmlSchemaTypePtr
base =
type->baseType;
17235 xmlSchemaFacetPtr facet, bfacet,
17279 facet =
cur->facet;
17280 switch (facet->type) {
17281 case XML_SCHEMA_FACET_LENGTH:
17282 flength = facet;
break;
17283 case XML_SCHEMA_FACET_MINLENGTH:
17284 fminlen = facet;
break;
17285 case XML_SCHEMA_FACET_MININCLUSIVE:
17286 fmininc = facet;
break;
17287 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17288 fminexc = facet;
break;
17289 case XML_SCHEMA_FACET_MAXLENGTH:
17290 fmaxlen = facet;
break;
17291 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17292 fmaxinc = facet;
break;
17293 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17294 fmaxexc = facet;
break;
17295 case XML_SCHEMA_FACET_TOTALDIGITS:
17296 ftotdig = facet;
break;
17297 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17298 ffracdig = facet;
break;
17304 facet =
cur->facet;
17305 switch (facet->type) {
17306 case XML_SCHEMA_FACET_LENGTH:
17307 bflength = facet;
break;
17308 case XML_SCHEMA_FACET_MINLENGTH:
17309 bfminlen = facet;
break;
17310 case XML_SCHEMA_FACET_MININCLUSIVE:
17311 bfmininc = facet;
break;
17312 case XML_SCHEMA_FACET_MINEXCLUSIVE:
17313 bfminexc = facet;
break;
17314 case XML_SCHEMA_FACET_MAXLENGTH:
17315 bfmaxlen = facet;
break;
17316 case XML_SCHEMA_FACET_MAXINCLUSIVE:
17317 bfmaxinc = facet;
break;
17318 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17319 bfmaxexc = facet;
break;
17320 case XML_SCHEMA_FACET_TOTALDIGITS:
17321 bftotdig = facet;
break;
17322 case XML_SCHEMA_FACET_FRACTIONDIGITS:
17323 bffracdig = facet;
break;
17331 if (flength && (fminlen || fmaxlen)) {
17332 FACET_RESTR_ERR(flength,
"It is an error for both 'length' and "
17333 "either of 'minLength' or 'maxLength' to be specified on "
17334 "the same type definition")
17339 if ((fmaxinc) && (fmaxexc)) {
17343 FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
17345 if ((fmininc) && (fminexc)) {
17349 FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
17352 if (flength && bflength) {
17357 res = xmlSchemaCompareValues(flength->val, bflength->val);
17359 goto internal_error;
17361 xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
17362 if ((
res != 0) && (bflength->fixed)) {
17363 FACET_RESTR_FIXED_ERR(flength)
17367 if (fminlen && bfminlen) {
17372 res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
17374 goto internal_error;
17376 xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
17377 if ((
res != 0) && (bfminlen->fixed)) {
17378 FACET_RESTR_FIXED_ERR(fminlen)
17381 if (fmaxlen && bfmaxlen) {
17386 res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
17388 goto internal_error;
17390 xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
17391 if ((
res != 0) && (bfmaxlen->fixed)) {
17392 FACET_RESTR_FIXED_ERR(fmaxlen)
17399 flength = bflength;
17402 fminlen = bfminlen;
17405 res = xmlSchemaCompareValues(flength->val, fminlen->val);
17407 goto internal_error;
17409 xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
17412 fmaxlen = bfmaxlen;
17415 res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
17417 goto internal_error;
17419 xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
17428 res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
17430 goto internal_error;
17432 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
17440 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
17442 goto internal_error;
17444 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
17445 if ((
res != 0) && (bfmaxinc->fixed)) {
17446 FACET_RESTR_FIXED_ERR(fmaxinc)
17451 res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
17453 goto internal_error;
17455 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
17460 res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
17462 goto internal_error;
17464 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
17469 res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
17471 goto internal_error;
17473 xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
17482 res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
17484 goto internal_error;
17486 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
17494 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
17496 goto internal_error;
17498 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
17500 if ((
res != 0) && (bfmaxexc->fixed)) {
17501 FACET_RESTR_FIXED_ERR(fmaxexc)
17506 res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
17508 goto internal_error;
17510 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
17515 res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
17517 goto internal_error;
17519 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
17524 res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
17526 goto internal_error;
17528 xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
17537 res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
17539 goto internal_error;
17541 xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
17549 res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
17551 goto internal_error;
17553 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
17555 if ((
res != 0) && (bfminexc->fixed)) {
17556 FACET_RESTR_FIXED_ERR(fminexc)
17561 res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
17563 goto internal_error;
17565 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
17570 res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
17572 goto internal_error;
17574 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
17579 res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
17581 goto internal_error;
17583 xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
17592 res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
17594 goto internal_error;
17596 xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
17604 res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
17606 goto internal_error;
17608 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
17610 if ((
res != 0) && (bfmininc->fixed)) {
17611 FACET_RESTR_FIXED_ERR(fmininc)
17616 res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
17618 goto internal_error;
17620 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
17625 res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
17627 goto internal_error;
17629 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
17633 res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
17635 goto internal_error;
17637 xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
17640 if (ftotdig && bftotdig) {
17645 res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
17647 goto internal_error;
17649 xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
17651 if ((
res != 0) && (bftotdig->fixed)) {
17652 FACET_RESTR_FIXED_ERR(ftotdig)
17655 if (ffracdig && bffracdig) {
17660 res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
17662 goto internal_error;
17664 xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
17666 if ((
res != 0) && (bffracdig->fixed)) {
17667 FACET_RESTR_FIXED_ERR(ffracdig)
17674 ftotdig = bftotdig;
17676 ffracdig = bffracdig;
17677 if (ftotdig && ffracdig) {
17678 res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
17680 goto internal_error;
17682 xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
17697 bfacet =
cur->facet;
17702 if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
17703 (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
17712 facet =
link->facet;
17713 if (facet->type == bfacet->type) {
17714 switch (facet->type) {
17715 case XML_SCHEMA_FACET_WHITESPACE:
17719 if (facet->whitespace < bfacet->whitespace) {
17720 FACET_RESTR_ERR(facet,
17721 "The 'whitespace' value has to be equal to "
17722 "or stronger than the 'whitespace' value of "
17725 if ((bfacet->fixed) &&
17726 (facet->whitespace != bfacet->whitespace)) {
17727 FACET_RESTR_FIXED_ERR(facet)
17743 link = (xmlSchemaFacetLinkPtr)
17746 xmlSchemaPErrMemory(pctxt,
17747 "deriving facets, creating a facet link",
NULL);
17763 PERROR_INT(
"xmlSchemaDeriveAndValidateFacets",
17764 "an error occurred");
17769xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
17770 xmlSchemaTypePtr
type)
17772 xmlSchemaTypeLinkPtr
link, lastLink, prevLink, subLink, newLink;
17785 if (WXS_IS_TYPE_NOT_FIXED(
link->type))
17786 xmlSchemaTypeFixup(
link->type, ACTXT_CAST pctxt);
17788 if (WXS_IS_UNION(
link->type)) {
17789 subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
link->type);
17790 if (subLink !=
NULL) {
17791 link->type = subLink->type;
17792 if (subLink->next !=
NULL) {
17793 lastLink =
link->next;
17794 subLink = subLink->next;
17796 while (subLink !=
NULL) {
17797 newLink = (xmlSchemaTypeLinkPtr)
17799 if (newLink ==
NULL) {
17800 xmlSchemaPErrMemory(pctxt,
"allocating a type link",
17804 newLink->type = subLink->type;
17805 prevLink->next = newLink;
17806 prevLink = newLink;
17807 newLink->next = lastLink;
17809 subLink = subLink->next;
17820xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr
type)
17822 int has = 0, needVal = 0, normVal = 0;
17824 has = (
type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
17826 needVal = (
type->baseType->flags &
17827 XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
17828 normVal = (
type->baseType->flags &
17829 XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
17832 xmlSchemaFacetPtr fac;
17834 for (fac =
type->facets; fac !=
NULL; fac = fac->
next) {
17835 switch (fac->type) {
17836 case XML_SCHEMA_FACET_WHITESPACE:
17838 case XML_SCHEMA_FACET_PATTERN:
17842 case XML_SCHEMA_FACET_ENUMERATION:
17854 type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
17856 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17858 type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
17860 if (has && (! needVal) && WXS_IS_ATOMIC(
type)) {
17861 xmlSchemaTypePtr
prim = xmlSchemaGetPrimitiveType(
type);
17865 if ((
prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
17866 (
prim->builtInType != XML_SCHEMAS_STRING)) {
17867 type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17873xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr
type)
17880 if (WXS_IS_LIST(
type)) {
17881 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17883 }
else if (WXS_IS_UNION(
type))
17887 xmlSchemaFacetLinkPtr lin;
17889 for (lin =
type->facetSet; lin !=
NULL; lin = lin->
next) {
17890 if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
17891 switch (lin->facet->whitespace) {
17892 case XML_SCHEMAS_FACET_PRESERVE:
17893 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17895 case XML_SCHEMAS_FACET_REPLACE:
17896 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17898 case XML_SCHEMAS_FACET_COLLAPSE:
17899 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17914 xmlSchemaTypePtr anc;
17916 for (anc =
type->baseType; anc !=
NULL &&
17917 anc->builtInType != XML_SCHEMAS_ANYTYPE;
17918 anc = anc->baseType) {
17920 if (anc->type == XML_SCHEMA_TYPE_BASIC) {
17921 if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
17922 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17924 }
else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
17925 (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
17926 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17929 type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17938xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
17939 xmlSchemaTypePtr
type)
17941 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
17943 if (! WXS_IS_TYPE_NOT_FIXED_1(
type))
17945 type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
17947 if (WXS_IS_LIST(
type)) {
17955 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17956 "list type has no item-type assigned");
17959 }
else if (WXS_IS_UNION(
type)) {
17967 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17968 "union type has no member-types assigned");
17976 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageOne",
17977 "type has no base-type assigned");
17980 if (WXS_IS_TYPE_NOT_FIXED_1(
type->baseType))
17981 if (xmlSchemaFixupSimpleTypeStageOne(pctxt,
type->baseType) == -1)
17988 if (WXS_IS_ATOMIC(
type->baseType))
17989 type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
17990 else if (WXS_IS_LIST(
type->baseType)) {
17991 type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
17995 type->subtypes =
type->baseType->subtypes;
17996 }
else if (WXS_IS_UNION(
type->baseType)) {
17997 type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
18012xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
18013 xmlSchemaTypePtr
type)
18015 int res, olderrs = pctxt->nberrors;
18017 if (
type->type != XML_SCHEMA_TYPE_SIMPLE)
18020 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18023 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18024 type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
18027 PERROR_INT(
"xmlSchemaFixupSimpleTypeStageTwo",
18028 "missing baseType");
18031 if (WXS_IS_TYPE_NOT_FIXED(
type->baseType))
18032 xmlSchemaTypeFixup(
type->baseType, ACTXT_CAST pctxt);
18039 if ((
type->memberTypes !=
NULL) &&
18040 (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt,
type) == -1))
18052 res = xmlSchemaCheckSTPropsCorrect(pctxt,
type);
18058 res = xmlSchemaCheckCOSSTRestricts(pctxt,
type);
18075 res = xmlSchemaCheckFacetValues(
type, pctxt);
18078 (
type->baseType->facetSet !=
NULL)) {
18079 res = xmlSchemaDeriveAndValidateFacets(pctxt,
type);
18085 res = xmlSchemaTypeFixupWhitespace(
type);
18087 xmlSchemaTypeFixupOptimFacets(
type);
18090 if (olderrs != pctxt->nberrors)
18091 return(pctxt->err);
18099xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
18100 xmlSchemaTypePtr
type)
18102 int res = 0, olderrs = pctxt->nberrors;
18103 xmlSchemaTypePtr baseType =
type->baseType;
18105 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18107 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18108 if (baseType ==
NULL) {
18109 PERROR_INT(
"xmlSchemaFixupComplexType",
18110 "missing baseType");
18116 if (WXS_IS_TYPE_NOT_FIXED(baseType))
18117 xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
18118 if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
18128 res = xmlSchemaCheckSRCCT(pctxt,
type);
18133 if (
type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
18137 if ((WXS_IS_COMPLEX(baseType)) &&
18138 (baseType->contentTypeDef !=
NULL) &&
18139 (WXS_IS_RESTRICTION(
type))) {
18140 xmlSchemaTypePtr contentBase,
content;
18141#ifdef ENABLE_NAMED_LOCALS
18149 if (
type->contentTypeDef !=
NULL) {
18157 contentBase =
type->contentTypeDef;
18165 contentBase = baseType->contentTypeDef;
18176#ifdef ENABLE_NAMED_LOCALS
18177 snprintf(
buf, 29,
"#scST%d", ++(pctxt->counter));
18179 content = xmlSchemaAddType(pctxt, pctxt->schema,
18180 XML_SCHEMA_TYPE_SIMPLE, tmpname,
type->targetNamespace,
18183 content = xmlSchemaAddType(pctxt, pctxt->schema,
18184 XML_SCHEMA_TYPE_SIMPLE,
NULL,
type->targetNamespace,
18193 content->type = XML_SCHEMA_TYPE_SIMPLE;
18194 content->baseType = contentBase;
18205 if (WXS_IS_TYPE_NOT_FIXED(contentBase))
18206 xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
18211 res = xmlSchemaFixupSimpleTypeStageOne(pctxt,
content);
18213 res = xmlSchemaFixupSimpleTypeStageTwo(pctxt,
content);
18216 }
else if ((WXS_IS_COMPLEX(baseType)) &&
18217 (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
18218 (WXS_IS_RESTRICTION(
type))) {
18224 if ((
type->contentTypeDef ==
NULL) ||
18225 (
type->contentTypeDef->baseType ==
NULL)) {
18229 xmlSchemaPCustomErr(pctxt,
18232 "Internal error: xmlSchemaTypeFixup, "
18233 "complex type '%s': the <simpleContent><restriction> "
18234 "is missing a <simpleType> child, but was not caught "
18235 "by xmlSchemaCheckSRCCT()",
type->
name);
18238 }
else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(
type)) {
18244 if (baseType->contentTypeDef ==
NULL) {
18249 xmlSchemaPCustomErr(pctxt,
18252 "Internal error: xmlSchemaTypeFixup, "
18253 "complex type '%s': the <extension>ed base type is "
18254 "a complex type with no simple content type",
18258 type->contentTypeDef = baseType->contentTypeDef;
18259 }
else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(
type)) {
18264 type->contentTypeDef = baseType;
18269 xmlSchemaPCustomErr(pctxt,
18272 "Internal error: xmlSchemaTypeFixup, "
18273 "complex type '%s' with <simpleContent>: unhandled "
18278 int dummySequence = 0;
18279 xmlSchemaParticlePtr particle =
18280 (xmlSchemaParticlePtr)
type->subtypes;
18291 if ((particle ==
NULL) ||
18292 ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
18293 ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
18294 (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
18295 ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
18296 (particle->minOccurs == 0))) &&
18297 ( ((xmlSchemaTreeItemPtr) particle->children)->children ==
NULL))) {
18298 if (
type->flags & XML_SCHEMAS_TYPE_MIXED) {
18308 if ((particle ==
NULL) ||
18309 (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
18313 particle = xmlSchemaAddParticle(pctxt,
18315 if (particle ==
NULL)
18320 particle->children = (xmlSchemaTreeItemPtr)
18321 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18322 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18323 if (particle->children ==
NULL)
18326 type->subtypes = (xmlSchemaTypePtr) particle;
18329 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18334 type->contentType = XML_SCHEMA_CONTENT_EMPTY;
18342 type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18347 if (WXS_IS_RESTRICTION(
type)) {
18351 if (
type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
18352 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18353 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18359 if (
type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18365 type->contentType = baseType->contentType;
18366 type->subtypes = baseType->subtypes;
18372 type->contentTypeDef = baseType->contentTypeDef;
18376 }
else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18380 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18381 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18386 if (
type->flags & XML_SCHEMAS_TYPE_MIXED)
18387 type->contentType = XML_SCHEMA_CONTENT_MIXED;
18392 if ((WXS_TYPE_PARTICLE(
type) !=
NULL) &&
18393 (WXS_TYPE_PARTICLE_TERM(
type) !=
NULL) &&
18394 ((WXS_TYPE_PARTICLE_TERM(
type))->type ==
18395 XML_SCHEMA_TYPE_ALL))
18400 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18404 "The type has an 'all' model group in its "
18405 "{content type} and thus cannot be derived from "
18406 "a non-empty type, since this would produce a "
18407 "'sequence' model group containing the 'all' "
18408 "model group; 'all' model groups are not "
18409 "allowed to appear inside other model groups",
18412 }
else if ((WXS_TYPE_PARTICLE(baseType) !=
NULL) &&
18413 (WXS_TYPE_PARTICLE_TERM(baseType) !=
NULL) &&
18414 ((WXS_TYPE_PARTICLE_TERM(baseType))->
type ==
18415 XML_SCHEMA_TYPE_ALL))
18420 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18424 "A type cannot be derived by extension from a type "
18425 "which has an 'all' model group in its "
18426 "{content type}, since this would produce a "
18427 "'sequence' model group containing the 'all' "
18428 "model group; 'all' model groups are not "
18429 "allowed to appear inside other model groups",
18432 }
else if ((!dummySequence) && (baseType->subtypes !=
NULL)) {
18433 xmlSchemaTreeItemPtr effectiveContent =
18434 (xmlSchemaTreeItemPtr)
type->subtypes;
18438 particle = xmlSchemaAddParticle(pctxt,
18440 if (particle ==
NULL)
18445 particle->children = (xmlSchemaTreeItemPtr)
18446 xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18447 XML_SCHEMA_TYPE_SEQUENCE,
type->node);
18448 if (particle->children ==
NULL)
18450 WXS_TYPE_CONTENTTYPE(
type) = (xmlSchemaTypePtr) particle;
18457 particle->children->children =
18458 (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
18460 ((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs,
18461 ((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs);
18462 if (particle->children->children ==
NULL)
18464 particle = (xmlSchemaParticlePtr)
18465 particle->children->children;
18466 particle->children =
18467 ((xmlSchemaParticlePtr) baseType->subtypes)->children;
18471 particle->next = effectiveContent;
18492 particle->children->children =
18493 (xmlSchemaTreeItemPtr) baseType->subtypes;
18506 res = xmlSchemaFixupTypeAttributeUses(pctxt,
type);
18513 res = xmlSchemaCheckCTComponent(pctxt,
type);
18516 if (olderrs != pctxt->nberrors)
18517 return(pctxt->err);
18522 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18523 return(pctxt->err);
18526 type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18540xmlSchemaTypeFixup(xmlSchemaTypePtr
type,
18541 xmlSchemaAbstractCtxtPtr actxt)
18545 if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
18546 AERROR_INT(
"xmlSchemaTypeFixup",
18547 "this function needs a parser context");
18550 if (! WXS_IS_TYPE_NOT_FIXED(
type))
18552 if (
type->type == XML_SCHEMA_TYPE_COMPLEX)
18553 return(xmlSchemaFixupComplexType(PCTXT_CAST actxt,
type));
18554 else if (
type->type == XML_SCHEMA_TYPE_SIMPLE)
18555 return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt,
type));
18572xmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
18573 xmlSchemaTypePtr typeDecl,
18574 xmlSchemaParserCtxtPtr pctxt,
18577 int ret = 0, ctxtGiven;
18579 if ((facet ==
NULL) || (typeDecl ==
NULL))
18590 switch (facet->type) {
18591 case XML_SCHEMA_FACET_MININCLUSIVE:
18592 case XML_SCHEMA_FACET_MINEXCLUSIVE:
18593 case XML_SCHEMA_FACET_MAXINCLUSIVE:
18594 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
18595 case XML_SCHEMA_FACET_ENUMERATION: {
18600 xmlSchemaTypePtr
base;
18620 if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
18621 base = typeDecl->baseType;
18623 PERROR_INT(
"xmlSchemaCheckFacet",
18624 "a type user derived type has no base type");
18634 pctxt = xmlSchemaNewParserCtxt(
"*");
18645 ret = xmlSchemaVCheckCVCSimpleType(
18646 ACTXT_CAST pctxt, facet->node,
base,
18647 facet->value, &(facet->val), 1, 1, 0);
18652 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18654 "Internal error: xmlSchemaCheckFacet, "
18655 "failed to validate the value '%s' of the "
18656 "facet '%s' against the base type",
18657 facet->
value, xmlSchemaFacetTypeToString(facet->type));
18659 goto internal_error;
18666 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18667 ret, facet->node, WXS_BASIC_CAST facet,
18668 "The value '%s' of the facet does not validate "
18669 "against the base type '%s'",
18671 xmlSchemaFormatQName(&
str,
18672 base->targetNamespace,
base->name));
18673 FREE_AND_NULL(
str);
18676 }
else if (facet->val ==
NULL) {
18678 PERROR_INT(
"xmlSchemaCheckFacet",
18679 "value was not computed");
18685 case XML_SCHEMA_FACET_PATTERN:
18686 facet->regexp = xmlRegexpCompile(facet->value);
18687 if (facet->regexp ==
NULL) {
18691 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18692 ret, facet->node, WXS_BASIC_CAST typeDecl,
18693 "The value '%s' of the facet 'pattern' is not a "
18694 "valid regular expression",
18695 facet->value,
NULL);
18699 case XML_SCHEMA_FACET_TOTALDIGITS:
18700 case XML_SCHEMA_FACET_FRACTIONDIGITS:
18701 case XML_SCHEMA_FACET_LENGTH:
18702 case XML_SCHEMA_FACET_MAXLENGTH:
18703 case XML_SCHEMA_FACET_MINLENGTH:
18705 if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
18706 ret = xmlSchemaValidatePredefinedType(
18707 xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
18708 facet->value, &(facet->val));
18710 ret = xmlSchemaValidatePredefinedType(
18711 xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
18712 facet->value, &(facet->val));
18718 PERROR_INT(
"xmlSchemaCheckFacet",
18719 "validating facet value");
18721 goto internal_error;
18727 xmlSchemaCustomErr4(ACTXT_CAST pctxt,
18728 ret, facet->node, WXS_BASIC_CAST typeDecl,
18729 "The value '%s' of the facet '%s' is not a valid '%s'",
18731 xmlSchemaFacetTypeToString(facet->type),
18732 (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
18740 case XML_SCHEMA_FACET_WHITESPACE:{
18742 facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
18744 facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
18746 facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
18752 xmlSchemaCustomErr(ACTXT_CAST pctxt,
18753 ret, facet->node, WXS_BASIC_CAST typeDecl,
18754 "The value '%s' of the facet 'whitespace' is not "
18755 "valid", facet->value,
NULL);
18763 if ((! ctxtGiven) && (pctxt !=
NULL))
18764 xmlSchemaFreeParserCtxt(pctxt);
18767 if ((! ctxtGiven) && (pctxt !=
NULL))
18768 xmlSchemaFreeParserCtxt(pctxt);
18780xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
18781 xmlSchemaParserCtxtPtr pctxt)
18783 int res, olderrs = pctxt->nberrors;
18789 if (typeDecl->facets !=
NULL) {
18790 xmlSchemaFacetPtr facet = typeDecl->facets;
18796 if (pctxt->vctxt ==
NULL) {
18797 if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
18800 pctxt->vctxt->schema = pctxt->schema;
18801 while (facet !=
NULL) {
18802 res = xmlSchemaCheckFacet(facet, typeDecl, pctxt,
name);
18804 facet = facet->next;
18806 pctxt->vctxt->schema =
NULL;
18808 if (olderrs != pctxt->nberrors)
18809 return(pctxt->err);
18827static xmlSchemaTreeItemPtr
18828xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
18829 xmlSchemaTreeItemPtr particle)
18831 xmlSchemaTreeItemPtr circ =
NULL;
18832 xmlSchemaTreeItemPtr term;
18833 xmlSchemaModelGroupDefPtr gdef;
18835 for (; particle !=
NULL; particle = particle->
next) {
18836 term = particle->children;
18839 switch (term->type) {
18840 case XML_SCHEMA_TYPE_GROUP:
18841 gdef = (xmlSchemaModelGroupDefPtr) term;
18842 if (gdef == groupDef)
18848 if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
18850 if (gdef->children !=
NULL) {
18851 gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18852 circ = xmlSchemaGetCircModelGrDefRef(groupDef,
18853 gdef->children->children);
18854 gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18859 case XML_SCHEMA_TYPE_SEQUENCE:
18860 case XML_SCHEMA_TYPE_CHOICE:
18861 case XML_SCHEMA_TYPE_ALL:
18862 circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
18882xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr
item,
18883 xmlSchemaParserCtxtPtr ctxt)
18892 (
item->
type != XML_SCHEMA_TYPE_GROUP) ||
18896 xmlSchemaTreeItemPtr circ;
18898 circ = xmlSchemaGetCircModelGrDefRef(
item,
item->children->children);
18899 if (circ !=
NULL) {
18908 xmlSchemaPCustomErr(ctxt,
18910 NULL, WXS_ITEM_NODE(circ),
18911 "Circular reference to the model group definition '%s' "
18912 "defined", xmlSchemaFormatQName(&
str,
18913 item->targetNamespace,
item->name));
18919 circ->children =
NULL;
18939xmlSchemaModelGroupToModelGroupDefFixup(
18941 xmlSchemaModelGroupPtr mg)
18943 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
18945 while (particle !=
NULL) {
18946 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
18947 ((WXS_PARTICLE_TERM(particle))->
type !=
18948 XML_SCHEMA_TYPE_GROUP))
18950 particle = WXS_PTC_CAST particle->next;
18953 if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) ==
NULL) {
18957 WXS_PARTICLE_TERM(particle) =
NULL;
18958 particle = WXS_PTC_CAST particle->
next;
18964 WXS_PARTICLE_TERM(particle) =
18965 WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
18967 particle = WXS_PTC_CAST particle->next;
18981static xmlSchemaQNameRefPtr
18982xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
18983 xmlSchemaItemListPtr
list)
18985 xmlSchemaAttributeGroupPtr gr;
18986 xmlSchemaQNameRefPtr
ref, circ;
18992 for (
i = 0;
i <
list->nbItems;
i++) {
18994 if ((
ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
18995 (
ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
18998 gr = WXS_ATTR_GROUP_CAST
ref->item;
19001 if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
19007 if ((gr->attrUses) &&
19008 (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
19010 gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
19011 circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
19012 (xmlSchemaItemListPtr) gr->attrUses);
19013 gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
19032xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
19033 xmlSchemaParserCtxtPtr ctxt)
19049 if (attrGr->attrUses ==
NULL)
19051 else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
19054 xmlSchemaQNameRefPtr circ;
19056 circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
19057 (xmlSchemaItemListPtr) attrGr->attrUses);
19058 if (circ !=
NULL) {
19063 xmlSchemaPCustomErr(ctxt,
19065 NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
19066 "Circular reference to the attribute group '%s' "
19067 "defined", xmlSchemaGetComponentQName(&
str, attrGr));
19068 FREE_AND_NULL(
str);
19082xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19083 xmlSchemaAttributeGroupPtr attrGr);
19100xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
19101 xmlSchemaBasicItemPtr
item,
19102 xmlSchemaWildcardPtr *completeWild,
19103 xmlSchemaItemListPtr
list,
19104 xmlSchemaItemListPtr prohibs)
19106 xmlSchemaAttributeGroupPtr gr;
19107 xmlSchemaAttributeUsePtr use;
19108 xmlSchemaItemListPtr sublist;
19110 int created = (*completeWild ==
NULL) ? 0 : 1;
19113 prohibs->nbItems = 0;
19115 for (
i = 0;
i <
list->nbItems;
i++) {
19116 use =
list->items[
i];
19118 if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
19119 if (prohibs ==
NULL) {
19120 PERROR_INT(
"xmlSchemaExpandAttributeGroupRefs",
19121 "unexpected attr prohibition found");
19127 if (xmlSchemaItemListRemove(
list,
i) == -1)
19137 xmlSchemaItemListAddSize(prohibs, 2, use);
19140 if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19141 ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
19143 if ((WXS_QNAME_CAST use)->
item ==
NULL)
19145 gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
19151 if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
19152 if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
19159 if (gr->attributeWildcard !=
NULL) {
19160 if (*completeWild ==
NULL) {
19161 *completeWild = gr->attributeWildcard;
19164 xmlSchemaWildcardPtr tmpWild;
19174 tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema,
19175 XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
19176 WXS_ITEM_NODE(
item));
19177 if (tmpWild ==
NULL)
19179 if (xmlSchemaCloneWildcardNsConstraints(pctxt,
19180 tmpWild, *completeWild) == -1)
19182 tmpWild->processContents = (*completeWild)->processContents;
19183 *completeWild = tmpWild;
19187 if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
19188 gr->attributeWildcard) == -1)
19196 sublist = ((xmlSchemaItemListPtr) gr->attrUses);
19197 if ((sublist ==
NULL) || sublist->nbItems == 0) {
19198 if (xmlSchemaItemListRemove(
list,
i) == -1)
19206 list->items[
i] = sublist->items[0];
19207 if (sublist->nbItems != 1) {
19208 for (
j = 1;
j < sublist->nbItems;
j++) {
19210 if (xmlSchemaItemListInsert(
list,
19211 sublist->items[
j],
i) == -1)
19221 if (prohibs && (prohibs->nbItems != 0) && (
list->nbItems != 0)) {
19222 xmlSchemaAttributeUseProhibPtr prohib;
19224 for (
i = prohibs->nbItems -1;
i >= 0;
i--) {
19225 prohib = prohibs->items[
i];
19226 for (
j = 0;
j <
list->nbItems;
j++) {
19227 use =
list->items[
j];
19229 if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
19230 (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
19234 xmlSchemaCustomWarning(ACTXT_CAST pctxt,
19236 prohib->node,
NULL,
19237 "Skipping pointless attribute use prohibition "
19238 "'%s', since a corresponding attribute use "
19239 "exists already in the type definition",
19240 xmlSchemaFormatQName(&
str,
19241 prohib->targetNamespace, prohib->name),
19243 FREE_AND_NULL(
str);
19247 if (xmlSchemaItemListRemove(prohibs,
i) == -1)
19270xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19271 xmlSchemaAttributeGroupPtr attrGr)
19273 if ((attrGr->attrUses ==
NULL) ||
19274 (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
19277 attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
19278 if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
19279 &(attrGr->attributeWildcard), attrGr->attrUses,
NULL) == -1)
19296xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19297 xmlSchemaAttributeGroupPtr attrGr)
19307 if ((attrGr->attrUses !=
NULL) &&
19308 (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
19310 xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
19311 xmlSchemaAttributeUsePtr use, tmp;
19312 int i,
j, hasId = 0;
19314 for (
i = uses->nbItems -1;
i >= 0;
i--) {
19315 use = uses->items[
i];
19323 for (
j =
i -1;
j >= 0;
j--) {
19324 tmp = uses->items[
j];
19325 if ((WXS_ATTRUSE_DECL_NAME(use) ==
19326 WXS_ATTRUSE_DECL_NAME(tmp)) &&
19327 (WXS_ATTRUSE_DECL_TNS(use) ==
19328 WXS_ATTRUSE_DECL_TNS(tmp)))
19332 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19334 attrGr->node, WXS_BASIC_CAST attrGr,
19336 xmlSchemaGetComponentDesignation(&
str, use),
19338 FREE_AND_NULL(
str);
19342 if (xmlSchemaItemListRemove(uses,
i) == -1)
19355 if (WXS_ATTRUSE_TYPEDEF(use) !=
NULL) {
19356 if (xmlSchemaIsDerivedFromBuiltInType(
19357 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
19362 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19364 attrGr->node, WXS_BASIC_CAST attrGr,
19365 "There must not exist more than one attribute "
19366 "declaration of type 'xs:ID' "
19367 "(or derived from 'xs:ID'). The %s violates this "
19369 xmlSchemaGetComponentDesignation(&
str, use),
19371 FREE_AND_NULL(
str);
19372 if (xmlSchemaItemListRemove(uses,
i) == -1)
19393xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr
ref,
19394 xmlSchemaParserCtxtPtr ctxt)
19396 xmlSchemaAttributeGroupPtr
group;
19400 group = xmlSchemaGetAttributeGroup(ctxt->schema,
19402 ref->targetNamespace);
19404 xmlSchemaPResCompAttrErr(ctxt,
19430xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19431 xmlSchemaAttributePtr
attr)
19442 if (WXS_ATTR_TYPEDEF(
attr) ==
NULL)
19453 if (xmlSchemaIsDerivedFromBuiltInType(
19454 WXS_ATTR_TYPEDEF(
attr), XML_SCHEMAS_ID))
19456 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19459 "Value constraints are not allowed if the type definition "
19460 "is or is derived from xs:ID",
19462 return(pctxt->err);
19472 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
19473 attr->node, WXS_ATTR_TYPEDEF(
attr),
19478 PERROR_INT(
"xmlSchemaCheckAttrPropsCorrect",
19479 "calling xmlSchemaVCheckCVCSimpleType()");
19482 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19485 "The value of the value constraint is not valid",
19487 return(pctxt->err);
19494static xmlSchemaElementPtr
19495xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
19496 xmlSchemaElementPtr ancestor)
19498 xmlSchemaElementPtr
ret;
19500 if (WXS_SUBST_HEAD(ancestor) ==
NULL)
19502 if (WXS_SUBST_HEAD(ancestor) == elemDecl)
19505 if (WXS_SUBST_HEAD(ancestor)->
flags & XML_SCHEMAS_ELEM_CIRCULAR)
19507 WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
19508 ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
19509 WXS_SUBST_HEAD(ancestor));
19510 WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
19528xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19529 xmlSchemaElementPtr elemDecl)
19532 xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
19539 if (WXS_SUBST_HEAD(elemDecl) !=
NULL) {
19540 xmlSchemaElementPtr
head = WXS_SUBST_HEAD(elemDecl), circ;
19542 xmlSchemaCheckElementDeclComponent(
head, pctxt);
19547 if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
19548 xmlSchemaPCustomErr(pctxt,
19550 WXS_BASIC_CAST elemDecl,
NULL,
19551 "Only global element declarations can have a "
19552 "substitution group affiliation",
NULL);
19561 if (
head == elemDecl)
19563 else if (WXS_SUBST_HEAD(
head) !=
NULL)
19564 circ = xmlSchemaCheckSubstGroupCircular(
head,
head);
19567 if (circ !=
NULL) {
19570 xmlSchemaPCustomErrExt(pctxt,
19572 WXS_BASIC_CAST circ,
NULL,
19573 "The element declaration '%s' defines a circular "
19574 "substitution group to element declaration '%s'",
19575 xmlSchemaGetComponentQName(&
strA, circ),
19576 xmlSchemaGetComponentQName(&strB,
head),
19578 FREE_AND_NULL(
strA)
19579 FREE_AND_NULL(strB)
19597 if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
19600 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
19601 set |= SUBSET_EXTENSION;
19602 if (
head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
19603 set |= SUBSET_RESTRICTION;
19605 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
19606 WXS_ELEM_TYPEDEF(
head),
set) != 0) {
19610 xmlSchemaPCustomErrExt(pctxt,
19612 WXS_BASIC_CAST elemDecl,
NULL,
19613 "The type definition '%s' was "
19614 "either rejected by the substitution group "
19615 "affiliation '%s', or not validly derived from its type "
19617 xmlSchemaGetComponentQName(&
strA, typeDef),
19618 xmlSchemaGetComponentQName(&strB,
head),
19619 xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(
head)));
19620 FREE_AND_NULL(
strA)
19621 FREE_AND_NULL(strB)
19622 FREE_AND_NULL(strC)
19633 if ((elemDecl->value !=
NULL) &&
19634 ((WXS_IS_SIMPLE(typeDef) &&
19635 xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
19636 (WXS_IS_COMPLEX(typeDef) &&
19637 WXS_HAS_SIMPLE_CONTENT(typeDef) &&
19638 xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
19639 XML_SCHEMAS_ID)))) {
19642 xmlSchemaPCustomErr(pctxt,
19644 WXS_BASIC_CAST elemDecl,
NULL,
19645 "The type definition (or type definition's content type) is or "
19646 "is derived from ID; value constraints are not allowed in "
19647 "conjunction with such a type definition",
NULL);
19648 }
else if (elemDecl->value !=
NULL) {
19658 if (typeDef ==
NULL) {
19659 xmlSchemaPErr(pctxt, elemDecl->node,
19661 "Internal error: xmlSchemaCheckElemPropsCorrect, "
19662 "type is missing... skipping validation of "
19663 "the value constraint",
NULL,
NULL);
19666 if (elemDecl->node !=
NULL) {
19667 if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
19668 node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19671 node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19674 vcret = xmlSchemaParseCheckCOSValidDefault(pctxt,
node,
19675 typeDef, elemDecl->value, &(elemDecl->defVal));
19678 PERROR_INT(
"xmlSchemaElemCheckValConstr",
19679 "failed to validate the value constraint of an "
19680 "element declaration");
19710xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
19711 xmlSchemaElementPtr elemDecl)
19713 if ((WXS_SUBST_HEAD(elemDecl) ==
NULL) ||
19715 (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
19718 xmlSchemaElementPtr
head;
19719 xmlSchemaTypePtr headType,
type;
19733 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
19735 headType =
head->subtypes;
19736 type = elemDecl->subtypes;
19737 if (headType ==
type)
19739 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
19740 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19741 if (
head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
19742 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19763 if ((WXS_IS_EXTENSION(
type)) &&
19764 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19765 methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19767 if (WXS_IS_RESTRICTION(
type) &&
19768 ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19769 methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19777 type = elemDecl->subtypes->baseType;
19779 if (WXS_IS_COMPLEX(
type)) {
19781 XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19782 ((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
19783 set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19785 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19786 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19787 set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19790 if (
type == headType)
19795 (((
set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19796 (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
19797 ((
set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19798 (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
19802 xmlSchemaAddElementSubstitutionMember(ctxt,
head, elemDecl);
19803 if ((
head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
19804 head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
19809#ifdef WXS_ELEM_DECL_CONS_ENABLED
19820xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
19821 xmlSchemaBasicItemPtr ctxtComponent,
19822 xmlSchemaParticlePtr ctxtParticle,
19823 xmlSchemaParticlePtr searchParticle,
19824 xmlSchemaParticlePtr curParticle,
19830 xmlSchemaParticlePtr
cur = curParticle;
19831 if (curParticle ==
NULL) {
19834 if (WXS_PARTICLE_TERM(curParticle) ==
NULL) {
19842 switch (WXS_PARTICLE_TERM(
cur)->
type) {
19843 case XML_SCHEMA_TYPE_ANY:
19845 case XML_SCHEMA_TYPE_ELEMENT:
19847 ret = xmlSchemaCheckElementDeclConsistent(pctxt,
19848 ctxtComponent, ctxtParticle,
cur, ctxtParticle, 1);
19852 xmlSchemaElementPtr
elem =
19853 WXS_ELEM_CAST(WXS_PARTICLE_TERM(
cur));
19865 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->
name) &&
19867 WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
19871 xmlSchemaCustomErr(ACTXT_CAST pctxt,
19873 XML_SCHEMAP_COS_NONAMBIG,
19875 "In the content model of %s, there are multiple "
19876 "element declarations for '%s' with different "
19877 "type definitions",
19878 xmlSchemaGetComponentDesignation(&
strA,
19880 xmlSchemaFormatQName(&strB,
19881 WXS_PARTICLE_TERM_AS_ELEM(
cur)->targetNamespace,
19882 WXS_PARTICLE_TERM_AS_ELEM(
cur)->
name));
19883 FREE_AND_NULL(
strA);
19884 FREE_AND_NULL(strB);
19885 return(XML_SCHEMAP_COS_NONAMBIG);
19889 case XML_SCHEMA_TYPE_SEQUENCE: {
19892 case XML_SCHEMA_TYPE_CHOICE:{
19907 case XML_SCHEMA_TYPE_ALL:
19909 case XML_SCHEMA_TYPE_GROUP:
19912 xmlSchemaInternalErr2(ACTXT_CAST pctxt,
19913 "xmlSchemaCheckElementDeclConsistent",
19914 "found unexpected term of type '%s' in content model",
19915 WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(
cur)),
NULL);
19918 cur = (xmlSchemaParticlePtr)
cur->next;
19936xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
19937 xmlSchemaParserCtxtPtr ctxt)
19939 if (elemDecl ==
NULL)
19941 if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
19943 elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
19944 if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
19948 xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
19961xmlSchemaResolveModelGroupParticleReferences(
19962 xmlSchemaParserCtxtPtr ctxt,
19963 xmlSchemaModelGroupPtr mg)
19965 xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
19966 xmlSchemaQNameRefPtr
ref;
19967 xmlSchemaBasicItemPtr refItem;
19972 while (particle !=
NULL) {
19973 if ((WXS_PARTICLE_TERM(particle) ==
NULL) ||
19974 ((WXS_PARTICLE_TERM(particle))->
type !=
19975 XML_SCHEMA_EXTRA_QNAMEREF))
19977 goto next_particle;
19979 ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
19984 particle->children =
NULL;
19986 refItem = xmlSchemaGetNamedComponent(ctxt->schema,
19988 if (refItem ==
NULL) {
19993 goto next_particle;
19995 if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
19996 if (WXS_MODELGROUPDEF_MODEL(refItem) ==
NULL)
19998 goto next_particle;
20006 if ((WXS_MODELGROUPDEF_MODEL(refItem))->
type ==
20007 XML_SCHEMA_TYPE_ALL) {
20018 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20021 WXS_ITEM_NODE(particle),
NULL,
20022 "A model group definition is referenced, but "
20023 "it contains an 'all' model group, which "
20024 "cannot be contained by model groups",
20027 goto next_particle;
20029 particle->children = (xmlSchemaTreeItemPtr) refItem;
20035 particle->children = (xmlSchemaTreeItemPtr) refItem;
20038 particle = WXS_PTC_CAST particle->next;
20043xmlSchemaAreValuesEqual(xmlSchemaValPtr
x,
20046 xmlSchemaTypePtr tx,
ty, ptx, pty;
20049 while (
x !=
NULL) {
20051 tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
x));
20052 ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(
y));
20053 ptx = xmlSchemaGetPrimitiveType(tx);
20054 pty = xmlSchemaGetPrimitiveType(
ty);
20070 if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
20071 WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
20073 xmlSchemaValueGetAsString(
x),
20074 xmlSchemaValueGetAsString(
y)))
20077 ret = xmlSchemaCompareValuesWhtsp(
20078 x, XML_SCHEMA_WHITESPACE_PRESERVE,
20079 y, XML_SCHEMA_WHITESPACE_PRESERVE);
20088 x = xmlSchemaValueGetNext(
x);
20090 y = xmlSchemaValueGetNext(
y);
20093 }
else if (xmlSchemaValueGetNext(
y) !=
NULL)
20109xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
20110 xmlSchemaParserCtxtPtr ctxt)
20112 if ((ctxt ==
NULL) || (ause ==
NULL))
20114 if ((ause->attrDecl ==
NULL) ||
20115 (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
20119 xmlSchemaQNameRefPtr
ref = WXS_QNAME_CAST ause->attrDecl;
20125 ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
20127 if (ause->attrDecl ==
NULL) {
20128 xmlSchemaPResCompAttrErr(ctxt,
20130 WXS_BASIC_CAST ause, ause->node,
20132 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20149xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
20150 xmlSchemaAttributeUsePtr use)
20152 if ((ctxt ==
NULL) || (use ==
NULL))
20154 if ((use->defValue ==
NULL) || (WXS_ATTRUSE_DECL(use) ==
NULL) ||
20155 ((WXS_ATTRUSE_DECL(use))->
type != XML_SCHEMA_TYPE_ATTRIBUTE))
20166 if (((WXS_ATTRUSE_DECL(use))->defValue !=
NULL) &&
20167 ((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMAS_ATTR_FIXED) &&
20168 ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20170 xmlSchemaPCustomErr(ctxt,
20172 WXS_BASIC_CAST use,
NULL,
20173 "The attribute declaration has a 'fixed' value constraint "
20174 ", thus the attribute use must also have a 'fixed' value "
20182 if ((use->defVal !=
NULL) && (WXS_ATTRUSE_TYPEDEF(use) !=
NULL)) {
20191 if (xmlSchemaIsDerivedFromBuiltInType(
20192 WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
20194 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20196 NULL, WXS_BASIC_CAST use,
20197 "Value constraints are not allowed if the type definition "
20198 "is or is derived from xs:ID",
20203 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
20204 use->node, WXS_ATTRUSE_TYPEDEF(use),
20205 use->defValue, &(use->defVal),
20209 PERROR_INT2(
"xmlSchemaCheckAttrUsePropsCorrect",
20210 "calling xmlSchemaVCheckCVCSimpleType()");
20213 xmlSchemaCustomErr(ACTXT_CAST ctxt,
20215 NULL, WXS_BASIC_CAST use,
20216 "The value of the value constraint is not valid",
20228 if (((WXS_ATTRUSE_DECL(use))->defVal !=
NULL) &&
20229 (((WXS_ATTRUSE_DECL(use))->
flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20231 if (! xmlSchemaAreValuesEqual(use->defVal,
20232 (WXS_ATTRUSE_DECL(use))->defVal))
20234 xmlSchemaPCustomErr(ctxt,
20236 WXS_BASIC_CAST use,
NULL,
20237 "The 'fixed' value constraint of the attribute use "
20238 "must match the attribute declaration's value "
20240 (WXS_ATTRUSE_DECL(use))->defValue);
20258xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr
item,
20259 xmlSchemaParserCtxtPtr ctxt)
20267 if (
item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
20269 item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
20273 xmlSchemaTypePtr
type;
20275 type = xmlSchemaGetType(ctxt->schema,
item->typeName,
20278 xmlSchemaPResCompAttrErr(ctxt,
20281 "type",
item->typeName,
item->typeNs,
20282 XML_SCHEMA_TYPE_SIMPLE,
NULL);
20291 item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
20307xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
20308 xmlSchemaParserCtxtPtr pctxt)
20310 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
20312 if (idc->ref->name !=
NULL) {
20313 idc->ref->item = (xmlSchemaBasicItemPtr)
20314 xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
20315 idc->ref->targetNamespace);
20316 if (idc->ref->item ==
NULL) {
20321 xmlSchemaPResCompAttrErr(pctxt,
20323 WXS_BASIC_CAST idc, idc->node,
20324 "refer", idc->ref->name,
20325 idc->ref->targetNamespace,
20326 XML_SCHEMA_TYPE_IDC_KEY,
NULL);
20327 return(pctxt->err);
20328 }
else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
20332 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20334 NULL, WXS_BASIC_CAST idc,
20335 "The keyref references a keyref",
20337 idc->ref->item =
NULL;
20338 return(pctxt->err);
20340 if (idc->nbFields !=
20341 ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
20343 xmlSchemaIDCPtr refer;
20345 refer = (xmlSchemaIDCPtr) idc->ref->item;
20352 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20354 NULL, WXS_BASIC_CAST idc,
20355 "The cardinality of the keyref differs from the "
20356 "cardinality of the referenced key/unique '%s'",
20357 xmlSchemaFormatQName(&
str, refer->targetNamespace,
20361 return(pctxt->err);
20369xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
20370 xmlSchemaParserCtxtPtr pctxt)
20372 if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
20373 prohib->targetNamespace) ==
NULL) {
20375 xmlSchemaPResCompAttrErr(pctxt,
20377 NULL, prohib->node,
20378 "ref", prohib->
name, prohib->targetNamespace,
20379 XML_SCHEMA_TYPE_ATTRIBUTE,
NULL);
20385#define WXS_REDEFINED_TYPE(c) \
20386(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
20388#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
20389(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20391#define WXS_REDEFINED_ATTR_GROUP(c) \
20392(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
20395xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
20398 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20399 xmlSchemaBasicItemPtr prev,
item;
20406 item = redef->item;
20420 prev = xmlSchemaFindRedefCompInGraph(
20422 redef->refName, redef->refTargetNs);
20423 if (prev ==
NULL) {
20442 if (redef->reference)
20443 node = WXS_ITEM_NODE(redef->reference);
20446 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20453 "The %s '%s' to be redefined could not be found in "
20454 "the redefined schema",
20455 WXS_ITEM_TYPE_NAME(
item),
20456 xmlSchemaFormatQName(&
str, redef->refTargetNs,
20458 FREE_AND_NULL(
str);
20460 redef = redef->
next;
20469 case XML_SCHEMA_TYPE_COMPLEX:
20470 case XML_SCHEMA_TYPE_SIMPLE:
20471 if ((WXS_TYPE_CAST prev)->
flags &
20472 XML_SCHEMAS_TYPE_REDEFINED)
20478 (WXS_TYPE_CAST prev)->
flags |= XML_SCHEMAS_TYPE_REDEFINED;
20484 ((xmlSchemaTypePtr)
item)->baseType =
20485 (xmlSchemaTypePtr) prev;
20487 case XML_SCHEMA_TYPE_GROUP:
20488 if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
20489 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20495 (WXS_MODEL_GROUPDEF_CAST prev)->
flags |=
20496 XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
20497 if (redef->reference !=
NULL) {
20502 (WXS_PTC_CAST redef->reference)->children =
20503 WXS_TREE_CAST prev;
20505 redef->target = prev;
20507 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20508 if ((WXS_ATTR_GROUP_CAST prev)->flags &
20509 XML_SCHEMAS_ATTRGROUP_REDEFINED)
20514 (WXS_ATTR_GROUP_CAST prev)->
flags |=
20515 XML_SCHEMAS_ATTRGROUP_REDEFINED;
20516 if (redef->reference !=
NULL) {
20523 (WXS_QNAME_CAST redef->reference)->
item = prev;
20524 redef->target =
NULL;
20533 redef->target = prev;
20537 PERROR_INT(
"xmlSchemaResolveRedefReferences",
20538 "Unexpected redefined component type");
20541 if (wasRedefined) {
20545 if (redef->reference)
20546 node = WXS_ITEM_NODE(redef->reference);
20548 node = WXS_ITEM_NODE(redef->item);
20550 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20554 "The referenced %s was already redefined. Multiple "
20555 "redefinition of the same component is not supported",
20556 xmlSchemaGetComponentDesignation(&
str, prev),
20560 redef = redef->
next;
20563 redef = redef->next;
20564 }
while (redef !=
NULL);
20570xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
20573 xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20574 xmlSchemaBasicItemPtr
item;
20580 if (redef->target ==
NULL) {
20581 redef = redef->next;
20584 item = redef->item;
20587 case XML_SCHEMA_TYPE_SIMPLE:
20588 case XML_SCHEMA_TYPE_COMPLEX:
20593 (WXS_TYPE_CAST redef->target)->
name =
NULL;
20600 case XML_SCHEMA_TYPE_GROUP:
20612 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20626 err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
20627 XML_SCHEMA_ACTION_REDEFINE,
20628 item, redef->target,
20629 (WXS_ATTR_GROUP_CAST
item)->attrUses,
20630 (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
20631 (WXS_ATTR_GROUP_CAST
item)->attributeWildcard,
20632 (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
20639 redef = redef->next;
20640 }
while (redef !=
NULL);
20646xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
20647 xmlSchemaBucketPtr bucket)
20649 xmlSchemaBasicItemPtr
item;
20655#define WXS_GET_GLOBAL_HASH(c, slot) { \
20656 if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
20657 table = &(WXS_IMPBUCKET((c))->schema->slot); \
20659 table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
20673 if (bucket ==
NULL)
20675 if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
20677 bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
20679 for (
i = 0;
i < bucket->globals->nbItems;
i++) {
20680 item = bucket->globals->items[
i];
20683 case XML_SCHEMA_TYPE_COMPLEX:
20684 case XML_SCHEMA_TYPE_SIMPLE:
20685 if (WXS_REDEFINED_TYPE(
item))
20688 WXS_GET_GLOBAL_HASH(bucket, typeDecl)
20690 case XML_SCHEMA_TYPE_ELEMENT:
20692 WXS_GET_GLOBAL_HASH(bucket, elemDecl)
20694 case XML_SCHEMA_TYPE_ATTRIBUTE:
20696 WXS_GET_GLOBAL_HASH(bucket, attrDecl)
20698 case XML_SCHEMA_TYPE_GROUP:
20699 if (WXS_REDEFINED_MODEL_GROUP_DEF(
item))
20702 WXS_GET_GLOBAL_HASH(bucket, groupDecl)
20704 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20705 if (WXS_REDEFINED_ATTR_GROUP(
item))
20708 WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
20710 case XML_SCHEMA_TYPE_IDC_KEY:
20711 case XML_SCHEMA_TYPE_IDC_UNIQUE:
20712 case XML_SCHEMA_TYPE_IDC_KEYREF:
20714 WXS_GET_GLOBAL_HASH(bucket, idcDef)
20716 case XML_SCHEMA_TYPE_NOTATION:
20718 WXS_GET_GLOBAL_HASH(bucket, notaDecl)
20721 PERROR_INT(
"xmlSchemaAddComponents",
20722 "Unexpected global component type");
20728 PERROR_INT(
"xmlSchemaAddComponents",
20729 "failed to create a component hash table");
20737 xmlSchemaCustomErr(ACTXT_CAST pctxt,
20739 WXS_ITEM_NODE(
item),
20740 WXS_BASIC_CAST
item,
20741 "A global %s '%s' does already exist",
20742 WXS_ITEM_TYPE_NAME(
item),
20743 xmlSchemaGetComponentQName(&
str,
item));
20744 FREE_AND_NULL(
str);
20750 if (bucket->relations !=
NULL) {
20751 xmlSchemaSchemaRelationPtr rel = bucket->relations;
20753 if ((rel->bucket !=
NULL) &&
20754 ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
20755 if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
20759 }
while (rel !=
NULL);
20765xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
20766 xmlSchemaBucketPtr rootBucket)
20768 xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
20770 int nbItems,
i,
ret = 0;
20771 xmlSchemaBucketPtr oldbucket = con->bucket;
20772 xmlSchemaElementPtr elemDecl;
20774#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
20776 if ((con->pending ==
NULL) ||
20777 (con->pending->nbItems == 0))
20787 if (con->bucket ==
NULL)
20788 con->bucket = rootBucket;
20801 xmlSchemaCheckSRCRedefineFirst(pctxt);
20806 xmlSchemaAddComponents(pctxt, rootBucket);
20808 pctxt->ctxtType =
NULL;
20809 items = (xmlSchemaTreeItemPtr *) con->pending->items;
20810 nbItems = con->pending->nbItems;
20837 for (
i = 0;
i < nbItems;
i++) {
20840 case XML_SCHEMA_TYPE_ELEMENT:
20841 xmlSchemaResolveElementReferences(
20842 (xmlSchemaElementPtr)
item, pctxt);
20845 case XML_SCHEMA_TYPE_COMPLEX:
20846 case XML_SCHEMA_TYPE_SIMPLE:
20847 xmlSchemaResolveTypeReferences(
20848 (xmlSchemaTypePtr)
item, pctxt);
20851 case XML_SCHEMA_TYPE_ATTRIBUTE:
20852 xmlSchemaResolveAttrTypeReferences(
20853 (xmlSchemaAttributePtr)
item, pctxt);
20856 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
20857 xmlSchemaResolveAttrUseReferences(
20858 (xmlSchemaAttributeUsePtr)
item, pctxt);
20861 case XML_SCHEMA_EXTRA_QNAMEREF:
20862 if ((WXS_QNAME_CAST
item)->itemType ==
20863 XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
20865 xmlSchemaResolveAttrGroupReferences(
20866 WXS_QNAME_CAST
item, pctxt);
20870 case XML_SCHEMA_TYPE_SEQUENCE:
20871 case XML_SCHEMA_TYPE_CHOICE:
20872 case XML_SCHEMA_TYPE_ALL:
20873 xmlSchemaResolveModelGroupParticleReferences(pctxt,
20874 WXS_MODEL_GROUP_CAST
item);
20877 case XML_SCHEMA_TYPE_IDC_KEY:
20878 case XML_SCHEMA_TYPE_IDC_UNIQUE:
20879 case XML_SCHEMA_TYPE_IDC_KEYREF:
20880 xmlSchemaResolveIDCKeyReferences(
20881 (xmlSchemaIDCPtr)
item, pctxt);
20884 case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
20889 xmlSchemaResolveAttrUseProhibReferences(
20890 WXS_ATTR_PROHIB_CAST
item, pctxt);
20897 if (pctxt->nberrors != 0)
20908 for (
i = 0;
i < nbItems;
i++) {
20914 case XML_SCHEMA_TYPE_COMPLEX:
20915 case XML_SCHEMA_TYPE_SIMPLE:
20916 xmlSchemaCheckTypeDefCircular(
20917 (xmlSchemaTypePtr)
item, pctxt);
20919 if (pctxt->nberrors != 0)
20922 case XML_SCHEMA_TYPE_GROUP:
20923 xmlSchemaCheckGroupDefCircular(
20924 (xmlSchemaModelGroupDefPtr)
item, pctxt);
20926 if (pctxt->nberrors != 0)
20929 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20930 xmlSchemaCheckAttrGroupCircular(
20931 (xmlSchemaAttributeGroupPtr)
item, pctxt);
20933 if (pctxt->nberrors != 0)
20940 if (pctxt->nberrors != 0)
20950 for (
i = 0;
i < nbItems;
i++) {
20953 case XML_SCHEMA_TYPE_SEQUENCE:
20954 case XML_SCHEMA_TYPE_CHOICE:
20955 xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
20956 WXS_MODEL_GROUP_CAST
item);
20962 if (pctxt->nberrors != 0)
20967 for (
i = 0;
i < nbItems;
i++) {
20970 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20971 if ((! WXS_ATTR_GROUP_EXPANDED(
item)) &&
20972 WXS_ATTR_GROUP_HAS_REFS(
item))
20974 xmlSchemaAttributeGroupExpandRefs(pctxt,
20975 WXS_ATTR_GROUP_CAST
item);
20983 if (pctxt->nberrors != 0)
20990 for (
i = 0;
i < nbItems;
i++) {
20993 case XML_SCHEMA_TYPE_SIMPLE:
20994 if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr)
item)) {
20995 xmlSchemaFixupSimpleTypeStageOne(pctxt,
20996 (xmlSchemaTypePtr)
item);
21004 if (pctxt->nberrors != 0)
21010 for (
i = 0;
i < nbItems;
i++) {
21013 case XML_SCHEMA_TYPE_SIMPLE:
21014 if (((xmlSchemaTypePtr)
item)->memberTypes !=
NULL) {
21015 xmlSchemaCheckUnionTypeDefCircular(pctxt,
21016 (xmlSchemaTypePtr)
item);
21024 if (pctxt->nberrors != 0)
21030 for (
i = 0;
i < nbItems;
i++) {
21033 case XML_SCHEMA_TYPE_SIMPLE:
21034 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21035 xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST
item);
21043 if (pctxt->nberrors != 0)
21051 for (
i = 0;
i < nbItems;
i++) {
21054 case XML_SCHEMA_TYPE_ATTRIBUTE:
21055 xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST
item);
21062 if (pctxt->nberrors != 0)
21067 for (
i = 0;
i < nbItems;
i++) {
21070 case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21071 if (((xmlSchemaAttributeUsePtr)
item)->defValue !=
NULL) {
21072 xmlSchemaCheckAttrUsePropsCorrect(pctxt,
21073 WXS_ATTR_USE_CAST
item);
21081 if (pctxt->nberrors != 0)
21087 for (
i = 0;
i < nbItems;
i++) {
21090 case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21091 if (( (WXS_ATTR_GROUP_CAST
item)->attrUses !=
NULL) &&
21092 ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST
item)->attrUses)->nbItems > 1))
21094 xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST
item);
21102 if (pctxt->nberrors != 0)
21108 if (WXS_CONSTRUCTOR(pctxt)->redefs !=
NULL)
21109 xmlSchemaCheckSRCRedefineSecond(pctxt);
21110 if (pctxt->nberrors != 0)
21116 for (
i = 0;
i < nbItems;
i++) {
21117 item = con->pending->items[
i];
21119 case XML_SCHEMA_TYPE_COMPLEX:
21120 if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST
item)) {
21121 xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST
item);
21129 if (pctxt->nberrors != 0)
21136 items = (xmlSchemaTreeItemPtr *) con->pending->items;
21137 nbItems = con->pending->nbItems;
21142 for (
i = 0;
i < nbItems;
i++) {
21145 case XML_SCHEMA_TYPE_ELEMENT:
21146 elemDecl = (xmlSchemaElementPtr)
item;
21148 if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
21150 xmlSchemaCheckElementDeclComponent(
21151 (xmlSchemaElementPtr) elemDecl, pctxt);
21155#ifdef WXS_ELEM_DECL_CONS_ENABLED
21160 if ((WXS_ELEM_TYPEDEF(elemDecl) !=
NULL) &&
21161 (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
21162 (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
21164 xmlSchemaCheckElementDeclConsistent(pctxt,
21165 WXS_BASIC_CAST elemDecl,
21166 WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
21175 if (pctxt->nberrors != 0)
21183 for (
i = 0;
i < nbItems;
i++) {
21186 case XML_SCHEMA_TYPE_COMPLEX:
21187 xmlSchemaBuildContentModel((xmlSchemaTypePtr)
item, pctxt);
21194 if (pctxt->nberrors != 0)
21214 con->bucket = oldbucket;
21215 con->pending->nbItems = 0;
21216 if (con->substGroups !=
NULL) {
21217 xmlHashFree(con->substGroups, xmlSchemaSubstGroupFreeEntry);
21218 con->substGroups =
NULL;
21220 if (con->redefs !=
NULL) {
21221 xmlSchemaRedefListFree(con->redefs);
21222 con->redefs =
NULL;
21237xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
21239 xmlSchemaPtr mainSchema =
NULL;
21240 xmlSchemaBucketPtr bucket =
NULL;
21248 if (xmlSchemaInitTypes() < 0)
21255 ctxt->nberrors = 0;
21260 mainSchema = xmlSchemaNewSchema(ctxt);
21261 if (mainSchema ==
NULL)
21266 if (ctxt->constructor ==
NULL) {
21267 ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
21268 if (ctxt->constructor ==
NULL)
21271 ctxt->ownsConstructor = 1;
21273 ctxt->constructor->mainSchema = mainSchema;
21277 res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
21278 ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size,
NULL,
21285 if (bucket ==
NULL) {
21290 "Failed to locate the main schema resource at '%s'",
21295 "Failed to locate the main schema resource",
21300 if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
21302 if (ctxt->nberrors != 0)
21305 mainSchema->doc = bucket->doc;
21306 mainSchema->preserve = ctxt->preserve;
21308 ctxt->schema = mainSchema;
21310 if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
21318 if (ctxt->nberrors != 0) {
21320 xmlSchemaFree(mainSchema);
21323 if (ctxt->constructor) {
21324 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21325 ctxt->constructor =
NULL;
21326 ctxt->ownsConstructor = 0;
21329 ctxt->schema =
NULL;
21330 return(mainSchema);
21337 xmlSchemaFree(mainSchema);
21340 if (ctxt->constructor) {
21341 xmlSchemaConstructionCtxtFree(ctxt->constructor);
21342 ctxt->constructor =
NULL;
21343 ctxt->ownsConstructor = 0;
21345 PERROR_INT2(
"xmlSchemaParse",
21346 "An internal error occurred");
21347 ctxt->schema =
NULL;
21361xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21362 xmlSchemaValidityErrorFunc
err,
21363 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
21368 ctxt->warning =
warn;
21369 ctxt->errCtxt =
ctx;
21370 if (ctxt->vctxt !=
NULL)
21371 xmlSchemaSetValidErrors(ctxt->vctxt,
err,
warn,
ctx);
21383xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
21389 ctxt->serror = serror;
21390 ctxt->errCtxt =
ctx;
21391 if (ctxt->vctxt !=
NULL)
21392 xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror,
ctx);
21407xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21408 xmlSchemaValidityErrorFunc *
err,
21409 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
21414 *
err = ctxt->error;
21416 *
warn = ctxt->warning;
21418 *
ctx = ctxt->errCtxt;
21432xmlSchemaFacetTypeToString(xmlSchemaTypeType
type)
21435 case XML_SCHEMA_FACET_PATTERN:
21437 case XML_SCHEMA_FACET_MAXEXCLUSIVE:
21439 case XML_SCHEMA_FACET_MAXINCLUSIVE:
21441 case XML_SCHEMA_FACET_MINEXCLUSIVE:
21443 case XML_SCHEMA_FACET_MININCLUSIVE:
21445 case XML_SCHEMA_FACET_WHITESPACE:
21447 case XML_SCHEMA_FACET_ENUMERATION:
21449 case XML_SCHEMA_FACET_LENGTH:
21451 case XML_SCHEMA_FACET_MAXLENGTH:
21453 case XML_SCHEMA_FACET_MINLENGTH:
21455 case XML_SCHEMA_FACET_TOTALDIGITS:
21457 case XML_SCHEMA_FACET_FRACTIONDIGITS:
21458 return (
BAD_CAST "fractionDigits");
21462 return (
BAD_CAST "Internal Error");
21465static xmlSchemaWhitespaceValueType
21466xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr
type)
21472 if (
type->type == XML_SCHEMA_TYPE_BASIC) {
21476 if ((
type->builtInType == XML_SCHEMAS_STRING) ||
21477 (
type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
21478 return(XML_SCHEMA_WHITESPACE_PRESERVE);
21479 else if (
type->builtInType == XML_SCHEMAS_NORMSTRING)
21480 return(XML_SCHEMA_WHITESPACE_REPLACE);
21488 return(XML_SCHEMA_WHITESPACE_COLLAPSE);
21490 }
else if (WXS_IS_LIST(
type)) {
21494 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21495 }
else if (WXS_IS_UNION(
type)) {
21496 return (XML_SCHEMA_WHITESPACE_UNKNOWN);
21497 }
else if (WXS_IS_ATOMIC(
type)) {
21498 if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
21499 return (XML_SCHEMA_WHITESPACE_PRESERVE);
21500 else if (
type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
21501 return (XML_SCHEMA_WHITESPACE_REPLACE);
21503 return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21536xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
21543 xmlSchemaParserCtxtPtr pctxt;
21544 xmlSchemaBucketPtr bucket =
NULL;
21549 if (vctxt->pctxt ==
NULL) {
21550 VERROR_INT(
"xmlSchemaAssembleByLocation",
21551 "no parser context available");
21554 pctxt = vctxt->pctxt;
21555 if (pctxt->constructor ==
NULL) {
21556 PERROR_INT(
"xmlSchemaAssembleByLocation",
21563 location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
21570 ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
21575 if (bucket ==
NULL) {
21581 "The document at location '%s' could not be acquired",
21589 if ((bucket !=
NULL) &&
21590 (WXS_CONSTRUCTOR(pctxt)->bucket ==
NULL))
21591 WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
21596 if ((bucket ==
NULL) || (! CAN_PARSE_SCHEMA(bucket)))
21602 pctxt->nberrors = 0;
21604 pctxt->doc = bucket->doc;
21606 ret = xmlSchemaParseNewDocWithContext(pctxt,
schema, bucket);
21612 if ((
ret == 0) && (pctxt->nberrors != 0))
21614 if (pctxt->nberrors == 0) {
21621 xmlSchemaFixupComponents(pctxt, bucket);
21627 if ((
ret != 0) && (vctxt->err == 0))
21629 vctxt->nberrors += pctxt->nberrors;
21632 vctxt->nberrors += pctxt->nberrors;
21641static xmlSchemaAttrInfoPtr
21642xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
21645 if (vctxt->nbAttrInfos == 0)
21649 xmlSchemaAttrInfoPtr iattr;
21651 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
21652 iattr = vctxt->attrInfos[
i];
21653 if (iattr->metaType == metaType)
21674xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
21679 xmlSchemaAttrInfoPtr iattr;
21689 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21690 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
21692 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21693 XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
21696 cur = iattr->value;
21701 if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
21725 if (iattr->metaType ==
21726 XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
21734 "The value must consist of tuples: the target namespace "
21742 ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
21745 VERROR_INT(
"xmlSchemaAssembleByXSI",
21746 "assembling schemata");
21749 }
while (*
cur != 0);
21754xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
21757 if (vctxt->sax !=
NULL) {
21759 xmlSchemaNodeInfoPtr
inode;
21761 for (
i = vctxt->depth;
i >= 0;
i--) {
21762 if (vctxt->elemInfos[
i]->nbNsBindings != 0) {
21763 inode = vctxt->elemInfos[
i];
21764 for (
j = 0;
j <
inode->nbNsBindings * 2;
j += 2) {
21768 inode->nsBindings[
j]))) {
21774 return (
inode->nsBindings[
j+1]);
21780#ifdef LIBXML_READER_ENABLED
21781 }
else if (vctxt->reader !=
NULL) {
21784 nsName = xmlTextReaderLookupNamespace(vctxt->reader,
prefix);
21785 if (nsName !=
NULL) {
21797 if ((vctxt->inode->node ==
NULL) ||
21798 (vctxt->inode->node->doc ==
NULL)) {
21799 VERROR_INT(
"xmlSchemaLookupNamespace",
21800 "no node or node's doc available");
21803 ns = xmlSearchNs(vctxt->inode->node->doc,
21804 vctxt->inode->node,
prefix);
21815xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
21819 xmlSchemaValPtr *
val,
21824 if (vctxt && (vctxt->schema ==
NULL)) {
21825 VERROR_INT(
"xmlSchemaValidateNotation",
21826 "a schema is needed on the validation context");
21851 if (nsName ==
NULL) {
21856 if (xmlSchemaGetNotation(
schema, localName, nsName) !=
NULL) {
21857 if ((valNeeded) && (
val !=
NULL)) {
21858 (*val) = xmlSchemaNewNOTATIONValue(
xmlStrdup(localName),
21869 if (valNeeded && (
val !=
NULL)) {
21870 (*val) = xmlSchemaNewNOTATIONValue(
21883xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
21892 if (nsname !=
NULL) {
21894 if (nsname ==
NULL)
21897 for (
i = 0;
i < vctxt->nodeQNames->nbItems;
i += 2) {
21898 if ((vctxt->nodeQNames->items [
i] == lname) &&
21899 (vctxt->nodeQNames->items[
i +1] == nsname))
21904 i = vctxt->nodeQNames->nbItems;
21905 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) lname);
21906 xmlSchemaItemListAdd(vctxt->nodeQNames, (
void *) nsname);
21925xmlSchemaAugmentIDC(
void *payload,
void *
data,
21928 xmlSchemaIDCPtr idcDef = (xmlSchemaIDCPtr) payload;
21929 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
21930 xmlSchemaIDCAugPtr aidc;
21932 aidc = (xmlSchemaIDCAugPtr)
xmlMalloc(
sizeof(xmlSchemaIDCAug));
21933 if (aidc ==
NULL) {
21934 xmlSchemaVErrMemory(vctxt,
21935 "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
21939 aidc->keyrefDepth = -1;
21940 aidc->def = idcDef;
21942 if (vctxt->aidcs ==
NULL)
21943 vctxt->aidcs = aidc;
21945 aidc->
next = vctxt->aidcs;
21946 vctxt->aidcs = aidc;
21951 if ((vctxt->hasKeyrefs == 0) &&
21952 (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
21953 vctxt->hasKeyrefs = 1;
21963xmlSchemaAugmentImportedIDC(
void *payload,
void *
data,
21965 xmlSchemaImportPtr imported = (xmlSchemaImportPtr) payload;
21966 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
data;
21967 if (imported->schema->idcDef !=
NULL) {
21968 xmlHashScan(imported->schema->idcDef, xmlSchemaAugmentIDC, vctxt);
21980static xmlSchemaPSVIIDCBindingPtr
21981xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
21983 xmlSchemaPSVIIDCBindingPtr
ret;
21986 sizeof(xmlSchemaPSVIIDCBinding));
21988 xmlSchemaVErrMemory(
NULL,
21989 "allocating a PSVI IDC binding item",
NULL);
21992 memset(
ret, 0,
sizeof(xmlSchemaPSVIIDCBinding));
21993 ret->definition = idcDef;
22009xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
22010 xmlSchemaPSVIIDCNodePtr
item)
22015 if (vctxt->idcNodes ==
NULL) {
22016 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22017 xmlMalloc(20 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22018 if (vctxt->idcNodes ==
NULL) {
22019 xmlSchemaVErrMemory(vctxt,
22020 "allocating the IDC node table item list",
NULL);
22023 vctxt->sizeIdcNodes = 20;
22024 }
else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
22025 vctxt->sizeIdcNodes *= 2;
22026 vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22027 xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
22028 sizeof(xmlSchemaPSVIIDCNodePtr));
22029 if (vctxt->idcNodes ==
NULL) {
22030 xmlSchemaVErrMemory(vctxt,
22031 "re-allocating the IDC node table item list",
NULL);
22035 vctxt->idcNodes[vctxt->nbIdcNodes++] =
item;
22050xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
22051 xmlSchemaPSVIIDCKeyPtr
key)
22056 if (vctxt->idcKeys ==
NULL) {
22057 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22058 xmlMalloc(40 *
sizeof(xmlSchemaPSVIIDCKeyPtr));
22059 if (vctxt->idcKeys ==
NULL) {
22060 xmlSchemaVErrMemory(vctxt,
22061 "allocating the IDC key storage list",
NULL);
22064 vctxt->sizeIdcKeys = 40;
22065 }
else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
22066 vctxt->sizeIdcKeys *= 2;
22067 vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22068 xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
22069 sizeof(xmlSchemaPSVIIDCKeyPtr));
22070 if (vctxt->idcKeys ==
NULL) {
22071 xmlSchemaVErrMemory(vctxt,
22072 "re-allocating the IDC key storage list",
NULL);
22076 vctxt->idcKeys[vctxt->nbIdcKeys++] =
key;
22091xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr
bind,
22092 xmlSchemaPSVIIDCNodePtr ntItem)
22095 bind->sizeNodes = 10;
22096 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22097 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
22099 xmlSchemaVErrMemory(
NULL,
22100 "allocating an array of IDC node-table items",
NULL);
22103 }
else if (
bind->sizeNodes <=
bind->nbNodes) {
22104 bind->sizeNodes *= 2;
22105 bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22107 sizeof(xmlSchemaPSVIIDCNodePtr));
22109 xmlSchemaVErrMemory(
NULL,
22110 "re-allocating an array of IDC node-table items",
NULL);
22114 bind->nodeTable[
bind->nbNodes++] = ntItem;
22129static xmlSchemaPSVIIDCBindingPtr
22130xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
22131 xmlSchemaIDCMatcherPtr matcher)
22133 xmlSchemaNodeInfoPtr ielem;
22135 ielem = vctxt->elemInfos[matcher->depth];
22137 if (ielem->idcTable ==
NULL) {
22138 ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
22139 if (ielem->idcTable ==
NULL)
22141 return(ielem->idcTable);
22143 xmlSchemaPSVIIDCBindingPtr
bind =
NULL;
22145 bind = ielem->idcTable;
22147 if (
bind->definition == matcher->aidc->def)
22150 bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
22153 return(
bind->next);
22161static xmlSchemaItemListPtr
22162xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt
ATTRIBUTE_UNUSED,
22163 xmlSchemaIDCMatcherPtr matcher)
22165 if (matcher->targets ==
NULL)
22166 matcher->targets = xmlSchemaItemListCreate();
22167 return(matcher->targets);
22177xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr
key)
22180 xmlSchemaFreeValue(
key->val);
22191xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr
bind)
22196 xmlSchemaItemListFree(
bind->dupls);
22207xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr
bind)
22209 xmlSchemaPSVIIDCBindingPtr prev;
22214 xmlSchemaIDCFreeBinding(prev);
22221 xmlIDCHashEntryPtr
e = payload,
n;
22236xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
22238 xmlSchemaIDCMatcherPtr
next;
22240 while (matcher !=
NULL) {
22241 next = matcher->next;
22242 if (matcher->keySeqs !=
NULL) {
22244 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22245 if (matcher->keySeqs[
i] !=
NULL)
22249 if (matcher->targets !=
NULL) {
22250 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22252 xmlSchemaPSVIIDCNodePtr idcNode;
22258 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22260 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22265 xmlSchemaItemListFree(matcher->targets);
22267 if (matcher->htab !=
NULL)
22282xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
22283 xmlSchemaIDCMatcherPtr matcher)
22285 xmlSchemaIDCMatcherPtr
next;
22287 while (matcher !=
NULL) {
22288 next = matcher->next;
22289 if (matcher->keySeqs !=
NULL) {
22294 for (
i = 0;
i < matcher->sizeKeySeqs;
i++)
22295 if (matcher->keySeqs[
i] !=
NULL) {
22297 matcher->keySeqs[
i] =
NULL;
22300 if (matcher->targets) {
22301 if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22303 xmlSchemaPSVIIDCNodePtr idcNode;
22309 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
22311 (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[
i];
22316 xmlSchemaItemListFree(matcher->targets);
22317 matcher->targets =
NULL;
22319 if (matcher->htab !=
NULL) {
22321 matcher->htab =
NULL;
22327 if (vctxt->idcMatcherCache !=
NULL)
22328 matcher->nextCached = vctxt->idcMatcherCache;
22329 vctxt->idcMatcherCache = matcher;
22350xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
22351 xmlSchemaIDCMatcherPtr matcher,
22352 xmlSchemaIDCSelectPtr sel,
22355 xmlSchemaIDCStateObjPtr sto;
22360 if (vctxt->xpathStatePool !=
NULL) {
22361 sto = vctxt->xpathStatePool;
22362 vctxt->xpathStatePool = sto->next;
22368 sto = (xmlSchemaIDCStateObjPtr)
xmlMalloc(
sizeof(xmlSchemaIDCStateObj));
22370 xmlSchemaVErrMemory(
NULL,
22371 "allocating an IDC state object",
NULL);
22374 memset(sto, 0,
sizeof(xmlSchemaIDCStateObj));
22379 if (vctxt->xpathStates !=
NULL)
22380 sto->next = vctxt->xpathStates;
22381 vctxt->xpathStates = sto;
22386 if (sto->xpathCtxt !=
NULL)
22387 xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
22392 sto->xpathCtxt = (
void *) xmlPatternGetStreamCtxt(
22393 (xmlPatternPtr) sel->xpathComp);
22394 if (sto->xpathCtxt ==
NULL) {
22395 VERROR_INT(
"xmlSchemaIDCAddStateObject",
22396 "failed to create an XPath validation context");
22400 sto->depth = vctxt->depth;
22401 sto->matcher = matcher;
22403 sto->nbHistory = 0;
22419xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
22420 xmlElementType nodeType)
22423 int res, resolved = 0,
depth = vctxt->depth;
22425 if (vctxt->xpathStates ==
NULL)
22428 if (nodeType == XML_ATTRIBUTE_NODE)
22433 first = vctxt->xpathStates;
22435 while (sto !=
head) {
22436 if (nodeType == XML_ELEMENT_NODE)
22437 res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
22438 vctxt->inode->localName, vctxt->inode->nsName);
22440 res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
22441 vctxt->inode->localName, vctxt->inode->nsName);
22444 VERROR_INT(
"xmlSchemaXPathEvaluate",
22445 "calling xmlStreamPush()");
22456 if (sto->history ==
NULL) {
22457 sto->history = (
int *)
xmlMalloc(5 *
sizeof(
int));
22458 if (sto->history ==
NULL) {
22459 xmlSchemaVErrMemory(
NULL,
22460 "allocating the state object history",
NULL);
22463 sto->sizeHistory = 5;
22464 }
else if (sto->sizeHistory <= sto->nbHistory) {
22465 sto->sizeHistory *= 2;
22466 sto->history = (
int *)
xmlRealloc(sto->history,
22467 sto->sizeHistory *
sizeof(
int));
22468 if (sto->history ==
NULL) {
22469 xmlSchemaVErrMemory(
NULL,
22470 "re-allocating the state object history",
NULL);
22474 sto->history[sto->nbHistory++] =
depth;
22476 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22477 xmlSchemaIDCSelectPtr sel;
22482 sel = sto->matcher->aidc->def->fields;
22483 while (sel !=
NULL) {
22484 if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
22485 sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
22489 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22497 if (resolved == 0) {
22498 if ((vctxt->inode->flags &
22499 XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
22500 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
22505 if (sto->next ==
NULL) {
22510 sto = vctxt->xpathStates;
22518xmlSchemaFormatIDCKeySequence_1(xmlSchemaValidCtxtPtr vctxt,
22520 xmlSchemaPSVIIDCKeyPtr *seq,
22521 int count,
int for_hash)
22530 res = xmlSchemaGetCanonValueWhtspExt(seq[
i]->
val,
22531 xmlSchemaGetWhiteSpaceFacetValue(seq[
i]->
type),
22534 res = xmlSchemaGetCanonValueHash(seq[
i]->
val, &
value);
22539 VERROR_INT(
"xmlSchemaFormatIDCKeySequence",
22540 "failed to compute a canonical value");
22558xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
22560 xmlSchemaPSVIIDCKeyPtr *seq,
22563 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 0);
22567xmlSchemaHashKeySequence(xmlSchemaValidCtxtPtr vctxt,
22569 xmlSchemaPSVIIDCKeyPtr *seq,
22572 return xmlSchemaFormatIDCKeySequence_1(vctxt,
buf, seq,
count, 1);
22584xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
22586 xmlSchemaIDCStateObjPtr sto;
22589 if (vctxt->xpathStates ==
NULL)
22591 sto = vctxt->xpathStates;
22593 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22597 }
while (sto !=
NULL);
22613xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
22616 xmlSchemaIDCStateObjPtr sto, nextsto;
22617 int res, matchDepth;
22618 xmlSchemaPSVIIDCKeyPtr
key =
NULL;
22619 xmlSchemaTypePtr
type = vctxt->inode->typeDef, simpleType =
NULL;
22621 if (vctxt->xpathStates ==
NULL)
22623 sto = vctxt->xpathStates;
22628 while (sto !=
NULL) {
22629 res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22631 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22632 "calling xmlStreamPop()");
22635 if (sto->nbHistory == 0)
22636 goto deregister_check;
22638 matchDepth = sto->history[sto->nbHistory -1];
22643 if (matchDepth !=
depth) {
22647 if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22654 if (WXS_IS_COMPLEX(
type)) {
22655 if (WXS_HAS_SIMPLE_CONTENT(
type)) {
22659 simpleType =
type->contentTypeDef;
22660 if (simpleType ==
NULL) {
22661 VERROR_INT(
"xmlSchemaXPathProcessHistory",
22662 "field resolves to a CT with simple content "
22663 "but the CT is missing the ST definition");
22670 if (simpleType ==
NULL) {
22677 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22679 WXS_BASIC_CAST sto->matcher->aidc->def,
22680 "The XPath '%s' of a field of %s does evaluate to a node of "
22683 xmlSchemaGetIDCDesignation(&
str, sto->matcher->aidc->def));
22684 FREE_AND_NULL(
str);
22686 goto deregister_check;
22689 if ((
key ==
NULL) && (vctxt->inode->val ==
NULL)) {
22695 WXS_BASIC_CAST sto->matcher->aidc->def,
22696 "Warning: No precomputed value available, the value "
22697 "was either invalid or something strange happened");
22699 goto deregister_check;
22701 xmlSchemaIDCMatcherPtr matcher = sto->matcher;
22702 xmlSchemaPSVIIDCKeyPtr *keySeq;
22723 pos = sto->depth - matcher->depth;
22724 idx = sto->sel->index;
22729 if (matcher->keySeqs ==
NULL) {
22731 matcher->sizeKeySeqs =
pos * 2;
22733 matcher->sizeKeySeqs = 10;
22734 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22736 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22737 if (matcher->keySeqs ==
NULL) {
22738 xmlSchemaVErrMemory(
NULL,
22739 "allocating an array of key-sequences",
22743 memset(matcher->keySeqs, 0,
22744 matcher->sizeKeySeqs *
22745 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22746 }
else if (
pos >= matcher->sizeKeySeqs) {
22747 int i = matcher->sizeKeySeqs;
22749 matcher->sizeKeySeqs =
pos * 2;
22750 matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22752 matcher->sizeKeySeqs *
22753 sizeof(xmlSchemaPSVIIDCKeyPtr *));
22754 if (matcher->keySeqs ==
NULL) {
22755 xmlSchemaVErrMemory(
NULL,
22756 "reallocating an array of key-sequences",
22764 for (;
i < matcher->sizeKeySeqs;
i++)
22765 matcher->keySeqs[
i] =
NULL;
22771 keySeq = matcher->keySeqs[
pos];
22772 if (keySeq ==
NULL) {
22773 goto create_sequence;
22774 }
else if (keySeq[
idx] !=
NULL) {
22786 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22788 WXS_BASIC_CAST matcher->aidc->def,
22789 "The XPath '%s' of a field of %s evaluates to a "
22790 "node-set with more than one member",
22792 xmlSchemaGetIDCDesignation(&
str, matcher->aidc->def));
22793 FREE_AND_NULL(
str);
22795 goto deregister_check;
22803 keySeq = (xmlSchemaPSVIIDCKeyPtr *)
xmlMalloc(
22804 matcher->aidc->def->nbFields *
22805 sizeof(xmlSchemaPSVIIDCKeyPtr));
22806 if (keySeq ==
NULL) {
22807 xmlSchemaVErrMemory(
NULL,
22808 "allocating an IDC key-sequence",
NULL);
22811 memset(keySeq, 0, matcher->aidc->def->nbFields *
22812 sizeof(xmlSchemaPSVIIDCKeyPtr));
22813 matcher->keySeqs[
pos] = keySeq;
22820 sizeof(xmlSchemaPSVIIDCKey));
22822 xmlSchemaVErrMemory(
NULL,
22823 "allocating a IDC key",
NULL);
22825 matcher->keySeqs[
pos] =
NULL;
22831 key->type = simpleType;
22832 key->val = vctxt->inode->val;
22833 vctxt->inode->val =
NULL;
22837 if (xmlSchemaIDCStoreKey(vctxt,
key) == -1) {
22838 xmlSchemaIDCFreeKey(
key);
22844 }
else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22846 xmlSchemaPSVIIDCKeyPtr **keySeq =
NULL;
22848 xmlSchemaPSVIIDCNodePtr ntItem;
22849 xmlSchemaIDCMatcherPtr matcher;
22850 xmlSchemaIDCPtr idc;
22851 xmlSchemaItemListPtr targets;
22852 int pos,
i,
j, nbKeys;
22864 matcher = sto->matcher;
22865 idc = matcher->aidc->def;
22866 nbKeys = idc->nbFields;
22872 if ((matcher->keySeqs ==
NULL) ||
22873 (matcher->sizeKeySeqs <=
pos)) {
22874 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22875 goto selector_key_error;
22877 goto selector_leave;
22880 keySeq = &(matcher->keySeqs[
pos]);
22881 if (*keySeq ==
NULL) {
22882 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22883 goto selector_key_error;
22885 goto selector_leave;
22888 for (
i = 0;
i < nbKeys;
i++) {
22889 if ((*keySeq)[
i] ==
NULL) {
22893 if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
22897 goto selector_key_error;
22899 goto selector_leave;
22916 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
22918 targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
22919 if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
22920 (targets->nbItems != 0)) {
22921 xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
22922 xmlIDCHashEntryPtr
e;
22926 if (!matcher->htab)
22930 xmlSchemaHashKeySequence(vctxt, &
value, *keySeq, nbKeys);
22932 FREE_AND_NULL(
value);
22940 ((xmlSchemaPSVIIDCNodePtr) targets->items[
e->index])->keys;
22941 for (
j = 0;
j < nbKeys;
j++) {
22942 ckey = (*keySeq)[
j];
22944 res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
22947 }
else if (
res == 0) {
22967 xmlSchemaCustomErr(ACTXT_CAST vctxt,
22969 WXS_BASIC_CAST idc,
22970 "Duplicate key-sequence %s in %s",
22971 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
22972 (*keySeq), nbKeys),
22973 xmlSchemaGetIDCDesignation(&strB, idc));
22974 FREE_AND_NULL(
str);
22975 FREE_AND_NULL(strB);
22976 goto selector_leave;
22982 ntItem = (xmlSchemaPSVIIDCNodePtr)
xmlMalloc(
22983 sizeof(xmlSchemaPSVIIDCNode));
22984 if (ntItem ==
NULL) {
22985 xmlSchemaVErrMemory(
NULL,
22986 "allocating an IDC node-table item",
NULL);
22991 memset(ntItem, 0,
sizeof(xmlSchemaPSVIIDCNode));
22996 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
22997 if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
23003 ntItem->nodeQNameID = -1;
23009 ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
23010 vctxt->inode->localName, vctxt->inode->nsName);
23011 if (ntItem->nodeQNameID == -1) {
23022 ntItem->node = vctxt->node;
23023 ntItem->nodeLine = vctxt->inode->nodeLine;
23024 ntItem->keys = *keySeq;
23027 if (xmlSchemaIDCAppendNodeTableItem(
bind, ntItem) == -1)
23029 if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
23030 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23040 if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23042 xmlIDCHashEntryPtr
r,
e;
23043 if (!matcher->htab)
23045 xmlSchemaHashKeySequence(vctxt, &
value, ntItem->keys, nbKeys);
23047 e->index = targets->nbItems - 1;
23056 FREE_AND_NULL(
value);
23059 goto selector_leave;
23069 xmlSchemaCustomErr(ACTXT_CAST vctxt,
23071 WXS_BASIC_CAST idc,
23072 "Not all fields of %s evaluate to a node",
23073 xmlSchemaGetIDCDesignation(&
str, idc),
NULL);
23074 FREE_AND_NULL(
str);
23080 if ((keySeq !=
NULL) && (*keySeq !=
NULL)) {
23092 if ((sto->nbHistory == 0) && (sto->depth ==
depth)) {
23093 if (vctxt->xpathStates != sto) {
23094 VERROR_INT(
"xmlSchemaXPathProcessHistory",
23095 "The state object to be removed is not the first "
23098 nextsto = sto->next;
23102 vctxt->xpathStates = sto->next;
23103 sto->next = vctxt->xpathStatePool;
23107 vctxt->xpathStatePool = sto;
23126xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
23127 xmlSchemaElementPtr elemDecl)
23129 xmlSchemaIDCMatcherPtr matcher,
last =
NULL;
23130 xmlSchemaIDCPtr idc, refIdc;
23131 xmlSchemaIDCAugPtr aidc;
23133 idc = (xmlSchemaIDCPtr) elemDecl->idcs;
23137 if (vctxt->inode->idcMatchers !=
NULL) {
23138 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23139 "The chain of IDC matchers is expected to be empty");
23143 if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23151 refIdc = (xmlSchemaIDCPtr) idc->ref->item;
23156 vctxt->inode->hasKeyrefs = 1;
23160 aidc = vctxt->aidcs;
23161 while (aidc !=
NULL) {
23162 if (aidc->def == refIdc)
23166 if (aidc ==
NULL) {
23167 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23168 "Could not find an augmented IDC item for an IDC "
23172 if ((aidc->keyrefDepth == -1) ||
23173 (vctxt->depth < aidc->keyrefDepth))
23174 aidc->keyrefDepth = vctxt->depth;
23180 aidc = vctxt->aidcs;
23181 while (aidc !=
NULL) {
23182 if (aidc->def == idc)
23186 if (aidc ==
NULL) {
23187 VERROR_INT(
"xmlSchemaIDCRegisterMatchers",
23188 "Could not find an augmented IDC item for an IDC definition");
23194 if (vctxt->idcMatcherCache !=
NULL) {
23198 matcher = vctxt->idcMatcherCache;
23199 vctxt->idcMatcherCache = matcher->nextCached;
23200 matcher->nextCached =
NULL;
23202 matcher = (xmlSchemaIDCMatcherPtr)
23203 xmlMalloc(
sizeof(xmlSchemaIDCMatcher));
23204 if (matcher ==
NULL) {
23205 xmlSchemaVErrMemory(vctxt,
23206 "allocating an IDC matcher",
NULL);
23209 memset(matcher, 0,
sizeof(xmlSchemaIDCMatcher));
23212 vctxt->inode->idcMatchers = matcher;
23214 last->next = matcher;
23217 matcher->type = IDC_MATCHER;
23218 matcher->depth = vctxt->depth;
23219 matcher->aidc = aidc;
23220 matcher->idcType = aidc->def->type;
23224 if (xmlSchemaIDCAddStateObject(vctxt, matcher,
23225 idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
23229 }
while (idc !=
NULL);
23234xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
23235 xmlSchemaNodeInfoPtr ielem)
23237 xmlSchemaPSVIIDCBindingPtr
bind;
23238 int res,
i,
j,
k, nbTargets, nbFields, nbDupls, nbNodeTable;
23239 xmlSchemaPSVIIDCKeyPtr *
keys, *ntkeys;
23240 xmlSchemaPSVIIDCNodePtr *targets, *dupls;
23242 xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
23244 while (matcher !=
NULL) {
23248 if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
23249 WXS_ILIST_IS_EMPTY(matcher->targets))
23251 matcher = matcher->next;
23258 if ((! vctxt->createIDCNodeTables) &&
23259 ((matcher->aidc->keyrefDepth == -1) ||
23260 (matcher->aidc->keyrefDepth > vctxt->depth)))
23262 matcher = matcher->next;
23268 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23270 goto internal_error;
23272 if (! WXS_ILIST_IS_EMPTY(
bind->dupls)) {
23273 dupls = (xmlSchemaPSVIIDCNodePtr *)
bind->dupls->items;
23274 nbDupls =
bind->dupls->nbItems;
23280 nbNodeTable =
bind->nbNodes;
23285 if ((nbNodeTable == 0) && (nbDupls == 0)) {
23290 (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23291 bind->sizeNodes = matcher->targets->sizeItems;
23292 bind->nbNodes = matcher->targets->nbItems;
23294 matcher->targets->items =
NULL;
23295 matcher->targets->sizeItems = 0;
23296 matcher->targets->nbItems = 0;
23297 if (matcher->htab) {
23299 matcher->htab =
NULL;
23305 nbTargets = matcher->targets->nbItems;
23306 targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23307 nbFields = matcher->aidc->def->nbFields;
23310 keys = targets[
i]->keys;
23317 if (nbFields == 1) {
23321 goto internal_error;
23330 ntkeys = dupls[
j]->keys;
23331 for (
k = 0;
k < nbFields;
k++) {
23335 goto internal_error;
23351 }
while (
j < nbDupls);
23356 if (nbFields == 1) {
23358 bind->nodeTable[
j]->keys[0]->val);
23360 goto internal_error;
23365 goto next_node_table_entry;
23369 ntkeys =
bind->nodeTable[
j]->keys;
23370 for (
k = 0;
k < nbFields;
k++) {
23374 goto internal_error;
23379 goto next_node_table_entry;
23387 bind->dupls = xmlSchemaItemListCreate();
23389 goto internal_error;
23391 if (xmlSchemaItemListAdd(
bind->dupls,
bind->nodeTable[
j]) == -1)
23392 goto internal_error;
23401next_node_table_entry:
23403 }
while (
j < nbNodeTable);
23409 if (xmlSchemaIDCAppendNodeTableItem(
bind, targets[
i]) == -1)
23410 goto internal_error;
23414 }
while (
i < nbTargets);
23416 matcher = matcher->next;
23436xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
23438 xmlSchemaPSVIIDCBindingPtr
bind;
23439 xmlSchemaPSVIIDCBindingPtr *parTable, parBind =
NULL;
23440 xmlSchemaPSVIIDCNodePtr
node, parNode =
NULL, *dupls, *parNodes;
23441 xmlSchemaIDCAugPtr aidc;
23442 int i,
j,
k,
ret = 0, nbFields, oldNum, oldDupls;
23444 bind = vctxt->inode->idcTable;
23450 parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
23457 if ((
bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(
bind->dupls))
23462 if (! vctxt->createIDCNodeTables) {
23463 aidc = vctxt->aidcs;
23465 if (aidc->def ==
bind->definition) {
23466 if ((aidc->keyrefDepth == -1) ||
23467 (aidc->keyrefDepth >= vctxt->depth)) {
23473 }
while (aidc !=
NULL);
23476 if (parTable !=
NULL)
23477 parBind = *parTable;
23482 while (parBind !=
NULL) {
23483 if (parBind->definition ==
bind->definition)
23485 parBind = parBind->next;
23488 if (parBind !=
NULL) {
23493 oldNum = parBind->nbNodes;
23495 if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
23496 oldDupls = parBind->dupls->nbItems;
23497 dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
23503 parNodes = parBind->nodeTable;
23504 nbFields =
bind->definition->nbFields;
23506 for (
i = 0;
i <
bind->nbNodes;
i++) {
23516 while (
j < oldDupls) {
23517 if (nbFields == 1) {
23518 ret = xmlSchemaAreValuesEqual(
23519 node->keys[0]->val,
23520 dupls[
j]->keys[0]->val);
23522 goto internal_error;
23528 parNode = dupls[
j];
23529 for (
k = 0;
k < nbFields;
k++) {
23530 ret = xmlSchemaAreValuesEqual(
23531 node->keys[
k]->val,
23532 parNode->keys[
k]->val);
23534 goto internal_error;
23544 if (
j != oldDupls) {
23554 while (
j < oldNum) {
23555 parNode = parNodes[
j];
23556 if (nbFields == 1) {
23557 ret = xmlSchemaAreValuesEqual(
23558 node->keys[0]->val,
23559 parNode->keys[0]->val);
23561 goto internal_error;
23567 for (
k = 0;
k < nbFields;
k++) {
23568 ret = xmlSchemaAreValuesEqual(
23569 node->keys[
k]->val,
23570 parNode->keys[
k]->val);
23572 goto internal_error;
23589 parBind->nbNodes--;
23593 parNodes[
j] = parNodes[oldNum];
23595 if (parBind->nbNodes != oldNum) {
23601 parNodes[parBind->nbNodes];
23603 if (parBind->dupls ==
NULL) {
23604 parBind->dupls = xmlSchemaItemListCreate();
23605 if (parBind->dupls ==
NULL)
23606 goto internal_error;
23608 xmlSchemaItemListAdd(parBind->dupls, parNode);
23614 if (parBind->nodeTable ==
NULL) {
23615 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23616 xmlMalloc(10 *
sizeof(xmlSchemaPSVIIDCNodePtr));
23617 if (parBind->nodeTable ==
NULL) {
23618 xmlSchemaVErrMemory(
NULL,
23619 "allocating IDC list of node-table items",
NULL);
23620 goto internal_error;
23622 parBind->sizeNodes = 1;
23623 }
else if (parBind->nbNodes >= parBind->sizeNodes) {
23624 parBind->sizeNodes *= 2;
23625 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23626 xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
23627 sizeof(xmlSchemaPSVIIDCNodePtr));
23628 if (parBind->nodeTable ==
NULL) {
23629 xmlSchemaVErrMemory(
NULL,
23630 "re-allocating IDC list of node-table items",
NULL);
23631 goto internal_error;
23634 parNodes = parBind->nodeTable;
23639 parNodes[parBind->nbNodes++] =
node;
23650 parBind = xmlSchemaIDCNewBinding(
bind->definition);
23651 if (parBind ==
NULL)
23652 goto internal_error;
23658 if (
bind->nbNodes != 0) {
23662 if (! vctxt->psviExposeIDCNodeTables) {
23669 parBind->nodeTable =
bind->nodeTable;
23671 parBind->sizeNodes =
bind->sizeNodes;
23672 bind->sizeNodes = 0;
23673 parBind->nbNodes =
bind->nbNodes;
23679 parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23681 sizeof(xmlSchemaPSVIIDCNodePtr));
23682 if (parBind->nodeTable ==
NULL) {
23683 xmlSchemaVErrMemory(
NULL,
23684 "allocating an array of IDC node-table "
23686 xmlSchemaIDCFreeBinding(parBind);
23687 goto internal_error;
23689 parBind->sizeNodes =
bind->nbNodes;
23690 parBind->nbNodes =
bind->nbNodes;
23692 bind->nbNodes *
sizeof(xmlSchemaPSVIIDCNodePtr));
23699 if (parBind->dupls !=
NULL)
23700 xmlSchemaItemListFree(parBind->dupls);
23701 parBind->dupls =
bind->dupls;
23704 if (parTable !=
NULL) {
23705 if (*parTable ==
NULL)
23706 *parTable = parBind;
23708 parBind->
next = *parTable;
23709 *parTable = parBind;
23731xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
23733 xmlSchemaIDCMatcherPtr matcher;
23734 xmlSchemaPSVIIDCBindingPtr
bind;
23736 matcher = vctxt->inode->idcMatchers;
23740 while (matcher !=
NULL) {
23741 if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
23742 matcher->targets &&
23743 matcher->targets->nbItems)
23745 int i,
j,
k,
res, nbFields, hasDupls;
23746 xmlSchemaPSVIIDCKeyPtr *refKeys, *
keys;
23747 xmlSchemaPSVIIDCNodePtr refNode =
NULL;
23750 nbFields = matcher->aidc->def->nbFields;
23755 bind = vctxt->inode->idcTable;
23757 if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
23762 hasDupls = (
bind &&
bind->dupls &&
bind->dupls->nbItems) ? 1 : 0;
23768 for (
j = 0;
j <
bind->nbNodes;
j++) {
23770 xmlIDCHashEntryPtr
r,
e;
23772 xmlSchemaHashKeySequence(vctxt, &
value,
keys, nbFields);
23783 FREE_AND_NULL(
value);
23786 for (
i = 0;
i < matcher->targets->nbItems;
i++) {
23788 refNode = matcher->targets->items[
i];
23791 xmlIDCHashEntryPtr
e;
23792 refKeys = refNode->keys;
23793 xmlSchemaHashKeySequence(vctxt, &
value, refKeys, nbFields);
23795 FREE_AND_NULL(
value);
23798 keys =
bind->nodeTable[
e->index]->keys;
23799 for (
k = 0;
k < nbFields;
k++) {
23804 else if (
res == -1) {
23815 if ((
res == 0) && hasDupls) {
23819 for (
j = 0;
j <
bind->dupls->nbItems;
j++) {
23820 keys = ((xmlSchemaPSVIIDCNodePtr)
23821 bind->dupls->items[
j])->keys;
23822 for (
k = 0;
k < nbFields;
k++) {
23827 else if (
res == -1) {
23836 xmlSchemaKeyrefErr(vctxt,
23838 (xmlSchemaTypePtr) matcher->aidc->def,
23839 "More than one match found for "
23840 "key-sequence %s of keyref '%s'",
23841 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
23842 refNode->keys, nbFields),
23843 xmlSchemaGetComponentQName(&strB,
23844 matcher->aidc->def));
23845 FREE_AND_NULL(
str);
23846 FREE_AND_NULL(strB);
23855 xmlSchemaKeyrefErr(vctxt,
23857 (xmlSchemaTypePtr) matcher->aidc->def,
23858 "No match found for key-sequence %s of keyref '%s'",
23859 xmlSchemaFormatIDCKeySequence(vctxt, &
str,
23860 refNode->keys, nbFields),
23861 xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
23862 FREE_AND_NULL(
str);
23863 FREE_AND_NULL(strB);
23870 matcher = matcher->next;
23882static xmlSchemaAttrInfoPtr
23883xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
23885 xmlSchemaAttrInfoPtr iattr;
23889 if (vctxt->attrInfos ==
NULL) {
23890 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23891 xmlMalloc(
sizeof(xmlSchemaAttrInfoPtr));
23892 vctxt->sizeAttrInfos = 1;
23893 if (vctxt->attrInfos ==
NULL) {
23894 xmlSchemaVErrMemory(vctxt,
23895 "allocating attribute info list",
NULL);
23898 }
else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
23899 vctxt->sizeAttrInfos++;
23900 vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23902 vctxt->sizeAttrInfos *
sizeof(xmlSchemaAttrInfoPtr));
23903 if (vctxt->attrInfos ==
NULL) {
23904 xmlSchemaVErrMemory(vctxt,
23905 "re-allocating attribute info list",
NULL);
23909 iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
23910 if (iattr->localName !=
NULL) {
23911 VERROR_INT(
"xmlSchemaGetFreshAttrInfo",
23912 "attr info not cleared");
23915 iattr->nodeType = XML_ATTRIBUTE_NODE;
23921 iattr = (xmlSchemaAttrInfoPtr)
23923 if (iattr ==
NULL) {
23924 xmlSchemaVErrMemory(vctxt,
"creating new attribute info",
NULL);
23927 memset(iattr, 0,
sizeof(xmlSchemaAttrInfo));
23928 iattr->nodeType = XML_ATTRIBUTE_NODE;
23929 vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
23935xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
23936 xmlNodePtr attrNode,
23944 xmlSchemaAttrInfoPtr
attr;
23946 attr = xmlSchemaGetFreshAttrInfo(vctxt);
23948 VERROR_INT(
"xmlSchemaPushAttribute",
23949 "calling xmlSchemaGetFreshAttrInfo()");
23952 attr->node = attrNode;
23953 attr->nodeLine = nodeLine;
23954 attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
23955 attr->localName = localName;
23956 attr->nsName = nsName;
23958 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
23962 if (nsName !=
NULL) {
23965 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
23969 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
23973 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
23977 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
23980 attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
23985 attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
23986 if (
attr->metaType != 0)
23987 attr->state = XML_SCHEMAS_ATTR_META;
23997xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
23998 xmlSchemaNodeInfoPtr ielem)
24000 ielem->hasKeyrefs = 0;
24001 ielem->appliedXPath = 0;
24002 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
24003 FREE_AND_NULL(ielem->localName);
24004 FREE_AND_NULL(ielem->nsName);
24006 ielem->localName =
NULL;
24007 ielem->nsName =
NULL;
24009 if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
24010 FREE_AND_NULL(ielem->value);
24012 ielem->value =
NULL;
24014 if (ielem->val !=
NULL) {
24019 xmlSchemaFreeValue(ielem->val);
24022 if (ielem->idcMatchers !=
NULL) {
24027 xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
24029 xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
24031 ielem->idcMatchers =
NULL;
24033 if (ielem->idcTable !=
NULL) {
24037 xmlSchemaIDCFreeIDCTable(ielem->idcTable);
24038 ielem->idcTable =
NULL;
24040 if (ielem->regexCtxt !=
NULL) {
24041 xmlRegFreeExecCtxt(ielem->regexCtxt);
24042 ielem->regexCtxt =
NULL;
24044 if (ielem->nsBindings !=
NULL) {
24046 ielem->nsBindings =
NULL;
24047 ielem->nbNsBindings = 0;
24048 ielem->sizeNsBindings = 0;
24061static xmlSchemaNodeInfoPtr
24062xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
24066 if (vctxt->depth > vctxt->sizeElemInfos) {
24067 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24068 "inconsistent depth encountered");
24071 if (vctxt->elemInfos ==
NULL) {
24072 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24073 xmlMalloc(10 *
sizeof(xmlSchemaNodeInfoPtr));
24074 if (vctxt->elemInfos ==
NULL) {
24075 xmlSchemaVErrMemory(vctxt,
24076 "allocating the element info array",
NULL);
24079 memset(vctxt->elemInfos, 0, 10 *
sizeof(xmlSchemaNodeInfoPtr));
24080 vctxt->sizeElemInfos = 10;
24081 }
else if (vctxt->sizeElemInfos <= vctxt->depth) {
24082 int i = vctxt->sizeElemInfos;
24084 vctxt->sizeElemInfos *= 2;
24085 vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24086 xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
24087 sizeof(xmlSchemaNodeInfoPtr));
24088 if (vctxt->elemInfos ==
NULL) {
24089 xmlSchemaVErrMemory(vctxt,
24090 "re-allocating the element info array",
NULL);
24097 for (;
i < vctxt->sizeElemInfos;
i++)
24098 vctxt->elemInfos[
i] =
NULL;
24100 info = vctxt->elemInfos[vctxt->depth];
24103 info = (xmlSchemaNodeInfoPtr)
24106 xmlSchemaVErrMemory(vctxt,
24107 "allocating an element info",
NULL);
24110 vctxt->elemInfos[vctxt->depth] =
info;
24113 VERROR_INT(
"xmlSchemaGetFreshElemInfo",
24114 "elem info has not been cleared");
24119 info->nodeType = XML_ELEMENT_NODE;
24120 info->depth = vctxt->depth;
24125#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
24126#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
24127#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
24130xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
24132 xmlSchemaTypePtr
type,
24133 xmlSchemaValType valType,
24135 xmlSchemaValPtr
val,
24141 xmlSchemaTypePtr tmpType;
24142 xmlSchemaFacetLinkPtr facetLink;
24143 xmlSchemaFacetPtr facet;
24144 unsigned long len = 0;
24145 xmlSchemaWhitespaceValueType
ws;
24150 if (
type->type == XML_SCHEMA_TYPE_BASIC)
24159 goto pattern_and_enum;
24161 if (! WXS_IS_ATOMIC(
type)) {
24162 if (WXS_IS_LIST(
type))
24165 goto pattern_and_enum;
24172 tmpType = xmlSchemaGetPrimitiveType(
type);
24173 if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
24174 WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
24175 ws = xmlSchemaGetWhiteSpaceFacetValue(
type);
24177 ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
24185 valType = xmlSchemaGetValType(
val);
24188 for (facetLink =
type->facetSet; facetLink !=
NULL;
24189 facetLink = facetLink->
next) {
24194 switch (facetLink->facet->type) {
24195 case XML_SCHEMA_FACET_WHITESPACE:
24196 case XML_SCHEMA_FACET_PATTERN:
24197 case XML_SCHEMA_FACET_ENUMERATION:
24199 case XML_SCHEMA_FACET_LENGTH:
24200 case XML_SCHEMA_FACET_MINLENGTH:
24201 case XML_SCHEMA_FACET_MAXLENGTH:
24202 ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
24206 ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
24211 AERROR_INT(
"xmlSchemaValidateFacets",
24212 "validating against a atomic type facet");
24214 }
else if (
ret > 0) {
24216 xmlSchemaFacetErr(actxt,
ret,
node,
24227 if (! WXS_IS_LIST(
type))
24228 goto pattern_and_enum;
24233 for (facetLink =
type->facetSet; facetLink !=
NULL;
24234 facetLink = facetLink->
next) {
24236 switch (facetLink->facet->type) {
24237 case XML_SCHEMA_FACET_LENGTH:
24238 case XML_SCHEMA_FACET_MINLENGTH:
24239 case XML_SCHEMA_FACET_MAXLENGTH:
24240 ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
24247 AERROR_INT(
"xmlSchemaValidateFacets",
24248 "validating against a list type facet");
24250 }
else if (
ret > 0) {
24252 xmlSchemaFacetErr(actxt,
ret,
node,
24274 for (facet = tmpType->facets; facet !=
NULL; facet = facet->
next) {
24275 if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
24278 ret = xmlSchemaAreValuesEqual(facet->val,
val);
24281 else if (
ret < 0) {
24282 AERROR_INT(
"xmlSchemaValidateFacets",
24283 "validating against an enumeration facet");
24297 tmpType = tmpType->baseType;
24298 }
while ((tmpType !=
NULL) &&
24299 (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24300 if (found && (
ret == 0)) {
24303 xmlSchemaFacetErr(actxt,
ret,
node,
24319 for (facetLink = tmpType->facetSet; facetLink !=
NULL;
24320 facetLink = facetLink->
next) {
24321 if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
24328 ret = xmlRegexpExec(facetLink->facet->regexp,
value);
24331 else if (
ret < 0) {
24332 AERROR_INT(
"xmlSchemaValidateFacets",
24333 "validating against a pattern facet");
24339 facet = facetLink->facet;
24342 if (found && (
ret != 1)) {
24345 xmlSchemaFacetErr(actxt,
ret,
node,
24353 tmpType = tmpType->baseType;
24354 }
while ((tmpType !=
NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24360xmlSchemaNormalizeValue(xmlSchemaTypePtr
type,
24363 switch (xmlSchemaGetWhiteSpaceFacetValue(
type)) {
24364 case XML_SCHEMA_WHITESPACE_COLLAPSE:
24365 return (xmlSchemaCollapseString(
value));
24366 case XML_SCHEMA_WHITESPACE_REPLACE:
24367 return (xmlSchemaWhiteSpaceReplace(
value));
24374xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
24376 xmlSchemaValPtr *
val,
24387 VERROR_INT(
"xmlSchemaValidateQName",
24388 "calling xmlValidateQName()");
24398 stripped = xmlSchemaCollapseString(
value);
24408 nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
24416 if (nsName ==
NULL) {
24418 xmlSchemaCustomErr(ACTXT_CAST vctxt,
ret,
NULL,
24419 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24420 "The QName value '%s' has no "
24421 "corresponding namespace declaration in "
24428 if (valNeeded &&
val) {
24429 if (nsName !=
NULL)
24430 *
val = xmlSchemaNewQNameValue(
24433 *
val = xmlSchemaNewQNameValue(
NULL,
24444xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
24446 xmlSchemaTypePtr
type,
24448 xmlSchemaValPtr *retVal,
24453 int ret = 0, valNeeded = (retVal) ? 1 : 0;
24458#define NORMALIZE(atype) \
24459 if ((! isNormalized) && \
24460 (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
24461 normValue = xmlSchemaNormalizeValue(atype, value); \
24462 if (normValue != NULL) \
24463 value = normValue; \
24464 isNormalized = 1; \
24467 if ((retVal !=
NULL) && (*retVal !=
NULL)) {
24468 xmlSchemaFreeValue(*retVal);
24493 if ((! valNeeded) && (
type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
24497 if (WXS_IS_ANY_SIMPLE_TYPE(
type) || WXS_IS_ATOMIC(
type)) {
24498 xmlSchemaTypePtr biType;
24507 if (
type->type != XML_SCHEMA_TYPE_BASIC) {
24511 biType =
type->baseType;
24512 while ((biType !=
NULL) &&
24513 (biType->type != XML_SCHEMA_TYPE_BASIC))
24514 biType = biType->baseType;
24516 if (biType ==
NULL) {
24517 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24518 "could not get the built-in type");
24519 goto internal_error;
24527 if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
24528 switch (biType->builtInType) {
24529 case XML_SCHEMAS_NOTATION:
24530 ret = xmlSchemaValidateNotation(
24531 (xmlSchemaValidCtxtPtr) actxt,
24532 ((xmlSchemaValidCtxtPtr) actxt)->
schema,
24535 case XML_SCHEMAS_QNAME:
24536 ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
24542 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24545 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24549 }
else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
24550 switch (biType->builtInType) {
24551 case XML_SCHEMAS_NOTATION:
24552 ret = xmlSchemaValidateNotation(
NULL,
24553 ((xmlSchemaParserCtxtPtr) actxt)->
schema,
node,
24559 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24562 ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24571 goto internal_error;
24575 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24576 "validating against a built-in type");
24577 goto internal_error;
24579 if (WXS_IS_LIST(
type))
24584 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24589 (xmlSchemaValType) biType->builtInType,
value,
val,
24593 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24594 "validating facets of atomic simple type");
24595 goto internal_error;
24597 if (WXS_IS_LIST(
type))
24603 else if (fireErrors && (
ret > 0))
24605 }
else if (WXS_IS_LIST(
type)) {
24607 xmlSchemaTypePtr itemType;
24610 unsigned long len = 0;
24611 xmlSchemaValPtr prevVal =
NULL, curVal =
NULL;
24625 itemType = WXS_LIST_ITEMTYPE(
type);
24639 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24640 tmpValue, &curVal, fireErrors, 0, 1);
24642 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node, itemType,
24643 tmpValue,
NULL, fireErrors, 0, 1);
24644 FREE_AND_NULL(tmpValue);
24645 if (curVal !=
NULL) {
24652 xmlSchemaValueAppend(prevVal, curVal);
24658 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24659 "validating an item of list simple type");
24660 goto internal_error;
24666 }
while (*
cur != 0);
24667 FREE_AND_NULL(tmpValue);
24668 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24677 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24678 "validating facets of list simple type");
24679 goto internal_error;
24684 if (fireErrors && (
ret > 0)) {
24692 }
else if (WXS_IS_UNION(
type)) {
24693 xmlSchemaTypeLinkPtr memberLink;
24710 memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(
type);
24711 if (memberLink ==
NULL) {
24712 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24713 "union simple type has no member types");
24714 goto internal_error;
24722 while (memberLink !=
NULL) {
24724 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24725 memberLink->type,
value, &
val, 0, 1, 0);
24727 ret = xmlSchemaVCheckCVCSimpleType(actxt,
node,
24728 memberLink->type,
value,
NULL, 0, 1, 0);
24731 memberLink = memberLink->next;
24735 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24736 "validating members of union simple type");
24737 goto internal_error;
24744 if ((
ret == 0) && (
type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24756 AERROR_INT(
"xmlSchemaVCheckCVCSimpleType",
24757 "validating facets of union simple type");
24758 goto internal_error;
24763 if (fireErrors && (
ret > 0))
24767 if (normValue !=
NULL)
24770 if (retVal !=
NULL)
24773 xmlSchemaFreeValue(
val);
24775 xmlSchemaFreeValue(
val);
24778 if (normValue !=
NULL)
24781 xmlSchemaFreeValue(
val);
24786xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
24793 if ((nsName ==
NULL) || (localName ==
NULL))
24802 xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
24804 value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
24823 *nsName = xmlSchemaLookupNamespace(vctxt,
prefix);
24830 if (*nsName ==
NULL) {
24831 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24833 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24834 "The QName value '%s' has no "
24835 "corresponding namespace declaration in scope",
24845xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
24846 xmlSchemaAttrInfoPtr iattr,
24847 xmlSchemaTypePtr *localType,
24848 xmlSchemaElementPtr elemDecl)
24858 if (localType ==
NULL)
24869 ACTIVATE_ATTRIBUTE(iattr);
24874 ret = xmlSchemaVExpandQName(vctxt, iattr->value,
24878 VERROR_INT(
"xmlSchemaValidateElementByDeclaration",
24879 "calling xmlSchemaQNameExpand() to validate the "
24880 "attribute 'xsi:type'");
24881 goto internal_error;
24889 *localType = xmlSchemaGetType(vctxt->schema,
local, nsName);
24890 if (*localType ==
NULL) {
24893 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24895 WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24896 "The QName value '%s' of the xsi:type attribute does not "
24897 "resolve to a type definition",
24899 FREE_AND_NULL(
str);
24903 if (elemDecl !=
NULL) {
24926 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
24927 (elemDecl->subtypes->flags &
24928 XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
24929 set |= SUBSET_EXTENSION;
24931 if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
24932 (elemDecl->subtypes->flags &
24933 XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
24934 set |= SUBSET_RESTRICTION;
24947 if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
24948 elemDecl->subtypes,
set) != 0) {
24951 xmlSchemaCustomErr(ACTXT_CAST vctxt,
24953 "The type definition '%s', specified by xsi:type, is "
24954 "blocked or not validly derived from the type definition "
24955 "of the element declaration",
24956 xmlSchemaFormatQName(&
str,
24957 (*localType)->targetNamespace,
24958 (*localType)->name),
24960 FREE_AND_NULL(
str);
24975xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
24977 xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
24978 xmlSchemaTypePtr actualType;
24983 if (elemDecl ==
NULL) {
24985 "No matching declaration available");
24986 return (vctxt->err);
24988 actualType = WXS_ELEM_TYPEDEF(elemDecl);
24992 if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
24994 "The element declaration is abstract");
24995 return (vctxt->err);
24997 if (actualType ==
NULL) {
24999 "The type definition is absent");
25002 if (vctxt->nbAttrInfos != 0) {
25004 xmlSchemaAttrInfoPtr iattr;
25009 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25010 XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
25012 ACTIVATE_ATTRIBUTE(iattr);
25016 ret = xmlSchemaVCheckCVCSimpleType(
25017 ACTXT_CAST vctxt,
NULL,
25018 xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
25019 iattr->
value, &(iattr->val), 1, 0, 0);
25022 VERROR_INT(
"xmlSchemaValidateElemDecl",
25023 "calling xmlSchemaVCheckCVCSimpleType() to "
25024 "validate the attribute 'xsi:nil'");
25028 if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
25033 "The element is not 'nillable'");
25036 if (xmlSchemaValueGetAsBoolean(iattr->val)) {
25040 if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
25041 (elemDecl->value !=
NULL)) {
25043 "The element cannot be 'nilled' because "
25044 "there is a fixed value constraint defined "
25048 vctxt->inode->flags |=
25049 XML_SCHEMA_ELEM_INFO_NILLED;
25058 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25059 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25061 xmlSchemaTypePtr localType =
NULL;
25063 ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
25067 VERROR_INT(
"xmlSchemaValidateElemDecl",
25068 "calling xmlSchemaProcessXSIType() to "
25069 "process the attribute 'xsi:type'");
25074 if (localType !=
NULL) {
25075 vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
25076 actualType = localType;
25083 if ((elemDecl->idcs !=
NULL) &&
25084 (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
25089 if (actualType ==
NULL) {
25091 "The type definition is absent");
25097 vctxt->inode->typeDef = actualType;
25103xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
25105 xmlSchemaAttrInfoPtr iattr;
25115 if (vctxt->nbAttrInfos == 0)
25117 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25118 iattr = vctxt->attrInfos[
i];
25119 if (! iattr->metaType) {
25120 ACTIVATE_ATTRIBUTE(iattr)
25121 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25134xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
25137 xmlSchemaAttrInfoPtr
attr;
25139 if (vctxt->nbAttrInfos == 0)
25141 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25142 attr = vctxt->attrInfos[
i];
25143 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
25149 if (
attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
25154 xmlSchemaFreeValue(
attr->val);
25159 vctxt->nbAttrInfos = 0;
25173xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
25175 xmlSchemaTypePtr
type = vctxt->inode->typeDef;
25176 xmlSchemaItemListPtr attrUseList;
25177 xmlSchemaAttributeUsePtr attrUse =
NULL;
25178 xmlSchemaAttributePtr attrDecl =
NULL;
25179 xmlSchemaAttrInfoPtr iattr, tmpiattr;
25180 int i,
j, found, nbAttrs, nbUses;
25181 int xpathRes = 0,
res, wildIDs = 0,
fixed;
25182 xmlNodePtr defAttrOwnerElem =
NULL;
25203 attrUseList = (xmlSchemaItemListPtr)
type->attrUses;
25207 nbAttrs = vctxt->nbAttrInfos;
25208 if (attrUseList !=
NULL)
25209 nbUses = attrUseList->nbItems;
25212 for (
i = 0;
i < nbUses;
i++) {
25214 attrUse = attrUseList->items[
i];
25215 attrDecl = WXS_ATTRUSE_DECL(attrUse);
25216 for (
j = 0;
j < nbAttrs;
j++) {
25217 iattr = vctxt->attrInfos[
j];
25222 if (iattr->metaType)
25224 if (iattr->localName[0] != attrDecl->name[0])
25226 if (!
xmlStrEqual(iattr->localName, attrDecl->name))
25228 if (!
xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
25247 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25248 iattr->use = attrUse;
25252 iattr->decl = attrDecl;
25253 iattr->typeDef = attrDecl->subtypes;
25260 if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
25270 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25271 if (tmpiattr ==
NULL) {
25273 "xmlSchemaVAttributesComplex",
25274 "calling xmlSchemaGetFreshAttrInfo()");
25277 tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
25278 tmpiattr->use = attrUse;
25279 tmpiattr->decl = attrDecl;
25280 }
else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
25281 ((attrUse->defValue !=
NULL) ||
25282 (attrDecl->defValue !=
NULL))) {
25286 tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25287 if (tmpiattr ==
NULL) {
25289 "xmlSchemaVAttributesComplex",
25290 "calling xmlSchemaGetFreshAttrInfo()");
25293 tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
25294 tmpiattr->use = attrUse;
25295 tmpiattr->decl = attrDecl;
25296 tmpiattr->typeDef = attrDecl->subtypes;
25297 tmpiattr->localName = attrDecl->name;
25298 tmpiattr->nsName = attrDecl->targetNamespace;
25302 if (vctxt->nbAttrInfos == 0)
25307 if (
type->attributeWildcard !=
NULL) {
25312 for (
i = 0;
i < nbAttrs;
i++) {
25313 iattr = vctxt->attrInfos[
i];
25318 if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
25330 if (xmlSchemaCheckCVCWildcardNamespace(
type->attributeWildcard,
25331 iattr->nsName) == 0) {
25341 if (
type->attributeWildcard->processContents ==
25342 XML_SCHEMAS_ANY_SKIP) {
25350 iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
25356 iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
25357 iattr->localName, iattr->nsName);
25358 if (iattr->decl !=
NULL) {
25359 iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25373 iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
25374 if (xmlSchemaIsDerivedFromBuiltInType(
25375 iattr->typeDef, XML_SCHEMAS_ID)) {
25380 if (wildIDs != 0) {
25382 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
25394 if (attrUseList !=
NULL) {
25395 for (
j = 0;
j < attrUseList->nbItems;
j++) {
25396 if (xmlSchemaIsDerivedFromBuiltInType(
25397 WXS_ATTRUSE_TYPEDEF(attrUseList->items[
j]),
25400 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
25407 }
else if (
type->attributeWildcard->processContents ==
25408 XML_SCHEMAS_ANY_LAX) {
25409 iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
25416 iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
25422 if (vctxt->nbAttrInfos == 0)
25429 if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
25430 xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
25431 if (ielem && ielem->node && ielem->node->doc)
25432 defAttrOwnerElem = ielem->node;
25437 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25438 iattr = vctxt->attrInfos[
i];
25444 if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
25445 (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
25450 if (iattr->typeDef ==
NULL) {
25451 iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
25455 ACTIVATE_ATTRIBUTE(iattr);
25459 if (vctxt->xpathStates !=
NULL) {
25463 xpathRes = xmlSchemaXPathEvaluate(vctxt,
25464 XML_ATTRIBUTE_NODE);
25465 if (xpathRes == -1) {
25466 VERROR_INT(
"xmlSchemaVAttributesComplex",
25467 "calling xmlSchemaXPathEvaluate()");
25468 goto internal_error;
25472 if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
25478 if ((xpathRes) || (defAttrOwnerElem)) {
25479 if (iattr->use->defValue !=
NULL) {
25480 iattr->value = (
xmlChar *) iattr->use->defValue;
25481 iattr->val = iattr->use->defVal;
25483 iattr->value = (
xmlChar *) iattr->decl->defValue;
25484 iattr->val = iattr->decl->defVal;
25490 if (iattr->val ==
NULL) {
25491 VERROR_INT(
"xmlSchemaVAttributesComplex",
25492 "default/fixed value on an attribute use was "
25493 "not precomputed");
25494 goto internal_error;
25496 iattr->val = xmlSchemaCopyValue(iattr->val);
25497 if (iattr->val ==
NULL) {
25498 VERROR_INT(
"xmlSchemaVAttributesComplex",
25499 "calling xmlSchemaCopyValue()");
25500 goto internal_error;
25509 if (defAttrOwnerElem) {
25513 value = iattr->value;
25517 normValue = xmlSchemaNormalizeValue(iattr->typeDef,
25519 if (normValue !=
NULL)
25522 if (iattr->nsName ==
NULL) {
25523 if (xmlNewProp(defAttrOwnerElem,
25525 VERROR_INT(
"xmlSchemaVAttributesComplex",
25526 "calling xmlNewProp()");
25527 if (normValue !=
NULL)
25529 goto internal_error;
25534 ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
25535 defAttrOwnerElem, iattr->nsName);
25546 ns = xmlSearchNs(defAttrOwnerElem->doc,
25550 "xmlSchemaVAttributesComplex",
25551 "could not compute a ns prefix for a "
25552 "default/fixed attribute");
25553 if (normValue !=
NULL)
25555 goto internal_error;
25558 ns = xmlNewNs(vctxt->validationRoot,
25567 xmlNewNsProp(defAttrOwnerElem,
ns, iattr->localName,
value);
25569 if (normValue !=
NULL)
25580 if (vctxt->value !=
NULL) {
25584 xmlSchemaFreeValue(vctxt->value);
25585 vctxt->value =
NULL;
25591 if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
25592 ((iattr->use !=
NULL) &&
25593 (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
25606 if (xpathRes ||
fixed) {
25607 iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
25611 res = xmlSchemaVCheckCVCSimpleType(
25613 iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
25616 res = xmlSchemaVCheckCVCSimpleType(
25618 iattr->node, iattr->typeDef, iattr->value,
NULL,
25624 VERROR_INT(
"xmlSchemaVAttributesComplex",
25625 "calling xmlSchemaStreamValidateSimpleTypeValue()");
25626 goto internal_error;
25628 iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
25653 if (iattr->val ==
NULL) {
25658 if ((iattr->use !=
NULL) &&
25659 (iattr->use->defValue !=
NULL)) {
25660 if (iattr->use->defVal ==
NULL) {
25665 iattr->vcValue = iattr->use->defValue;
25672 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
25673 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25675 if (iattr->decl->defVal ==
NULL) {
25680 iattr->vcValue = iattr->decl->defValue;
25687 if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
25688 iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25699 if (xmlSchemaXPathProcessHistory(vctxt,
25700 vctxt->depth +1) == -1) {
25701 VERROR_INT(
"xmlSchemaVAttributesComplex",
25702 "calling xmlSchemaXPathEvaluate()");
25703 goto internal_error;
25705 }
else if (vctxt->xpathStates !=
NULL)
25706 xmlSchemaXPathPop(vctxt);
25712 for (
i = 0;
i < vctxt->nbAttrInfos;
i++) {
25713 iattr = vctxt->attrInfos[
i];
25714 if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
25715 (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
25716 (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
25717 (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
25719 ACTIVATE_ATTRIBUTE(iattr);
25720 switch (iattr->state) {
25721 case XML_SCHEMAS_ATTR_ERR_MISSING: {
25724 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25726 "The attribute '%s' is required but missing",
25727 xmlSchemaFormatQName(&
str,
25728 iattr->decl->targetNamespace,
25729 iattr->decl->name),
25734 case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
25736 "The type definition is absent");
25738 case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
25739 xmlSchemaCustomErr(ACTXT_CAST vctxt,
25741 "The value '%s' does not match the fixed "
25742 "value constraint '%s'",
25743 iattr->
value, iattr->vcValue);
25745 case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
25747 "No matching global attribute declaration available, but "
25748 "demanded by the strict wildcard");
25750 case XML_SCHEMAS_ATTR_UNKNOWN:
25751 if (iattr->metaType)
25757 if (
type->attributeWildcard ==
NULL) {
25758 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25761 xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25778xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
25781 xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
25787 (wild->type != XML_SCHEMA_TYPE_ANY)) {
25788 VERROR_INT(
"xmlSchemaValidateElemWildcard",
25793 if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
25802 xmlSchemaElementPtr decl =
NULL;
25804 decl = xmlSchemaGetElem(vctxt->schema,
25805 vctxt->inode->localName, vctxt->inode->nsName);
25806 if (decl !=
NULL) {
25807 vctxt->inode->decl = decl;
25811 if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
25814 "No matching global element declaration available, but "
25815 "demanded by the strict wildcard");
25816 return (vctxt->err);
25818 if (vctxt->nbAttrInfos != 0) {
25819 xmlSchemaAttrInfoPtr iattr;
25826 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25827 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25828 if (iattr !=
NULL) {
25829 if (xmlSchemaProcessXSIType(vctxt, iattr,
25830 &(vctxt->inode->typeDef),
NULL) == -1) {
25831 VERROR_INT(
"xmlSchemaValidateElemWildcard",
25832 "calling xmlSchemaProcessXSIType() to "
25833 "process the attribute 'xsi:nil'");
25847 vctxt->inode->typeDef =
25848 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
25860xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
25862 xmlSchemaValPtr *
val)
25865 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
25873 if WXS_IS_COMPLEX(
inode->typeDef) {
25883 if ((! WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) &&
25884 ((! WXS_HAS_MIXED_CONTENT(
inode->typeDef)) ||
25885 (! WXS_EMPTIABLE(
inode->typeDef)))) {
25889 "For a string to be a valid default, the type definition "
25890 "must be a simple type or a complex type with simple content "
25891 "or mixed content and a particle emptiable");
25906 if (WXS_IS_SIMPLE(
inode->typeDef)) {
25908 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25911 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
25913 ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25917 VERROR_INT(
"xmlSchemaCheckCOSValidDefault",
25918 "calling xmlSchemaVCheckCVCSimpleType()");
25926 void *transdata,
void *inputdata)
25928 xmlSchemaElementPtr
item = (xmlSchemaElementPtr) transdata;
25929 xmlSchemaNodeInfoPtr
inode = (xmlSchemaNodeInfoPtr) inputdata;
25934xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
25936 vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
25937 if (vctxt->inode ==
NULL) {
25938 VERROR_INT(
"xmlSchemaValidatorPushElem",
25939 "calling xmlSchemaGetFreshElemInfo()");
25942 vctxt->nbAttrInfos = 0;
25947xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
25948 xmlSchemaNodeInfoPtr
inode,
25949 xmlSchemaTypePtr
type,
25952 if (
inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
25953 return (xmlSchemaVCheckCVCSimpleType(
25954 ACTXT_CAST vctxt,
NULL,
25957 return (xmlSchemaVCheckCVCSimpleType(
25958 ACTXT_CAST vctxt,
NULL,
25968xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
25971 xmlSchemaNodeInfoPtr
inode = vctxt->inode;
25973 if (vctxt->nbAttrInfos != 0)
25974 xmlSchemaClearAttrInfos(vctxt);
25975 if (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
25981 vctxt->skipDepth = vctxt->depth -1;
25985 (
inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
25996 if ((
inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
25997 (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
26002 if (
inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
26003 goto character_content;
26005 if ((
inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
26007 int terminal, nbval = 10, nbneg;
26014 xmlRegNewExecCtxt(
inode->typeDef->contModel,
26015 xmlSchemaVContentModelCallback, vctxt);
26017 VERROR_INT(
"xmlSchemaValidatorPopElem",
26018 "failed to create a regex context");
26019 goto internal_error;
26026 if (INODE_NILLED(
inode)) {
26035 xmlRegExecNextValues(
inode->regexCtxt,
26036 &nbval, &nbneg, &
values[0], &terminal);
26038 if ((
ret<0) || ((
ret==0) && (!INODE_NILLED(
inode)))) {
26044 XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26045 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26047 "Missing child element(s)",
26061 if (
inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
26066 if (vctxt->value !=
NULL) {
26067 xmlSchemaFreeValue(vctxt->value);
26068 vctxt->value =
NULL;
26077 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26078 ret = xmlSchemaVCheckINodeDataType(vctxt,
26080 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26081 ret = xmlSchemaVCheckINodeDataType(vctxt,
26086 VERROR_INT(
"xmlSchemaValidatorPopElem",
26087 "calling xmlSchemaVCheckCVCSimpleType()");
26088 goto internal_error;
26103 (
inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
26104 (! INODE_NILLED(
inode))) {
26118 if (
inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
26120 ret = xmlSchemaCheckCOSValidDefault(vctxt,
26124 VERROR_INT(
"xmlSchemaValidatorPopElem",
26125 "calling xmlSchemaCheckCOSValidDefault()");
26126 goto internal_error;
26144 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26145 ret = xmlSchemaVCheckINodeDataType(vctxt,
26147 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26148 ret = xmlSchemaVCheckINodeDataType(vctxt,
26150 inode->decl->value);
26154 VERROR_INT(
"xmlSchemaValidatorPopElem",
26155 "calling xmlSchemaVCheckCVCSimpleType()");
26156 goto internal_error;
26165 if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
26167 xmlNodePtr textChild;
26172 normValue = xmlSchemaNormalizeValue(
inode->typeDef,
26173 inode->decl->value);
26174 if (normValue !=
NULL) {
26175 textChild = xmlNewDocText(
inode->node->doc,
26179 textChild = xmlNewDocText(
inode->node->doc,
26180 inode->decl->value);
26181 if (textChild ==
NULL) {
26182 VERROR_INT(
"xmlSchemaValidatorPopElem",
26183 "calling xmlNewDocText()");
26184 goto internal_error;
26186 xmlAddChild(
inode->node, textChild);
26189 }
else if (! INODE_NILLED(
inode)) {
26195 if (WXS_IS_SIMPLE(
inode->typeDef)) {
26204 ret = xmlSchemaVCheckINodeDataType(vctxt,
26206 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26219 ret = xmlSchemaVCheckINodeDataType(vctxt,
26224 VERROR_INT(
"xmlSchemaValidatorPopElem",
26225 "calling xmlSchemaVCheckCVCSimpleType()");
26226 goto internal_error;
26235 (
inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
26246 XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
26249 "The content must not contain element nodes since "
26250 "there is a fixed value constraint");
26257 if (WXS_HAS_MIXED_CONTENT(
inode->typeDef)) {
26275 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26277 "The initial value '%s' does not match the fixed "
26278 "value constraint '%s'",
26282 }
else if (WXS_HAS_SIMPLE_CONTENT(
inode->typeDef)) {
26296 inode->decl->value)) {
26298 xmlSchemaCustomErr(ACTXT_CAST vctxt,
26300 "The actual value '%s' does not match the fixed "
26301 "value constraint '%s'",
26303 inode->decl->value);
26312 if (vctxt->depth < 0) {
26316 if (vctxt->depth == vctxt->skipDepth)
26317 vctxt->skipDepth = -1;
26321 if (
inode->appliedXPath &&
26322 (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
26323 goto internal_error;
26341 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26343 if (xmlSchemaIDCFillNodeTables(vctxt,
inode) == -1)
26344 goto internal_error;
26349 if (vctxt->inode->hasKeyrefs)
26350 if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
26351 goto internal_error;
26356 if ((vctxt->depth > 0) &&
26357 (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26362 if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
26363 goto internal_error;
26371 xmlSchemaClearElemInfo(vctxt,
inode);
26375 if (vctxt->depth == 0) {
26377 vctxt->inode =
NULL;
26383 if (vctxt->aidcs !=
NULL) {
26384 xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
26386 if (aidc->keyrefDepth == vctxt->depth) {
26392 aidc->keyrefDepth = -1;
26395 }
while (aidc !=
NULL);
26398 vctxt->inode = vctxt->elemInfos[vctxt->depth];
26415xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
26417 xmlSchemaNodeInfoPtr pielem;
26418 xmlSchemaTypePtr ptype;
26421 if (vctxt->depth <= 0) {
26422 VERROR_INT(
"xmlSchemaValidateChildElem",
26423 "not intended for the validation root");
26426 pielem = vctxt->elemInfos[vctxt->depth -1];
26427 if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
26428 pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
26432 if (INODE_NILLED(pielem)) {
26436 ACTIVATE_PARENT_ELEM;
26439 "Neither character nor element content is allowed, "
26440 "because the element was 'nilled'");
26442 goto unexpected_elem;
26445 ptype = pielem->typeDef;
26447 if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
26453 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26454 vctxt->inode->localName,
26455 vctxt->inode->nsName);
26457 if (vctxt->inode->decl ==
NULL) {
26458 xmlSchemaAttrInfoPtr iattr;
26463 iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26464 XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26465 if (iattr !=
NULL) {
26466 ret = xmlSchemaProcessXSIType(vctxt, iattr,
26467 &(vctxt->inode->typeDef),
NULL);
26470 VERROR_INT(
"xmlSchemaValidateChildElem",
26471 "calling xmlSchemaProcessXSIType() to "
26472 "process the attribute 'xsi:nil'");
26488 vctxt->inode->typeDef =
26489 xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26495 switch (ptype->contentType) {
26496 case XML_SCHEMA_CONTENT_EMPTY:
26502 ACTIVATE_PARENT_ELEM
26505 "Element content is not allowed, "
26506 "because the content type is empty");
26508 goto unexpected_elem;
26511 case XML_SCHEMA_CONTENT_MIXED:
26512 case XML_SCHEMA_CONTENT_ELEMENTS: {
26513 xmlRegExecCtxtPtr regexCtxt;
26515 int terminal, nbval = 10, nbneg;
26519 if (ptype->contModel ==
NULL) {
26520 VERROR_INT(
"xmlSchemaValidateChildElem",
26521 "type has elem content but no content model");
26528 if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
26529 VERROR_INT(
"xmlSchemaValidateChildElem",
26530 "validating elem, but elem content is already invalid");
26534 regexCtxt = pielem->regexCtxt;
26535 if (regexCtxt ==
NULL) {
26539 regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
26540 xmlSchemaVContentModelCallback, vctxt);
26541 if (regexCtxt ==
NULL) {
26542 VERROR_INT(
"xmlSchemaValidateChildElem",
26543 "failed to create a regex context");
26546 pielem->regexCtxt = regexCtxt;
26557 ret = xmlRegExecPushString2(regexCtxt,
26558 vctxt->inode->localName,
26559 vctxt->inode->nsName,
26562 VERROR_INT(
"xmlSchemaValidateChildElem",
26563 "calling xmlRegExecPushString2()");
26567 xmlRegExecErrInfo(regexCtxt,
NULL, &nbval, &nbneg,
26569 xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26571 "This element is not expected",
26574 goto unexpected_elem;
26579 case XML_SCHEMA_CONTENT_SIMPLE:
26580 case XML_SCHEMA_CONTENT_BASIC:
26581 ACTIVATE_PARENT_ELEM
26582 if (WXS_IS_COMPLEX(ptype)) {
26590 VERROR(
ret,
NULL,
"Element content is not allowed, "
26591 "because the content type is a simple type definition");
26598 VERROR(
ret,
NULL,
"Element content is not allowed, "
26599 "because the type definition is simple");
26603 goto unexpected_elem;
26615 vctxt->skipDepth = vctxt->depth;
26616 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
26617 pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26621#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
26622#define XML_SCHEMA_PUSH_TEXT_CREATED 2
26623#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
26626xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
26641 if (INODE_NILLED(vctxt->inode)) {
26648 "Neither character nor element content is allowed "
26649 "because the element is 'nilled'");
26650 return (vctxt->err);
26657 if (vctxt->inode->typeDef->contentType ==
26658 XML_SCHEMA_CONTENT_EMPTY) {
26660 "Character content is not allowed, "
26661 "because the content type is empty");
26662 return (vctxt->err);
26665 if (vctxt->inode->typeDef->contentType ==
26666 XML_SCHEMA_CONTENT_ELEMENTS) {
26667 if ((nodeType != XML_TEXT_NODE) ||
26678 "Character content other than whitespace is not allowed "
26679 "because the content type is 'element-only'");
26680 return (vctxt->err);
26692 if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
26693 ((vctxt->inode->decl ==
NULL) ||
26694 (vctxt->inode->decl->value ==
NULL)))
26697 if (vctxt->inode->value ==
NULL) {
26702 case XML_SCHEMA_PUSH_TEXT_PERSIST:
26706 vctxt->inode->value =
value;
26708 case XML_SCHEMA_PUSH_TEXT_CREATED:
26713 vctxt->inode->value =
value;
26716 vctxt->inode->flags |=
26717 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26719 case XML_SCHEMA_PUSH_TEXT_VOLATILE:
26728 vctxt->inode->flags |=
26729 XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26740 if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
26744 vctxt->inode->value =
26746 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26754xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
26758 if ((vctxt->skipDepth != -1) &&
26759 (vctxt->depth >= vctxt->skipDepth)) {
26760 VERROR_INT(
"xmlSchemaValidateElem",
26762 goto internal_error;
26764 if (vctxt->xsiAssemble) {
26775 ret = xmlSchemaAssembleByXSI(vctxt);
26778 goto internal_error;
26779 vctxt->skipDepth = 0;
26786 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
26789 if (vctxt->depth > 0) {
26794 ret = xmlSchemaValidateChildElem(vctxt);
26797 VERROR_INT(
"xmlSchemaValidateElem",
26798 "calling xmlSchemaStreamValidateChildElement()");
26799 goto internal_error;
26803 if (vctxt->depth == vctxt->skipDepth)
26805 if ((vctxt->inode->decl ==
NULL) &&
26806 (vctxt->inode->typeDef ==
NULL)) {
26807 VERROR_INT(
"xmlSchemaValidateElem",
26808 "the child element was valid but neither the "
26809 "declaration nor the type was set");
26810 goto internal_error;
26816 vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26817 vctxt->inode->localName,
26818 vctxt->inode->nsName);
26819 if (vctxt->inode->decl ==
NULL) {
26822 "No matching global declaration available "
26823 "for the validation root");
26828 if (vctxt->inode->decl ==
NULL)
26829 goto type_validation;
26831 if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
26836 ret = xmlSchemaValidateElemWildcard(vctxt, &
skip);
26839 VERROR_INT(
"xmlSchemaValidateElem",
26840 "calling xmlSchemaValidateElemWildcard()");
26841 goto internal_error;
26846 vctxt->skipDepth = vctxt->depth;
26853 if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
26857 vctxt->inode->decl =
NULL;
26858 goto type_validation;
26864 ret = xmlSchemaValidateElemDecl(vctxt);
26867 VERROR_INT(
"xmlSchemaValidateElem",
26868 "calling xmlSchemaValidateElemDecl()");
26869 goto internal_error;
26878 if (vctxt->inode->typeDef ==
NULL) {
26879 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26882 "The type definition is absent");
26885 if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
26886 vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26889 "The type definition is abstract");
26897 if (vctxt->xpathStates !=
NULL) {
26898 ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
26899 vctxt->inode->appliedXPath = 1;
26901 VERROR_INT(
"xmlSchemaValidateElem",
26902 "calling xmlSchemaXPathEvaluate()");
26903 goto internal_error;
26909 if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
26910 if ((vctxt->nbAttrInfos != 0) ||
26911 (vctxt->inode->typeDef->attrUses !=
NULL)) {
26913 ret = xmlSchemaVAttributesComplex(vctxt);
26915 }
else if (vctxt->nbAttrInfos != 0) {
26917 ret = xmlSchemaVAttributesSimple(vctxt);
26922 if (vctxt->nbAttrInfos != 0)
26923 xmlSchemaClearAttrInfos(vctxt);
26925 VERROR_INT(
"xmlSchemaValidateElem",
26926 "calling attributes validation");
26927 goto internal_error;
26936 vctxt->skipDepth = vctxt->depth;
26942#ifdef XML_SCHEMA_READER_ENABLED
26944xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
26946 const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
26948 xmlSchemaNodeInfoPtr ielem;
26951 ret = xmlTextReaderRead(vctxt->reader);
26956 nodeType = xmlTextReaderNodeType(vctxt->reader);
26957 if (nodeType == XML_ELEMENT_NODE)
26959 ret = xmlTextReaderRead(vctxt->reader);
26966 depth = xmlTextReaderDepth(vctxt->reader);
26967 nodeType = xmlTextReaderNodeType(vctxt->reader);
26969 if (nodeType == XML_ELEMENT_NODE) {
26972 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
26973 VERROR_INT(
"xmlSchemaVReaderWalk",
26974 "calling xmlSchemaValidatorPushElem()");
26975 goto internal_error;
26977 ielem = vctxt->inode;
26978 ielem->localName = xmlTextReaderLocalName(vctxt->reader);
26979 ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
26980 ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
26984 ret = xmlTextReaderIsEmptyElement(vctxt->reader);
26986 VERROR_INT(
"xmlSchemaVReaderWalk",
26987 "calling xmlTextReaderIsEmptyElement()");
26988 goto internal_error;
26991 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
26996 vctxt->nbAttrInfos = 0;
26997 ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
26999 VERROR_INT(
"xmlSchemaVReaderWalk",
27000 "calling xmlTextReaderMoveToFirstAttribute()");
27001 goto internal_error;
27009 if (xmlSchemaValidatorPushAttribute(vctxt,
NULL,
27010 (
const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
27011 xmlTextReaderNamespaceUri(vctxt->reader), 1,
27012 xmlTextReaderValue(vctxt->reader), 1) == -1) {
27014 VERROR_INT(
"xmlSchemaVReaderWalk",
27015 "calling xmlSchemaValidatorPushAttribute()");
27016 goto internal_error;
27018 ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
27020 VERROR_INT(
"xmlSchemaVReaderWalk",
27021 "calling xmlTextReaderMoveToFirstAttribute()");
27022 goto internal_error;
27024 }
while (
ret == 1);
27028 ret = xmlTextReaderMoveToElement(vctxt->reader);
27030 VERROR_INT(
"xmlSchemaVReaderWalk",
27031 "calling xmlTextReaderMoveToElement()");
27032 goto internal_error;
27038 ret= xmlSchemaValidateElem(vctxt);
27041 VERROR_INT(
"xmlSchemaVReaderWalk",
27042 "calling xmlSchemaValidateElem()");
27043 goto internal_error;
27047 if (vctxt->depth == vctxt->skipDepth) {
27052 if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
27053 ret = xmlTextReaderRead(vctxt->reader);
27054 curDepth = xmlTextReaderDepth(vctxt->reader);
27055 while ((
ret == 1) && (curDepth !=
depth)) {
27056 ret = xmlTextReaderRead(vctxt->reader);
27057 curDepth = xmlTextReaderDepth(vctxt->reader);
27073 if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27075 }
else if (nodeType == END_ELEM) {
27080 ret = xmlSchemaValidatorPopElem(vctxt);
27083 VERROR_INT(
"xmlSchemaVReaderWalk",
27084 "calling xmlSchemaValidatorPopElem()");
27085 goto internal_error;
27089 if (vctxt->depth >= 0)
27090 ielem = vctxt->inode;
27093 }
else if ((nodeType == XML_TEXT_NODE) ||
27094 (nodeType == XML_CDATA_SECTION_NODE) ||
27095 (nodeType == WHTSP) ||
27096 (nodeType == SIGN_WHTSP)) {
27102 if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
27103 nodeType = XML_TEXT_NODE;
27105 value = xmlTextReaderValue(vctxt->reader);
27107 -1, XML_SCHEMA_PUSH_TEXT_CREATED, &
consumed);
27111 VERROR_INT(
"xmlSchemaVReaderWalk",
27112 "calling xmlSchemaVPushText()");
27113 goto internal_error;
27115 }
else if ((nodeType == XML_ENTITY_NODE) ||
27116 (nodeType == XML_ENTITY_REF_NODE)) {
27125 ret = xmlTextReaderRead(vctxt->reader);
27126 }
while (
ret == 1);
27145xmlSchemaSAXHandleText(
void *
ctx,
27149 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27151 if (vctxt->depth < 0)
27153 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27155 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27156 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27157 if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE,
ch,
len,
27158 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27159 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27160 "calling xmlSchemaVPushText()");
27170xmlSchemaSAXHandleCDataSection(
void *
ctx,
27174 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27176 if (vctxt->depth < 0)
27178 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27180 if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27181 vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27182 if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE,
ch,
len,
27183 XML_SCHEMA_PUSH_TEXT_VOLATILE,
NULL) == -1) {
27184 VERROR_INT(
"xmlSchemaSAXHandleCDataSection",
27185 "calling xmlSchemaVPushText()");
27195 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27197 if (vctxt->depth < 0)
27199 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27206xmlSchemaSAXHandleStartElementNs(
void *
ctx,
27216 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27218 xmlSchemaNodeInfoPtr ielem;
27228 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27233 if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27234 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27235 "calling xmlSchemaValidatorPushElem()");
27236 goto internal_error;
27238 ielem = vctxt->inode;
27243 ielem->localName = localname;
27244 ielem->nsName = URI;
27245 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27249 if (nb_namespaces != 0) {
27254 for (
i = 0,
j = 0;
i < nb_namespaces;
i++,
j += 2) {
27258 if (ielem->nsBindings ==
NULL) {
27259 ielem->nsBindings =
27262 if (ielem->nsBindings ==
NULL) {
27263 xmlSchemaVErrMemory(vctxt,
27264 "allocating namespace bindings for SAX validation",
27266 goto internal_error;
27268 ielem->nbNsBindings = 0;
27269 ielem->sizeNsBindings = 5;
27270 }
else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
27271 ielem->sizeNsBindings *= 2;
27272 ielem->nsBindings =
27274 (
void *) ielem->nsBindings,
27275 ielem->sizeNsBindings * 2 *
sizeof(
const xmlChar *));
27276 if (ielem->nsBindings ==
NULL) {
27277 xmlSchemaVErrMemory(vctxt,
27278 "re-allocating namespace bindings for SAX validation",
27280 goto internal_error;
27284 ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[
j];
27285 if (namespaces[
j+1][0] == 0) {
27289 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
NULL;
27291 ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
27293 ielem->nbNsBindings++;
27301 if (nb_attributes != 0) {
27302 int valueLen,
k,
l;
27305 for (
j = 0,
i = 0;
i < nb_attributes;
i++,
j += 5) {
27314 valueLen = attributes[
j+4] - attributes[
j+3];
27317 xmlSchemaVErrMemory(vctxt,
27318 "allocating string for decoded attribute",
27320 goto internal_error;
27322 for (
k = 0,
l = 0;
k < valueLen;
l++) {
27323 if (
k < valueLen - 4 &&
27324 attributes[
j+3][
k+0] ==
'&' &&
27325 attributes[
j+3][
k+1] ==
'#' &&
27326 attributes[
j+3][
k+2] ==
'3' &&
27327 attributes[
j+3][
k+3] ==
'8' &&
27328 attributes[
j+3][
k+4] ==
';') {
27340 ret = xmlSchemaValidatorPushAttribute(vctxt,
27341 NULL, ielem->nodeLine, attributes[
j], attributes[
j+2], 0,
27344 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27345 "calling xmlSchemaValidatorPushAttribute()");
27346 goto internal_error;
27353 ret = xmlSchemaValidateElem(vctxt);
27356 VERROR_INT(
"xmlSchemaSAXHandleStartElementNs",
27357 "calling xmlSchemaValidateElem()");
27358 goto internal_error;
27372xmlSchemaSAXHandleEndElementNs(
void *
ctx,
27377 xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr)
ctx;
27383 if (vctxt->skipDepth != -1) {
27384 if (vctxt->depth > vctxt->skipDepth) {
27388 vctxt->skipDepth = -1;
27393 if ((!
xmlStrEqual(vctxt->inode->localName, localname)) ||
27395 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27396 "elem pop mismatch");
27398 res = xmlSchemaValidatorPopElem(vctxt);
27401 VERROR_INT(
"xmlSchemaSAXHandleEndElementNs",
27402 "calling xmlSchemaValidatorPopElem()");
27403 goto internal_error;
27429xmlSchemaValidCtxtPtr
27430xmlSchemaNewValidCtxt(xmlSchemaPtr
schema)
27432 xmlSchemaValidCtxtPtr
ret;
27434 ret = (xmlSchemaValidCtxtPtr)
xmlMalloc(
sizeof(xmlSchemaValidCtxt));
27436 xmlSchemaVErrMemory(
NULL,
"allocating validation context",
NULL);
27439 memset(
ret, 0,
sizeof(xmlSchemaValidCtxt));
27440 ret->type = XML_SCHEMA_CTXT_VALIDATOR;
27442 ret->nodeQNames = xmlSchemaItemListCreate();
27456xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt,
const char *
filename) {
27459 if (vctxt->filename !=
NULL)
27464 vctxt->filename =
NULL;
27475xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
27486 vctxt->validationRoot =
NULL;
27488#ifdef LIBXML_READER_ENABLED
27489 vctxt->reader =
NULL;
27491 vctxt->hasKeyrefs = 0;
27493 if (vctxt->value !=
NULL) {
27494 xmlSchemaFreeValue(vctxt->value);
27495 vctxt->value =
NULL;
27500 if (vctxt->aidcs !=
NULL) {
27501 xmlSchemaIDCAugPtr
cur = vctxt->aidcs,
next;
27507 vctxt->aidcs =
NULL;
27510 if (vctxt->idcNodes !=
NULL) {
27512 xmlSchemaPSVIIDCNodePtr
item;
27514 for (
i = 0;
i < vctxt->nbIdcNodes;
i++) {
27515 item = vctxt->idcNodes[
i];
27520 vctxt->idcNodes =
NULL;
27521 vctxt->nbIdcNodes = 0;
27522 vctxt->sizeIdcNodes = 0;
27525 if (vctxt->idcKeys !=
NULL) {
27527 for (
i = 0;
i < vctxt->nbIdcKeys;
i++)
27528 xmlSchemaIDCFreeKey(vctxt->idcKeys[
i]);
27530 vctxt->idcKeys =
NULL;
27531 vctxt->nbIdcKeys = 0;
27532 vctxt->sizeIdcKeys = 0;
27538 if (vctxt->xpathStates !=
NULL) {
27539 xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
27540 vctxt->xpathStates =
NULL;
27545 if (vctxt->nbAttrInfos != 0) {
27546 xmlSchemaClearAttrInfos(vctxt);
27551 if (vctxt->elemInfos !=
NULL) {
27553 xmlSchemaNodeInfoPtr ei;
27555 for (
i = 0;
i < vctxt->sizeElemInfos;
i++) {
27556 ei = vctxt->elemInfos[
i];
27559 xmlSchemaClearElemInfo(vctxt, ei);
27562 xmlSchemaItemListClear(vctxt->nodeQNames);
27571 if (vctxt->filename !=
NULL) {
27573 vctxt->filename =
NULL;
27580 if (vctxt->idcMatcherCache !=
NULL) {
27581 xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
27585 matcher = matcher->nextCached;
27586 xmlSchemaIDCFreeMatcherList(tmp);
27588 vctxt->idcMatcherCache =
NULL;
27599xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
27603 if (ctxt->value !=
NULL)
27604 xmlSchemaFreeValue(ctxt->value);
27605 if (ctxt->pctxt !=
NULL)
27606 xmlSchemaFreeParserCtxt(ctxt->pctxt);
27607 if (ctxt->idcNodes !=
NULL) {
27609 xmlSchemaPSVIIDCNodePtr
item;
27611 for (
i = 0;
i < ctxt->nbIdcNodes;
i++) {
27612 item = ctxt->idcNodes[
i];
27618 if (ctxt->idcKeys !=
NULL) {
27620 for (
i = 0;
i < ctxt->nbIdcKeys;
i++)
27621 xmlSchemaIDCFreeKey(ctxt->idcKeys[
i]);
27625 if (ctxt->xpathStates !=
NULL) {
27626 xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
27627 ctxt->xpathStates =
NULL;
27629 if (ctxt->xpathStatePool !=
NULL) {
27630 xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
27631 ctxt->xpathStatePool =
NULL;
27637 if (ctxt->aidcs !=
NULL) {
27638 xmlSchemaIDCAugPtr
cur = ctxt->aidcs,
next;
27645 if (ctxt->attrInfos !=
NULL) {
27647 xmlSchemaAttrInfoPtr
attr;
27650 if (ctxt->nbAttrInfos != 0)
27651 xmlSchemaClearAttrInfos(ctxt);
27652 for (
i = 0;
i < ctxt->sizeAttrInfos;
i++) {
27653 attr = ctxt->attrInfos[
i];
27658 if (ctxt->elemInfos !=
NULL) {
27660 xmlSchemaNodeInfoPtr ei;
27662 for (
i = 0;
i < ctxt->sizeElemInfos;
i++) {
27663 ei = ctxt->elemInfos[
i];
27666 xmlSchemaClearElemInfo(ctxt, ei);
27671 if (ctxt->nodeQNames !=
NULL)
27672 xmlSchemaItemListFree(ctxt->nodeQNames);
27673 if (ctxt->dict !=
NULL)
27675 if (ctxt->filename !=
NULL)
27690xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
27694 return(ctxt->err == 0);
27707xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27708 xmlSchemaValidityErrorFunc
err,
27709 xmlSchemaValidityWarningFunc
warn,
void *
ctx)
27714 ctxt->warning =
warn;
27715 ctxt->errCtxt =
ctx;
27716 if (ctxt->pctxt !=
NULL)
27717 xmlSchemaSetParserErrors(ctxt->pctxt,
err,
warn,
ctx);
27729xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
27734 ctxt->serror = serror;
27735 ctxt->error =
NULL;
27736 ctxt->warning =
NULL;
27737 ctxt->errCtxt =
ctx;
27738 if (ctxt->pctxt !=
NULL)
27739 xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror,
ctx);
27754xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27755 xmlSchemaValidityErrorFunc *
err,
27756 xmlSchemaValidityWarningFunc *
warn,
void **
ctx)
27761 *
err = ctxt->error;
27763 *
warn = ctxt->warning;
27765 *
ctx = ctxt->errCtxt;
27781xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
27795 for (
i = 1;
i < (
int)
sizeof(
int) * 8;
i++) {
27812xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
27818 return (ctxt->options);
27822xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
27826 xmlSchemaNodeInfoPtr ielem =
NULL;
27827 xmlNodePtr
node, valRoot;
27831 if (vctxt->validationRoot !=
NULL)
27832 valRoot = vctxt->validationRoot;
27834 valRoot = xmlDocGetRootElement(vctxt->doc);
27835 if (valRoot ==
NULL) {
27837 VERROR(1,
NULL,
"The document has no document element");
27841 vctxt->validationRoot = valRoot;
27844 if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27846 if (
node->type == XML_ELEMENT_NODE) {
27852 if (xmlSchemaValidatorPushElem(vctxt) == -1)
27853 goto internal_error;
27854 ielem = vctxt->inode;
27855 ielem->node =
node;
27856 ielem->nodeLine =
node->line;
27857 ielem->localName =
node->name;
27859 ielem->nsName =
node->ns->href;
27860 ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27866 vctxt->nbAttrInfos = 0;
27871 nsName =
attr->ns->href;
27874 ret = xmlSchemaValidatorPushAttribute(vctxt,
27882 xmlNodeListGetString(
attr->doc,
attr->children, 1), 1);
27884 VERROR_INT(
"xmlSchemaDocWalk",
27885 "calling xmlSchemaValidatorPushAttribute()");
27886 goto internal_error;
27894 ret = xmlSchemaValidateElem(vctxt);
27897 VERROR_INT(
"xmlSchemaDocWalk",
27898 "calling xmlSchemaValidateElem()");
27899 goto internal_error;
27907 if ((vctxt->skipDepth != -1) &&
27908 (vctxt->depth >= vctxt->skipDepth))
27910 }
else if ((
node->type == XML_TEXT_NODE) ||
27911 (
node->type == XML_CDATA_SECTION_NODE)) {
27915 if ((ielem !=
NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
27916 ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27917 ret = xmlSchemaVPushText(vctxt,
node->type,
node->content,
27918 -1, XML_SCHEMA_PUSH_TEXT_PERSIST,
NULL);
27920 VERROR_INT(
"xmlSchemaVDocWalk",
27921 "calling xmlSchemaVPushText()");
27922 goto internal_error;
27928 }
else if ((
node->type == XML_ENTITY_NODE) ||
27929 (
node->type == XML_ENTITY_REF_NODE)) {
27933 VERROR_INT(
"xmlSchemaVDocWalk",
27934 "there is at least one entity reference in the node-tree "
27935 "currently being validated. Processing of entities with "
27936 "this XML Schema processor is not supported (yet). Please "
27937 "substitute entities before validation.");
27938 goto internal_error;
27953 if (
node->type == XML_ELEMENT_NODE) {
27957 if (
node != vctxt->inode->node) {
27958 VERROR_INT(
"xmlSchemaVDocWalk",
27959 "element position mismatch");
27960 goto internal_error;
27962 ret = xmlSchemaValidatorPopElem(vctxt);
27965 VERROR_INT(
"xmlSchemaVDocWalk",
27966 "calling xmlSchemaValidatorPopElem()");
27967 goto internal_error;
27970 if (
node == valRoot)
27989xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
27994 vctxt->nberrors = 0;
27996 vctxt->skipDepth = -1;
27997 vctxt->hasKeyrefs = 0;
27998#ifdef ENABLE_IDC_NODE_TABLES_TEST
27999 vctxt->createIDCNodeTables = 1;
28001 vctxt->createIDCNodeTables = 0;
28006 if (vctxt->schema ==
NULL) {
28007 xmlSchemaParserCtxtPtr pctxt;
28009 vctxt->xsiAssemble = 1;
28016 if ((vctxt->pctxt ==
NULL) &&
28017 (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
28019 pctxt = vctxt->pctxt;
28020 pctxt->xsiAssemble = 1;
28024 vctxt->schema = xmlSchemaNewSchema(pctxt);
28025 if (vctxt->schema ==
NULL)
28030 pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
28031 if (pctxt->constructor ==
NULL)
28033 pctxt->constructor->mainSchema = vctxt->schema;
28037 pctxt->ownsConstructor = 1;
28043 xmlHashScan(vctxt->schema->schemasImports, xmlSchemaAugmentImportedIDC,
28050xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
28051 if (vctxt->xsiAssemble) {
28052 if (vctxt->schema !=
NULL) {
28053 xmlSchemaFree(vctxt->schema);
28054 vctxt->schema =
NULL;
28057 xmlSchemaClearValidCtxt(vctxt);
28061xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
28065 if (xmlSchemaPreRun(vctxt) < 0)
28068 if (vctxt->doc !=
NULL) {
28072 ret = xmlSchemaVDocWalk(vctxt);
28073#ifdef LIBXML_READER_ENABLED
28074 }
else if (vctxt->reader !=
NULL) {
28078#ifdef XML_SCHEMA_READER_ENABLED
28079 ret = xmlSchemaVReaderWalk(vctxt);
28082 }
else if ((vctxt->sax !=
NULL) && (vctxt->parserCtxt !=
NULL)) {
28088 VERROR_INT(
"xmlSchemaVStart",
28089 "no instance to validate");
28093 xmlSchemaPostRun(vctxt);
28110xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr
elem)
28115 if (ctxt->schema ==
NULL)
28118 ctxt->doc =
elem->doc;
28120 ctxt->validationRoot =
elem;
28121 return(xmlSchemaVStart(ctxt));
28135xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
28137 if ((ctxt ==
NULL) || (doc ==
NULL))
28141 ctxt->node = xmlDocGetRootElement(doc);
28142 if (ctxt->node ==
NULL) {
28143 xmlSchemaCustomErr(ACTXT_CAST ctxt,
28145 (xmlNodePtr) doc,
NULL,
28146 "The document has no document element",
NULL,
NULL);
28147 return (ctxt->err);
28149 ctxt->validationRoot = ctxt->node;
28150 return (xmlSchemaVStart(ctxt));
28159typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
28160typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
28162struct _xmlSchemaSplitSAXData {
28163 xmlSAXHandlerPtr user_sax;
28165 xmlSchemaValidCtxtPtr ctxt;
28166 xmlSAXHandlerPtr schemas_sax;
28169#define XML_SAX_PLUG_MAGIC 0xdc43ba21
28171struct _xmlSchemaSAXPlug {
28172 unsigned int magic;
28175 xmlSAXHandlerPtr *user_sax_ptr;
28176 xmlSAXHandlerPtr user_sax;
28177 void **user_data_ptr;
28181 xmlSAXHandler schemas_sax;
28182 xmlSchemaValidCtxtPtr ctxt;
28190 xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr)
ctx;
28191 if ((ctxt !=
NULL) && (ctxt->user_sax !=