new patch from Kasimier Buchcik for processContents of wildcards attribute
* xmlschemas.c: new patch from Kasimier Buchcik for processContents
of wildcards attribute handling
* test/schemas/anyAttr-* result/schemas/anyAttr-*: added specific
regression tests
Daniel
diff --git a/xmlschemas.c b/xmlschemas.c
index 17f612f..e810e9a 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -8344,6 +8344,7 @@
int ret;
xmlAttrPtr attr; /* An attribute on the element. */
xmlChar *value;
+ const xmlChar *nsURI;
xmlSchemaAttributeLinkPtr attrUse;
xmlSchemaAttributePtr attrDecl;
int found;
@@ -8430,7 +8431,7 @@
printf("found\n");
#endif
found = 1;
- ctxt->cur = (xmlNodePtr) attr;
+ ctxt->cur = (xmlNodePtr) attr;
if (attrDecl->subtypes == NULL) {
curState->state = XML_SCHEMAS_ATTR_TYPE_NOT_RESOLVED;
@@ -8505,6 +8506,14 @@
#ifdef DEBUG_ATTR_VALIDATION
xmlSchemaWildcardNsPtr ns;
printf("matching wildcard: [%d] of complexType: %s\n", type->attributeWildcard, type->name);
+ if (type->attributeWildcard->processContents ==
+ XML_SCHEMAS_ANY_LAX)
+ printf("processContents: lax\n");
+ else if (type->attributeWildcard->processContents ==
+ XML_SCHEMAS_ANY_STRICT)
+ printf("processContents: strict\n");
+ else
+ printf("processContents: skip\n");
if (type->attributeWildcard->any)
printf("type: any\n");
else if (type->attributeWildcard->negNsSet != NULL) {
@@ -8526,26 +8535,52 @@
} else
printf("empty\n");
-#endif
- /*
- * TODO: Implement processContents.
- */
+
+#endif
curState = ctxt->attr;
while (curState != NULL) {
- if ((curState->state == XML_SCHEMAS_ATTR_UNKNOWN) &&
- (curState->attr != NULL)) {
- if (curState->attr->ns != NULL) {
- if (xmlSchemaMatchesWildcardNs(type->attributeWildcard,
- curState->attr->ns->href))
+ if (curState->state == XML_SCHEMAS_ATTR_UNKNOWN) {
+ if (curState->attr->ns != NULL)
+ nsURI = curState->attr->ns->href;
+ else
+ nsURI = NULL;
+ if (xmlSchemaMatchesWildcardNs(type->attributeWildcard,
+ nsURI)) {
+ /*
+ * Handle processContents.
+ */
+ if ((type->attributeWildcard->processContents ==
+ XML_SCHEMAS_ANY_LAX) ||
+ (type->attributeWildcard->processContents ==
+ XML_SCHEMAS_ANY_STRICT)) {
+
+ attr = curState->attr;
+ attrDecl = xmlSchemaGetAttribute(ctxt->schema,
+ attr->name, nsURI);
+ if (attrDecl != NULL) {
+ value = xmlNodeListGetString(elem->doc, attr->children, 1);
+ ret = xmlSchemaValidateSimpleValue(ctxt, attrDecl->subtypes,
+ value);
+ if (ret != 0)
+ curState->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
+ else
+ curState->state = XML_SCHEMAS_ATTR_CHECKED;
+ curState->decl = attrDecl;
+ if (value != NULL) {
+ xmlFree(value);
+ }
+
+ } else if (type->attributeWildcard->processContents ==
+ XML_SCHEMAS_ANY_LAX) {
+ curState->state = XML_SCHEMAS_ATTR_CHECKED;
+ }
+ } else
curState->state = XML_SCHEMAS_ATTR_CHECKED;
- } else if (xmlSchemaMatchesWildcardNs(type->attributeWildcard,
- NULL))
- curState->state = XML_SCHEMAS_ATTR_CHECKED;
- }
+ }
+ }
curState = curState->next;
}
}
-
#ifdef DEBUG_ATTR_VALIDATION
if (redundant)
xmlGenericError(xmlGenericErrorContext,