mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-24 13:33:01 +03:00
more progresses against the official regression tests small cleanup for
* runxmlconf.c: more progresses against the official regression tests * runsuite.c: small cleanup for non-leak reports * include/libxml/tree.h: parsing flags and other properties are now added to the document node, this is generally useful and allow to make Name and NmToken validations based on the parser flags, more specifically the 5th edition of XML or not * HTMLparser.c tree.c: small side effects for the previous changes * parser.c SAX2.c valid.c: the bulk of teh changes are here, the parser and validation behaviour can be affected, parsing flags need to be copied, lot of changes. Also fixing various validation problems in the regression tests. Daniel svn path=/trunk/; revision=3762
This commit is contained in:
361
valid.c
361
valid.c
@@ -36,6 +36,11 @@ static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name,
|
||||
"Unimplemented block at %s:%d\n", \
|
||||
__FILE__, __LINE__);
|
||||
|
||||
#ifdef LIBXML_VALID_ENABLED
|
||||
static int
|
||||
xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type,
|
||||
const xmlChar *value);
|
||||
#endif
|
||||
/************************************************************************
|
||||
* *
|
||||
* Error handling routines *
|
||||
@@ -2024,7 +2029,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
|
||||
return(NULL);
|
||||
}
|
||||
if ((defaultValue != NULL) &&
|
||||
(!xmlValidateAttributeValue(type, defaultValue))) {
|
||||
(!xmlValidateAttributeValueInternal(dtd->doc, type, defaultValue))) {
|
||||
xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_DEFAULT,
|
||||
"Attribute %s of %s: invalid default value\n",
|
||||
elem, name, defaultValue);
|
||||
@@ -2042,8 +2047,10 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
|
||||
(dtd->doc->intSubset != NULL) &&
|
||||
(dtd->doc->intSubset->attributes != NULL)) {
|
||||
ret = xmlHashLookup3(dtd->doc->intSubset->attributes, name, ns, elem);
|
||||
if (ret != NULL)
|
||||
if (ret != NULL) {
|
||||
xmlFreeEnumeration(tree);
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2057,6 +2064,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
|
||||
if (table == NULL) {
|
||||
xmlVErrMemory(ctxt,
|
||||
"xmlAddAttributeDecl: Table creation failed!\n");
|
||||
xmlFreeEnumeration(tree);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
@@ -2064,6 +2072,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt,
|
||||
ret = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute));
|
||||
if (ret == NULL) {
|
||||
xmlVErrMemory(ctxt, "malloc failed");
|
||||
xmlFreeEnumeration(tree);
|
||||
return(NULL);
|
||||
}
|
||||
memset(ret, 0, sizeof(xmlAttribute));
|
||||
@@ -3445,6 +3454,109 @@ xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) {
|
||||
}
|
||||
|
||||
#ifdef LIBXML_VALID_ENABLED
|
||||
|
||||
static int
|
||||
xmlIsDocNameStartChar(xmlDocPtr doc, int c) {
|
||||
if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) {
|
||||
/*
|
||||
* Use the new checks of production [4] [4a] amd [5] of the
|
||||
* Update 5 of XML-1.0
|
||||
*/
|
||||
if (((c >= 'a') && (c <= 'z')) ||
|
||||
((c >= 'A') && (c <= 'Z')) ||
|
||||
(c == '_') || (c == ':') ||
|
||||
((c >= 0xC0) && (c <= 0xD6)) ||
|
||||
((c >= 0xD8) && (c <= 0xF6)) ||
|
||||
((c >= 0xF8) && (c <= 0x2FF)) ||
|
||||
((c >= 0x370) && (c <= 0x37D)) ||
|
||||
((c >= 0x37F) && (c <= 0x1FFF)) ||
|
||||
((c >= 0x200C) && (c <= 0x200D)) ||
|
||||
((c >= 0x2070) && (c <= 0x218F)) ||
|
||||
((c >= 0x2C00) && (c <= 0x2FEF)) ||
|
||||
((c >= 0x3001) && (c <= 0xD7FF)) ||
|
||||
((c >= 0xF900) && (c <= 0xFDCF)) ||
|
||||
((c >= 0xFDF0) && (c <= 0xFFFD)) ||
|
||||
((c >= 0x10000) && (c <= 0xEFFFF)))
|
||||
return(1);
|
||||
} else {
|
||||
if (IS_LETTER(c) || (c == '_') || (c == ':'))
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
xmlIsDocNameChar(xmlDocPtr doc, int c) {
|
||||
if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) {
|
||||
/*
|
||||
* Use the new checks of production [4] [4a] amd [5] of the
|
||||
* Update 5 of XML-1.0
|
||||
*/
|
||||
if (((c >= 'a') && (c <= 'z')) ||
|
||||
((c >= 'A') && (c <= 'Z')) ||
|
||||
((c >= '0') && (c <= '9')) || /* !start */
|
||||
(c == '_') || (c == ':') ||
|
||||
(c == '-') || (c == '.') || (c == 0xB7) || /* !start */
|
||||
((c >= 0xC0) && (c <= 0xD6)) ||
|
||||
((c >= 0xD8) && (c <= 0xF6)) ||
|
||||
((c >= 0xF8) && (c <= 0x2FF)) ||
|
||||
((c >= 0x300) && (c <= 0x36F)) || /* !start */
|
||||
((c >= 0x370) && (c <= 0x37D)) ||
|
||||
((c >= 0x37F) && (c <= 0x1FFF)) ||
|
||||
((c >= 0x200C) && (c <= 0x200D)) ||
|
||||
((c >= 0x203F) && (c <= 0x2040)) || /* !start */
|
||||
((c >= 0x2070) && (c <= 0x218F)) ||
|
||||
((c >= 0x2C00) && (c <= 0x2FEF)) ||
|
||||
((c >= 0x3001) && (c <= 0xD7FF)) ||
|
||||
((c >= 0xF900) && (c <= 0xFDCF)) ||
|
||||
((c >= 0xFDF0) && (c <= 0xFFFD)) ||
|
||||
((c >= 0x10000) && (c <= 0xEFFFF)))
|
||||
return(1);
|
||||
} else {
|
||||
if ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
|
||||
(c == '.') || (c == '-') ||
|
||||
(c == '_') || (c == ':') ||
|
||||
(IS_COMBINING(c)) ||
|
||||
(IS_EXTENDER(c)))
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateNameValue:
|
||||
* @doc: pointer to the document or NULL
|
||||
* @value: an Name value
|
||||
*
|
||||
* Validate that the given value match Name production
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
static int
|
||||
xmlValidateNameValueInternal(xmlDocPtr doc, const xmlChar *value) {
|
||||
const xmlChar *cur;
|
||||
int val, len;
|
||||
|
||||
if (value == NULL) return(0);
|
||||
cur = value;
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
if (!xmlIsDocNameStartChar(doc, val))
|
||||
return(0);
|
||||
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
if (val != 0) return(0);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateNameValue:
|
||||
* @value: an Name value
|
||||
@@ -3456,6 +3568,21 @@ xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) {
|
||||
|
||||
int
|
||||
xmlValidateNameValue(const xmlChar *value) {
|
||||
return(xmlValidateNameValueInternal(NULL, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateNamesValueInternal:
|
||||
* @doc: pointer to the document or NULL
|
||||
* @value: an Names value
|
||||
*
|
||||
* Validate that the given value match Names production
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
static int
|
||||
xmlValidateNamesValueInternal(xmlDocPtr doc, const xmlChar *value) {
|
||||
const xmlChar *cur;
|
||||
int val, len;
|
||||
|
||||
@@ -3463,22 +3590,36 @@ xmlValidateNameValue(const xmlChar *value) {
|
||||
cur = value;
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
if (!IS_LETTER(val) && (val != '_') &&
|
||||
(val != ':')) {
|
||||
|
||||
if (!xmlIsDocNameStartChar(doc, val))
|
||||
return(0);
|
||||
}
|
||||
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
/* Should not test IS_BLANK(val) here -- see erratum E20*/
|
||||
while (val == 0x20) {
|
||||
while (val == 0x20) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
if (!xmlIsDocNameStartChar(doc, val))
|
||||
return(0);
|
||||
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
}
|
||||
|
||||
if (val != 0) return(0);
|
||||
|
||||
return(1);
|
||||
@@ -3495,6 +3636,23 @@ xmlValidateNameValue(const xmlChar *value) {
|
||||
|
||||
int
|
||||
xmlValidateNamesValue(const xmlChar *value) {
|
||||
return(xmlValidateNamesValueInternal(NULL, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateNmtokenValueInternal:
|
||||
* @doc: pointer to the document or NULL
|
||||
* @value: an Nmtoken value
|
||||
*
|
||||
* Validate that the given value match Nmtoken production
|
||||
*
|
||||
* [ VC: Name Token ]
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
static int
|
||||
xmlValidateNmtokenValueInternal(xmlDocPtr doc, const xmlChar *value) {
|
||||
const xmlChar *cur;
|
||||
int val, len;
|
||||
|
||||
@@ -3502,47 +3660,17 @@ xmlValidateNamesValue(const xmlChar *value) {
|
||||
cur = value;
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
if (!IS_LETTER(val) && (val != '_') &&
|
||||
(val != ':')) {
|
||||
|
||||
if (!xmlIsDocNameChar(doc, val))
|
||||
return(0);
|
||||
}
|
||||
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
/* Should not test IS_BLANK(val) here -- see erratum E20*/
|
||||
while (val == 0x20) {
|
||||
while (val == 0x20) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
if (!IS_LETTER(val) && (val != '_') &&
|
||||
(val != ':')) {
|
||||
return(0);
|
||||
}
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
}
|
||||
|
||||
if (val != 0) return(0);
|
||||
|
||||
return(1);
|
||||
@@ -3555,12 +3683,29 @@ xmlValidateNamesValue(const xmlChar *value) {
|
||||
* Validate that the given value match Nmtoken production
|
||||
*
|
||||
* [ VC: Name Token ]
|
||||
*
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
xmlValidateNmtokenValue(const xmlChar *value) {
|
||||
return(xmlValidateNmtokenValueInternal(NULL, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateNmtokensValueInternal:
|
||||
* @doc: pointer to the document or NULL
|
||||
* @value: an Nmtokens value
|
||||
*
|
||||
* Validate that the given value match Nmtokens production
|
||||
*
|
||||
* [ VC: Name Token ]
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
static int
|
||||
xmlValidateNmtokensValueInternal(xmlDocPtr doc, const xmlChar *value) {
|
||||
const xmlChar *cur;
|
||||
int val, len;
|
||||
|
||||
@@ -3568,23 +3713,40 @@ xmlValidateNmtokenValue(const xmlChar *value) {
|
||||
cur = value;
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
if (!IS_LETTER(val) && !IS_DIGIT(val) &&
|
||||
(val != '.') && (val != '-') &&
|
||||
(val != '_') && (val != ':') &&
|
||||
(!IS_COMBINING(val)) &&
|
||||
(!IS_EXTENDER(val)))
|
||||
return(0);
|
||||
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
while (IS_BLANK(val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
if (!xmlIsDocNameChar(doc, val))
|
||||
return(0);
|
||||
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
/* Should not test IS_BLANK(val) here -- see erratum E20*/
|
||||
while (val == 0x20) {
|
||||
while (val == 0x20) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
if (val == 0) return(1);
|
||||
|
||||
if (!xmlIsDocNameChar(doc, val))
|
||||
return(0);
|
||||
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
while (xmlIsDocNameChar(doc, val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
}
|
||||
|
||||
if (val != 0) return(0);
|
||||
|
||||
return(1);
|
||||
@@ -3597,69 +3759,13 @@ xmlValidateNmtokenValue(const xmlChar *value) {
|
||||
* Validate that the given value match Nmtokens production
|
||||
*
|
||||
* [ VC: Name Token ]
|
||||
*
|
||||
*
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
xmlValidateNmtokensValue(const xmlChar *value) {
|
||||
const xmlChar *cur;
|
||||
int val, len;
|
||||
|
||||
if (value == NULL) return(0);
|
||||
cur = value;
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
|
||||
while (IS_BLANK(val)) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
if (!IS_LETTER(val) && !IS_DIGIT(val) &&
|
||||
(val != '.') && (val != '-') &&
|
||||
(val != '_') && (val != ':') &&
|
||||
(!IS_COMBINING(val)) &&
|
||||
(!IS_EXTENDER(val)))
|
||||
return(0);
|
||||
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
|
||||
/* Should not test IS_BLANK(val) here -- see erratum E20*/
|
||||
while (val == 0x20) {
|
||||
while (val == 0x20) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
if (val == 0) return(1);
|
||||
|
||||
if (!IS_LETTER(val) && !IS_DIGIT(val) &&
|
||||
(val != '.') && (val != '-') &&
|
||||
(val != '_') && (val != ':') &&
|
||||
(!IS_COMBINING(val)) &&
|
||||
(!IS_EXTENDER(val)))
|
||||
return(0);
|
||||
|
||||
while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
|
||||
(val == '.') || (val == '-') ||
|
||||
(val == '_') || (val == ':') ||
|
||||
(IS_COMBINING(val)) ||
|
||||
(IS_EXTENDER(val))) {
|
||||
val = xmlStringCurrentChar(NULL, cur, &len);
|
||||
cur += len;
|
||||
}
|
||||
}
|
||||
|
||||
if (val != 0) return(0);
|
||||
|
||||
return(1);
|
||||
return(xmlValidateNmtokensValueInternal(NULL, value));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3710,28 +3816,34 @@ xmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATT
|
||||
* returns 1 if valid or 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) {
|
||||
static int
|
||||
xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type,
|
||||
const xmlChar *value) {
|
||||
switch (type) {
|
||||
case XML_ATTRIBUTE_ENTITIES:
|
||||
case XML_ATTRIBUTE_IDREFS:
|
||||
return(xmlValidateNamesValue(value));
|
||||
return(xmlValidateNamesValueInternal(doc, value));
|
||||
case XML_ATTRIBUTE_ENTITY:
|
||||
case XML_ATTRIBUTE_IDREF:
|
||||
case XML_ATTRIBUTE_ID:
|
||||
case XML_ATTRIBUTE_NOTATION:
|
||||
return(xmlValidateNameValue(value));
|
||||
return(xmlValidateNameValueInternal(doc, value));
|
||||
case XML_ATTRIBUTE_NMTOKENS:
|
||||
case XML_ATTRIBUTE_ENUMERATION:
|
||||
return(xmlValidateNmtokensValue(value));
|
||||
return(xmlValidateNmtokensValueInternal(doc, value));
|
||||
case XML_ATTRIBUTE_NMTOKEN:
|
||||
return(xmlValidateNmtokenValue(value));
|
||||
return(xmlValidateNmtokenValueInternal(doc, value));
|
||||
case XML_ATTRIBUTE_CDATA:
|
||||
break;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
int
|
||||
xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) {
|
||||
return(xmlValidateAttributeValueInternal(NULL, type, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlValidateAttributeValue2:
|
||||
* @ctxt: the validation context
|
||||
@@ -4047,11 +4159,12 @@ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
|
||||
int val;
|
||||
CHECK_DTD;
|
||||
if(attr == NULL) return(1);
|
||||
|
||||
|
||||
/* Attribute Default Legal */
|
||||
/* Enumeration */
|
||||
if (attr->defaultValue != NULL) {
|
||||
val = xmlValidateAttributeValue(attr->atype, attr->defaultValue);
|
||||
val = xmlValidateAttributeValueInternal(doc, attr->atype,
|
||||
attr->defaultValue);
|
||||
if (val == 0) {
|
||||
xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT,
|
||||
"Syntax of default value for attribute %s of %s is not valid\n",
|
||||
@@ -4332,7 +4445,7 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
|
||||
}
|
||||
attr->atype = attrDecl->atype;
|
||||
|
||||
val = xmlValidateAttributeValue(attrDecl->atype, value);
|
||||
val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value);
|
||||
if (val == 0) {
|
||||
xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE,
|
||||
"Syntax of value for attribute %s of %s is not valid\n",
|
||||
@@ -4517,7 +4630,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
val = xmlValidateAttributeValue(attrDecl->atype, value);
|
||||
val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value);
|
||||
if (val == 0) {
|
||||
if (ns->prefix != NULL) {
|
||||
xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT,
|
||||
|
||||
Reference in New Issue
Block a user