mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-03-03 08:58:17 +03:00
attempt to cope with ID/IDREF(S) declared both in the DTD and in the
* valid.c xmlschemastypes.c: attempt to cope with ID/IDREF(S) declared both in the DTD and in the Schemas <grin/> * relaxng.c: more debug, added a big optimization for <mixed> * test/relaxng/testsuite.xml: augmented the testsuite * test/relaxng/ result/relaxng: added the RelaxNG spec and a DocBook example to the regression tests Daniel
This commit is contained in:
parent
798024a110
commit
249d7bbee2
@ -1,3 +1,12 @@
|
||||
Wed Mar 19 21:58:47 CET 2003 Daniel Veillard <daniel@veillard.com>
|
||||
|
||||
* valid.c xmlschemastypes.c: attempt to cope with ID/IDREF(S)
|
||||
declared both in the DTD and in the Schemas <grin/>
|
||||
* relaxng.c: more debug, added a big optimization for <mixed>
|
||||
* test/relaxng/testsuite.xml: augmented the testsuite
|
||||
* test/relaxng/ result/relaxng: added the RelaxNG spec and a
|
||||
DocBook example to the regression tests
|
||||
|
||||
Wed Mar 19 11:34:10 CET 2003 Daniel Veillard <daniel@veillard.com>
|
||||
|
||||
* check-xsddata-test-suite.py: cosmetic change for output
|
||||
|
77
relaxng.c
77
relaxng.c
@ -6,7 +6,6 @@
|
||||
* Daniel Veillard <veillard@redhat.com>
|
||||
*/
|
||||
|
||||
#define FS
|
||||
/**
|
||||
* TODO:
|
||||
* - error reporting
|
||||
@ -131,6 +130,7 @@ typedef enum {
|
||||
#define IS_NULLABLE 1
|
||||
#define IS_NOT_NULLABLE 2
|
||||
#define IS_INDETERMINIST 4
|
||||
#define IS_MIXED 8
|
||||
|
||||
struct _xmlRelaxNGDefine {
|
||||
xmlRelaxNGType type; /* the type of definition */
|
||||
@ -228,6 +228,7 @@ struct _xmlRelaxNGParserCtxt {
|
||||
|
||||
#define FLAGS_IGNORABLE 1
|
||||
#define FLAGS_NEGATIVE 2
|
||||
#define FLAGS_MIXED_CONTENT 4
|
||||
|
||||
/**
|
||||
* xmlRelaxNGInterleaveGroup:
|
||||
@ -795,7 +796,6 @@ xmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size)
|
||||
{
|
||||
xmlRelaxNGStatesPtr ret;
|
||||
|
||||
#ifdef FS
|
||||
if ((ctxt != NULL) &&
|
||||
(ctxt->freeState != NULL) &&
|
||||
(ctxt->freeStatesNr > 0)) {
|
||||
@ -804,7 +804,6 @@ xmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size)
|
||||
ret->nbState = 0;
|
||||
return(ret);
|
||||
}
|
||||
#endif
|
||||
if (size < 16) size = 16;
|
||||
|
||||
ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) +
|
||||
@ -922,7 +921,6 @@ xmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
{
|
||||
if (states == NULL)
|
||||
return;
|
||||
#ifdef FS
|
||||
if ((ctxt != NULL) && (ctxt->freeStates == NULL)) {
|
||||
ctxt->freeStatesMax = 40;
|
||||
ctxt->freeStatesNr = 0;
|
||||
@ -953,10 +951,6 @@ xmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
} else {
|
||||
ctxt->freeStates[ctxt->freeStatesNr++] = states;
|
||||
}
|
||||
#else
|
||||
xmlFree(states->tabState);
|
||||
xmlFree(states);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1555,7 +1549,7 @@ xmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err,
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
if ((ctxt->err != NULL) &&
|
||||
if ((ctxt->err != NULL) && (ctxt->state != NULL) &&
|
||||
(ctxt->err->node == ctxt->state->node) &&
|
||||
(ctxt->err->err == err))
|
||||
return(ctxt->errNr);
|
||||
@ -1601,9 +1595,11 @@ xmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
|
||||
ctxt->err = NULL;
|
||||
cur = &ctxt->errTab[ctxt->errNr];
|
||||
if (cur->flags & ERROR_IS_DUP) {
|
||||
xmlFree((xmlChar *)cur->arg1);
|
||||
if (cur->arg1 != NULL)
|
||||
xmlFree((xmlChar *)cur->arg1);
|
||||
cur->arg1 = NULL;
|
||||
xmlFree((xmlChar *)cur->arg2);
|
||||
if (cur->arg2 != NULL)
|
||||
xmlFree((xmlChar *)cur->arg2);
|
||||
cur->arg2 = NULL;
|
||||
cur->flags = 0;
|
||||
}
|
||||
@ -2625,10 +2621,7 @@ static int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
xmlRelaxNGDefinePtr define, xmlNodePtr elem);
|
||||
|
||||
|
||||
#define IS_BLANK_NODE(n) \
|
||||
((((n)->type == XML_TEXT_NODE) || \
|
||||
((n)->type == XML_CDATA_SECTION_NODE)) && \
|
||||
(xmlRelaxNGIsBlank((n)->content)))
|
||||
#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content))
|
||||
|
||||
/**
|
||||
* xmlRelaxNGIsNullable:
|
||||
@ -3455,6 +3448,7 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
|
||||
int i,j,ret;
|
||||
int nbgroups = 0;
|
||||
int nbchild = 0;
|
||||
int is_mixed = 0;
|
||||
|
||||
/*
|
||||
* Don't run that check in case of error. Infinite recursion
|
||||
@ -3487,6 +3481,8 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
|
||||
xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup));
|
||||
if (groups[nbgroups] == NULL)
|
||||
goto error;
|
||||
if (cur->type == XML_RELAXNG_TEXT)
|
||||
is_mixed++;
|
||||
groups[nbgroups]->rule = cur;
|
||||
groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0);
|
||||
groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1);
|
||||
@ -3534,6 +3530,8 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
|
||||
* and save the partition list back in the def
|
||||
*/
|
||||
def->data = partitions;
|
||||
if (is_mixed != 0)
|
||||
def->flags |= IS_MIXED;
|
||||
return;
|
||||
|
||||
error:
|
||||
@ -6836,7 +6834,8 @@ xmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
|
||||
(node->type == XML_PI_NODE) ||
|
||||
(((node->type == XML_TEXT_NODE) ||
|
||||
(node->type == XML_CDATA_SECTION_NODE)) &&
|
||||
(IS_BLANK_NODE(node))))) {
|
||||
((ctxt->flags & FLAGS_MIXED_CONTENT) ||
|
||||
(IS_BLANK_NODE(node)))))) {
|
||||
node = node->next;
|
||||
}
|
||||
return(node);
|
||||
@ -7529,6 +7528,7 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
xmlRelaxNGDefinePtr define) {
|
||||
int ret = 0, i, nbgroups, left;
|
||||
int errNr = ctxt->errNr;
|
||||
int oldflags;
|
||||
|
||||
xmlRelaxNGValidStatePtr oldstate;
|
||||
xmlRelaxNGPartitionPtr partitions;
|
||||
@ -7544,6 +7544,34 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
VALID_ERR(XML_RELAXNG_ERR_INTERNODATA);
|
||||
return(-1);
|
||||
}
|
||||
/*
|
||||
* Optimizations for MIXED
|
||||
*/
|
||||
oldflags = ctxt->flags;
|
||||
if (define->flags & IS_MIXED) {
|
||||
ctxt->flags |= FLAGS_MIXED_CONTENT;
|
||||
if (nbgroups == 2) {
|
||||
/*
|
||||
* this is a pure <mixed> case
|
||||
*/
|
||||
if (ctxt->state != NULL)
|
||||
ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
|
||||
ctxt->state->seq);
|
||||
if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT)
|
||||
ret = xmlRelaxNGValidateDefinition(ctxt,
|
||||
partitions->groups[1]->rule);
|
||||
else
|
||||
ret = xmlRelaxNGValidateDefinition(ctxt,
|
||||
partitions->groups[0]->rule);
|
||||
if (ret == 0) {
|
||||
if (ctxt->state != NULL)
|
||||
ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
|
||||
ctxt->state->seq);
|
||||
}
|
||||
ctxt->flags = oldflags;
|
||||
return(ret);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Build arrays to store the first and last node of the chain
|
||||
@ -7673,6 +7701,7 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
}
|
||||
|
||||
done:
|
||||
ctxt->flags = oldflags;
|
||||
/*
|
||||
* builds the next links chain from the prev one
|
||||
*/
|
||||
@ -7942,6 +7971,14 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
*/
|
||||
if (node->_private == define) {
|
||||
ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
|
||||
if (ctxt->errNr != 0) {
|
||||
while ((ctxt->err != NULL) &&
|
||||
(((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) &&
|
||||
(xmlStrEqual(ctxt->err->arg2, node->name))) ||
|
||||
(ctxt->err->err == XML_RELAXNG_ERR_NOELEM) ||
|
||||
(ctxt->err->err == XML_RELAXNG_ERR_NOTELEM)))
|
||||
xmlRelaxNGValidErrorPop(ctxt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -7963,6 +8000,10 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
}
|
||||
errNr = ctxt->errNr;
|
||||
|
||||
oldflags = ctxt->flags;
|
||||
if (ctxt->flags & FLAGS_MIXED_CONTENT) {
|
||||
ctxt->flags -= FLAGS_MIXED_CONTENT;
|
||||
}
|
||||
state = xmlRelaxNGNewValidState(ctxt, node);
|
||||
if (state == NULL) {
|
||||
ret = -1;
|
||||
@ -7990,7 +8031,6 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
if (ctxt->states != NULL) {
|
||||
tmp = -1;
|
||||
|
||||
oldflags = ctxt->flags;
|
||||
ctxt->flags |= FLAGS_IGNORABLE;
|
||||
|
||||
for (i = 0;i < ctxt->states->nbState;i++) {
|
||||
@ -8012,6 +8052,7 @@ xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
|
||||
ret = xmlRelaxNGValidateElementEnd(ctxt);
|
||||
xmlRelaxNGFreeValidState(ctxt,state);
|
||||
}
|
||||
ctxt->flags = oldflags;
|
||||
ctxt->state = oldstate;
|
||||
if (oldstate != NULL)
|
||||
oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
|
||||
@ -8695,14 +8736,12 @@ xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) {
|
||||
}
|
||||
xmlRelaxNGFreeStates(NULL, ctxt->freeState);
|
||||
}
|
||||
#ifdef FS
|
||||
if (ctxt->freeStates != NULL) {
|
||||
for (k = 0;k < ctxt->freeStatesNr;k++) {
|
||||
xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]);
|
||||
}
|
||||
xmlFree(ctxt->freeStates);
|
||||
}
|
||||
#endif
|
||||
if (ctxt->errTab != NULL)
|
||||
xmlFree(ctxt->errTab);
|
||||
xmlFree(ctxt);
|
||||
|
1
result/relaxng/docbook_0
Normal file
1
result/relaxng/docbook_0
Normal file
@ -0,0 +1 @@
|
||||
./test/relaxng/docbook_0.xml validates
|
4
result/relaxng/docbook_0.err
Normal file
4
result/relaxng/docbook_0.err
Normal file
@ -0,0 +1,4 @@
|
||||
./test/relaxng/docbook_0.xml:1864: error: Entity 'copy' not defined
|
||||
<sgmltag>&copy;</sgmltag> — copyright sign (©)
|
||||
^
|
||||
Unimplemented block at xmlschemastypes.c:1636
|
0
result/relaxng/docbook_err
Normal file
0
result/relaxng/docbook_err
Normal file
1
result/relaxng/docbook_valid
Normal file
1
result/relaxng/docbook_valid
Normal file
@ -0,0 +1 @@
|
||||
./test/relaxng/docbook.rng validates
|
1
result/relaxng/spec_0
Normal file
1
result/relaxng/spec_0
Normal file
@ -0,0 +1 @@
|
||||
./test/relaxng/spec_0.xml validates
|
0
result/relaxng/spec_0.err
Normal file
0
result/relaxng/spec_0.err
Normal file
0
result/relaxng/spec_err
Normal file
0
result/relaxng/spec_err
Normal file
1
result/relaxng/spec_valid
Normal file
1
result/relaxng/spec_valid
Normal file
@ -0,0 +1 @@
|
||||
./test/relaxng/spec.rng validates
|
1
result/relaxng/tutor8_1_2
Normal file
1
result/relaxng/tutor8_1_2
Normal file
@ -0,0 +1 @@
|
||||
./test/relaxng/tutor8_1_2.xml validates
|
0
result/relaxng/tutor8_1_2.err
Normal file
0
result/relaxng/tutor8_1_2.err
Normal file
9141
test/relaxng/docbook.rng
Normal file
9141
test/relaxng/docbook.rng
Normal file
File diff suppressed because it is too large
Load Diff
4448
test/relaxng/docbook_0.xml
Normal file
4448
test/relaxng/docbook_0.xml
Normal file
File diff suppressed because it is too large
Load Diff
96
test/relaxng/proofsystem.rng
Normal file
96
test/relaxng/proofsystem.rng
Normal file
@ -0,0 +1,96 @@
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
ns="http://relaxng.org/ns/proofsystem">
|
||||
|
||||
<start>
|
||||
<element name="proofSystem">
|
||||
<oneOrMore>
|
||||
<element name="rule">
|
||||
<attribute name="name"/>
|
||||
<zeroOrMore>
|
||||
<ref name="antecedent"/>
|
||||
</zeroOrMore>
|
||||
<ref name="consequent"/>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</start>
|
||||
|
||||
<define name="formula">
|
||||
<element name="formula">
|
||||
<choice>
|
||||
<ref name="judgement"/>
|
||||
<ref name="expr"/>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="consequent">
|
||||
<ref name="judgement"/>
|
||||
</define>
|
||||
|
||||
<define name="antecedent">
|
||||
<ref name="judgement"/>
|
||||
</define>
|
||||
|
||||
<define name="judgement">
|
||||
<choice>
|
||||
<element name="judgement">
|
||||
<attribute name="name"/>
|
||||
<zeroOrMore>
|
||||
<ref name="expr"/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
<element name="not">
|
||||
<ref name="judgement"/>
|
||||
</element>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name="expr">
|
||||
<choice>
|
||||
<element name="var">
|
||||
<attribute name="range"/>
|
||||
<optional>
|
||||
<attribute name="index"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="sub"/>
|
||||
</optional>
|
||||
</element>
|
||||
<element name="function">
|
||||
<attribute name="name"/>
|
||||
<zeroOrMore>
|
||||
<ref name="expr"/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
<element name="element">
|
||||
<attribute name="name"/>
|
||||
<zeroOrMore>
|
||||
<element name="attribute">
|
||||
<attribute name="name"/>
|
||||
<ref name="expr"/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<ref name="context"/>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<ref name="expr"/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
<element name="group">
|
||||
<zeroOrMore>
|
||||
<ref name="expr"/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
<element name="string"><text/></element>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name="context">
|
||||
<element name="context">
|
||||
<ref name="expr"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
</grammar>
|
60
test/relaxng/spec.rng
Normal file
60
test/relaxng/spec.rng
Normal file
@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- $Id: spec.rng,v 1.3 2001/10/23 05:54:24 jjc Exp $ -->
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
xmlns:p="http://relaxng.org/ns/proofsystem">
|
||||
|
||||
<start>
|
||||
<grammar>
|
||||
<include href="docbook.rng"/>
|
||||
<define name="synop.class" combine="choice">
|
||||
<choice>
|
||||
<parentRef name="rngref"/>
|
||||
<parentRef name="grammarref"/>
|
||||
<grammar>
|
||||
<include href="proofsystem.rng"/>
|
||||
<start combine="choice">
|
||||
<ref name="formula"/>
|
||||
</start>
|
||||
</grammar>
|
||||
</choice>
|
||||
</define>
|
||||
<define name="tech.char.class" combine="choice">
|
||||
<parentRef name="terms"/>
|
||||
</define>
|
||||
</grammar>
|
||||
</start>
|
||||
|
||||
<define name="rngref">
|
||||
<element name="rngref">
|
||||
<attribute name="src">
|
||||
<data type="anyURI"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="grammarref">
|
||||
<element name="grammarref">
|
||||
<attribute name="src">
|
||||
<data type="anyURI"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="terms">
|
||||
<grammar>
|
||||
<include href="proofsystem.rng">
|
||||
<start>
|
||||
<choice>
|
||||
<ref name="expr"/>
|
||||
<ref name="judgement"/>
|
||||
<ref name="context"/>
|
||||
</choice>
|
||||
</start>
|
||||
</include>
|
||||
</grammar>
|
||||
</define>
|
||||
|
||||
</grammar>
|
||||
|
||||
|
3589
test/relaxng/spec_0.xml
Normal file
3589
test/relaxng/spec_0.xml
Normal file
File diff suppressed because it is too large
Load Diff
@ -1531,4 +1531,93 @@
|
||||
</invalid>
|
||||
</testCase>
|
||||
</testSuite>
|
||||
<testSuite>
|
||||
<documentation>Test of Mixed</documentation>
|
||||
<testCase>
|
||||
<correct>
|
||||
<element name="mix" xmlns="http://relaxng.org/ns/structure/1.0">
|
||||
<mixed>
|
||||
<zeroOrMore>
|
||||
<choice>
|
||||
<element name="a">
|
||||
<empty/>
|
||||
</element>
|
||||
<element name="b">
|
||||
<empty/>
|
||||
</element>
|
||||
<element name="c">
|
||||
<empty/>
|
||||
</element>
|
||||
</choice>
|
||||
</zeroOrMore>
|
||||
</mixed>
|
||||
<element name="d">
|
||||
<empty/>
|
||||
</element>
|
||||
</element>
|
||||
</correct>
|
||||
<valid>
|
||||
<mix>
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
<b/>
|
||||
<a/>
|
||||
<c/>
|
||||
<b/>
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
mixed
|
||||
<c/>
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
<c/>
|
||||
mixed
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
<b/>
|
||||
is
|
||||
<a/>
|
||||
inter
|
||||
<c/>
|
||||
mixed
|
||||
<b/>
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
mixed
|
||||
<b/>
|
||||
.
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
<valid>
|
||||
<mix>
|
||||
this
|
||||
<b/>
|
||||
is
|
||||
<a/>
|
||||
inter
|
||||
<c/>
|
||||
mixed
|
||||
<b/>
|
||||
.
|
||||
<d/>
|
||||
</mix>
|
||||
</valid>
|
||||
</testCase>
|
||||
</testSuite>
|
||||
</testSuite>
|
||||
|
7
test/relaxng/tutor8_1_2.xml
Normal file
7
test/relaxng/tutor8_1_2.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<addressBook>
|
||||
<card>
|
||||
<name>b</name>
|
||||
<email>b@b</email>
|
||||
</card>
|
||||
</addressBook>
|
||||
|
2
valid.c
2
valid.c
@ -2287,6 +2287,8 @@ xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value,
|
||||
xmlFreeID(ret);
|
||||
return(NULL);
|
||||
}
|
||||
if (attr != NULL)
|
||||
attr->atype = XML_ATTRIBUTE_ID;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
@ -1526,15 +1526,22 @@ xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
|
||||
if ((ret == 0) && (node != NULL) &&
|
||||
(node->type == XML_ATTRIBUTE_NODE)) {
|
||||
xmlAttrPtr attr = (xmlAttrPtr) node;
|
||||
xmlChar *strip;
|
||||
|
||||
strip = xmlSchemaStrip(value);
|
||||
if (strip != NULL) {
|
||||
xmlAddRef(NULL, node->doc, strip, attr);
|
||||
xmlFree(strip);
|
||||
} else
|
||||
xmlAddRef(NULL, node->doc, value, attr);
|
||||
attr->atype = XML_ATTRIBUTE_IDREF;
|
||||
/*
|
||||
* NOTE: the REFness might have already be declared in the DTD
|
||||
*/
|
||||
if ((attr->atype != XML_ATTRIBUTE_IDREF) &&
|
||||
(attr->atype != XML_ATTRIBUTE_IDREFS)) {
|
||||
xmlChar *strip;
|
||||
|
||||
strip = xmlSchemaStrip(value);
|
||||
if (strip != NULL) {
|
||||
xmlAddRef(NULL, node->doc, strip, attr);
|
||||
xmlFree(strip);
|
||||
} else
|
||||
xmlAddRef(NULL, node->doc, value, attr);
|
||||
attr->atype = XML_ATTRIBUTE_IDREF;
|
||||
}
|
||||
}
|
||||
return(ret);
|
||||
} else if (type == xmlSchemaTypeIdrefsDef) {
|
||||
@ -1559,19 +1566,24 @@ xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
|
||||
if ((ret == 0) && (node != NULL) &&
|
||||
(node->type == XML_ATTRIBUTE_NODE)) {
|
||||
xmlAttrPtr attr = (xmlAttrPtr) node;
|
||||
xmlIDPtr res;
|
||||
xmlChar *strip;
|
||||
/*
|
||||
* NOTE: the IDness might have already be declared in the DTD
|
||||
*/
|
||||
if (attr->atype != XML_ATTRIBUTE_ID) {
|
||||
xmlIDPtr res;
|
||||
xmlChar *strip;
|
||||
|
||||
strip = xmlSchemaStrip(value);
|
||||
if (strip != NULL) {
|
||||
res = xmlAddID(NULL, node->doc, strip, attr);
|
||||
xmlFree(strip);
|
||||
} else
|
||||
res = xmlAddID(NULL, node->doc, value, attr);
|
||||
if (res == NULL) {
|
||||
ret = 2;
|
||||
} else {
|
||||
attr->atype = XML_ATTRIBUTE_ID;
|
||||
strip = xmlSchemaStrip(value);
|
||||
if (strip != NULL) {
|
||||
res = xmlAddID(NULL, node->doc, strip, attr);
|
||||
xmlFree(strip);
|
||||
} else
|
||||
res = xmlAddID(NULL, node->doc, value, attr);
|
||||
if (res == NULL) {
|
||||
ret = 2;
|
||||
} else {
|
||||
attr->atype = XML_ATTRIBUTE_ID;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(ret);
|
||||
|
Loading…
x
Reference in New Issue
Block a user