mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-30 22:43:14 +03:00
applied a couple of patches from Peter Jacobi to start to get rid of
* parser.c: applied a couple of patches from Peter Jacobi to start to get rid of ctxt->token, with a possible significant speed improvement to be gained once done. Better compliance with PE references constructs in DTDs too. * test/valid/t[0-9]* result/valid/t[0-9]*: added a set of tests from Peter too Daniel
This commit is contained in:
@ -1,3 +1,12 @@
|
|||||||
|
Tue Jun 11 12:07:04 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* parser.c: applied a couple of patches from Peter Jacobi to start
|
||||||
|
to get rid of ctxt->token, with a possible significant speed
|
||||||
|
improvement to be gained once done. Better compliance with PE
|
||||||
|
references constructs in DTDs too.
|
||||||
|
* test/valid/t[0-9]* result/valid/t[0-9]*: added a set of tests
|
||||||
|
from Peter too
|
||||||
|
|
||||||
Tue Jun 11 09:25:12 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
Tue Jun 11 09:25:12 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* parser.c: Babak Vahedipour-Kunze reported that openTag in
|
* parser.c: Babak Vahedipour-Kunze reported that openTag in
|
||||||
|
79
parser.c
79
parser.c
@ -664,6 +664,58 @@ xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlNewBlanksWrapperInputStream:
|
||||||
|
* @ctxt: an XML parser context
|
||||||
|
* @entity: an Entity pointer
|
||||||
|
*
|
||||||
|
* Create a new input stream for wrapping
|
||||||
|
* blanks around a PEReference
|
||||||
|
*
|
||||||
|
* Returns the new input stream or NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void deallocblankswrapper (xmlChar *str) {xmlFree(str);}
|
||||||
|
|
||||||
|
xmlParserInputPtr
|
||||||
|
xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
|
||||||
|
xmlParserInputPtr input;
|
||||||
|
xmlChar *buffer;
|
||||||
|
size_t length;
|
||||||
|
if (entity == NULL) {
|
||||||
|
ctxt->errNo = XML_ERR_INTERNAL_ERROR;
|
||||||
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
|
ctxt->sax->error(ctxt->userData,
|
||||||
|
"internal: xmlNewBlanksWrapperInputStream entity = NULL\n");
|
||||||
|
ctxt->errNo = XML_ERR_INTERNAL_ERROR;
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
if (xmlParserDebugEntities)
|
||||||
|
xmlGenericError(xmlGenericErrorContext,
|
||||||
|
"new blanks wrapper for entity: %s\n", entity->name);
|
||||||
|
input = xmlNewInputStream(ctxt);
|
||||||
|
if (input == NULL) {
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
length = xmlStrlen(entity->name) + 5;
|
||||||
|
buffer = xmlMalloc(length);
|
||||||
|
if (buffer == NULL) {
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
buffer [0] = ' ';
|
||||||
|
buffer [1] = '%';
|
||||||
|
buffer [length-3] = ';';
|
||||||
|
buffer [length-2] = ' ';
|
||||||
|
buffer [length-1] = 0;
|
||||||
|
memcpy(buffer + 2, entity->name, length - 5);
|
||||||
|
input->free = deallocblankswrapper;
|
||||||
|
input->base = buffer;
|
||||||
|
input->cur = buffer;
|
||||||
|
input->length = length;
|
||||||
|
input->end = &buffer[length];
|
||||||
|
return(input);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlParserHandlePEReference:
|
* xmlParserHandlePEReference:
|
||||||
* @ctxt: the parser context
|
* @ctxt: the parser context
|
||||||
@ -765,6 +817,8 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
|
|||||||
*/
|
*/
|
||||||
if ((ctxt->external == 0) && (ctxt->inputNr == 1))
|
if ((ctxt->external == 0) && (ctxt->inputNr == 1))
|
||||||
return;
|
return;
|
||||||
|
if (IS_BLANK(NXT(1)) || NXT(1) == 0)
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case XML_PARSER_IGNORE:
|
case XML_PARSER_IGNORE:
|
||||||
return;
|
return;
|
||||||
@ -822,6 +876,9 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
|
|||||||
"PEReference: %%%s; not found\n", name);
|
"PEReference: %%%s; not found\n", name);
|
||||||
ctxt->valid = 0;
|
ctxt->valid = 0;
|
||||||
}
|
}
|
||||||
|
} else if (ctxt->input->free != deallocblankswrapper) {
|
||||||
|
input = xmlNewBlanksWrapperInputStream(ctxt, entity);
|
||||||
|
xmlPushInput(ctxt, input);
|
||||||
} else {
|
} else {
|
||||||
if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) ||
|
if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) ||
|
||||||
(entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) {
|
(entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) {
|
||||||
@ -857,8 +914,6 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
|
|||||||
(NXT(4) == 'l') && (IS_BLANK(NXT(5)))) {
|
(NXT(4) == 'l') && (IS_BLANK(NXT(5)))) {
|
||||||
xmlParseTextDecl(ctxt);
|
xmlParseTextDecl(ctxt);
|
||||||
}
|
}
|
||||||
if (ctxt->token == 0)
|
|
||||||
ctxt->token = ' ';
|
|
||||||
} else {
|
} else {
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
@ -3421,6 +3476,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
xmlChar *ndata = NULL;
|
xmlChar *ndata = NULL;
|
||||||
int isParameter = 0;
|
int isParameter = 0;
|
||||||
xmlChar *orig = NULL;
|
xmlChar *orig = NULL;
|
||||||
|
int skipped;
|
||||||
|
|
||||||
GROW;
|
GROW;
|
||||||
if ((RAW == '<') && (NXT(1) == '!') &&
|
if ((RAW == '<') && (NXT(1) == '!') &&
|
||||||
@ -3428,10 +3484,10 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
(NXT(4) == 'T') && (NXT(5) == 'I') &&
|
(NXT(4) == 'T') && (NXT(5) == 'I') &&
|
||||||
(NXT(6) == 'T') && (NXT(7) == 'Y')) {
|
(NXT(6) == 'T') && (NXT(7) == 'Y')) {
|
||||||
xmlParserInputPtr input = ctxt->input;
|
xmlParserInputPtr input = ctxt->input;
|
||||||
ctxt->instate = XML_PARSER_ENTITY_DECL;
|
|
||||||
SHRINK;
|
SHRINK;
|
||||||
SKIP(8);
|
SKIP(8);
|
||||||
if (!IS_BLANK(CUR)) {
|
skipped = SKIP_BLANKS;
|
||||||
|
if (skipped == 0) {
|
||||||
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
@ -3439,11 +3495,11 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
ctxt->wellFormed = 0;
|
ctxt->wellFormed = 0;
|
||||||
ctxt->disableSAX = 1;
|
ctxt->disableSAX = 1;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
|
||||||
|
|
||||||
if (RAW == '%') {
|
if (RAW == '%') {
|
||||||
NEXT;
|
NEXT;
|
||||||
if (!IS_BLANK(CUR)) {
|
skipped = SKIP_BLANKS;
|
||||||
|
if (skipped == 0) {
|
||||||
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
@ -3451,7 +3507,6 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
ctxt->wellFormed = 0;
|
ctxt->wellFormed = 0;
|
||||||
ctxt->disableSAX = 1;
|
ctxt->disableSAX = 1;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
|
||||||
isParameter = 1;
|
isParameter = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3464,7 +3519,8 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
ctxt->disableSAX = 1;
|
ctxt->disableSAX = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!IS_BLANK(CUR)) {
|
skipped = SKIP_BLANKS;
|
||||||
|
if (skipped == 0) {
|
||||||
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
|
||||||
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
|
||||||
ctxt->sax->error(ctxt->userData,
|
ctxt->sax->error(ctxt->userData,
|
||||||
@ -3472,8 +3528,8 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
|
|||||||
ctxt->wellFormed = 0;
|
ctxt->wellFormed = 0;
|
||||||
ctxt->disableSAX = 1;
|
ctxt->disableSAX = 1;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
|
||||||
|
|
||||||
|
ctxt->instate = XML_PARSER_ENTITY_DECL;
|
||||||
/*
|
/*
|
||||||
* handle the various case of definitions...
|
* handle the various case of definitions...
|
||||||
*/
|
*/
|
||||||
@ -6037,6 +6093,9 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) {
|
|||||||
if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
|
if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
|
||||||
ctxt->sax->warning(ctxt->userData,
|
ctxt->sax->warning(ctxt->userData,
|
||||||
"Internal: %%%s; is not a parameter entity\n", name);
|
"Internal: %%%s; is not a parameter entity\n", name);
|
||||||
|
} else if (ctxt->input->free != deallocblankswrapper) {
|
||||||
|
input = xmlNewBlanksWrapperInputStream(ctxt, entity);
|
||||||
|
xmlPushInput(ctxt, input);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* TODO !!!
|
* TODO !!!
|
||||||
@ -6060,8 +6119,6 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ctxt->token == 0)
|
|
||||||
ctxt->token = ' ';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctxt->hasPErefs = 1;
|
ctxt->hasPErefs = 1;
|
||||||
|
0
result/valid/t4.dtd
Normal file
0
result/valid/t4.dtd
Normal file
6
result/valid/t4.dtd.err
Normal file
6
result/valid/t4.dtd.err
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
./test/valid/t4.dtd:1: error: xmlParseStartTag: invalid element name
|
||||||
|
<!ENTITY % percent "%">
|
||||||
|
^
|
||||||
|
./test/valid/t4.dtd:1: error: Extra content at the end of the document
|
||||||
|
<!ENTITY % percent "%">
|
||||||
|
^
|
3
result/valid/t4.xml
Normal file
3
result/valid/t4.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root SYSTEM "t4.dtd">
|
||||||
|
<root>&abc;</root>
|
0
result/valid/t4.xml.err
Normal file
0
result/valid/t4.xml.err
Normal file
0
result/valid/t4a.dtd
Normal file
0
result/valid/t4a.dtd
Normal file
6
result/valid/t4a.dtd.err
Normal file
6
result/valid/t4a.dtd.err
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
./test/valid/t4a.dtd:1: error: xmlParseStartTag: invalid element name
|
||||||
|
<!ENTITY % percent "%">
|
||||||
|
^
|
||||||
|
./test/valid/t4a.dtd:1: error: Extra content at the end of the document
|
||||||
|
<!ENTITY % percent "%">
|
||||||
|
^
|
3
result/valid/t4a.xml
Normal file
3
result/valid/t4a.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root SYSTEM "t4a.dtd">
|
||||||
|
<root>&abc;</root>
|
0
result/valid/t4a.xml.err
Normal file
0
result/valid/t4a.xml.err
Normal file
0
result/valid/t6.dtd
Normal file
0
result/valid/t6.dtd
Normal file
6
result/valid/t6.dtd.err
Normal file
6
result/valid/t6.dtd.err
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
./test/valid/t6.dtd:1: error: xmlParseStartTag: invalid element name
|
||||||
|
<!ENTITY % xdef "def">
|
||||||
|
^
|
||||||
|
./test/valid/t6.dtd:1: error: Extra content at the end of the document
|
||||||
|
<!ENTITY % xdef "def">
|
||||||
|
^
|
3
result/valid/t6.xml
Normal file
3
result/valid/t6.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root SYSTEM "t6.dtd">
|
||||||
|
<root>&abc;</root>
|
0
result/valid/t6.xml.err
Normal file
0
result/valid/t6.xml.err
Normal file
0
result/valid/t8.xml
Normal file
0
result/valid/t8.xml
Normal file
18
result/valid/t8.xml.err
Normal file
18
result/valid/t8.xml.err
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Entity: line 1: error: xmlParseInternalSubset: error detected in Markup declaration
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
||||||
|
Entity: line 1: error: DOCTYPE improperly terminated
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
||||||
|
Entity: line 1: error: Start tag expected, '<' not found
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
0
result/valid/t8a.xml
Normal file
0
result/valid/t8a.xml
Normal file
18
result/valid/t8a.xml.err
Normal file
18
result/valid/t8a.xml.err
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Entity: line 1: error: xmlParseInternalSubset: error detected in Markup declaration
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
||||||
|
Entity: line 1: error: DOCTYPE improperly terminated
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
||||||
|
Entity: line 1: error: Start tag expected, '<' not found
|
||||||
|
%defroot;
|
||||||
|
^
|
||||||
|
Entity: line 1:
|
||||||
|
<!ELEMENT root (middle) >
|
||||||
|
^
|
10
result/valid/t9.xml
Normal file
10
result/valid/t9.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest "<!ELEMENT test (#PCDATA) >">
|
||||||
|
<!ENTITY % defmiddle "<!ELEMENT middle (test) >">
|
||||||
|
<!ENTITY % defroot "<!ELEMENT root (middle) >">
|
||||||
|
<!ELEMENT root (middle)>
|
||||||
|
<!ELEMENT middle (test)>
|
||||||
|
<!ELEMENT test (#PCDATA)>
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
0
result/valid/t9.xml.err
Normal file
0
result/valid/t9.xml.err
Normal file
10
result/valid/t9a.xml
Normal file
10
result/valid/t9a.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest "<!ELEMENT test (#PCDATA) >">
|
||||||
|
<!ENTITY % defmiddle "<!ELEMENT middle (test) >">
|
||||||
|
<!ENTITY % defroot "<!ELEMENT root (middle) >">
|
||||||
|
<!ELEMENT root (middle)>
|
||||||
|
<!ELEMENT middle (test)>
|
||||||
|
<!ELEMENT test (#PCDATA)>
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
0
result/valid/t9a.xml.err
Normal file
0
result/valid/t9a.xml.err
Normal file
4
test/valid/t4.dtd
Normal file
4
test/valid/t4.dtd
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<!ENTITY % percent "%">
|
||||||
|
<!ENTITY %percent; def "ghi">
|
||||||
|
<!ENTITY abc "%def;">
|
||||||
|
<!ELEMENT root (#PCDATA)>
|
3
test/valid/t4.xml
Normal file
3
test/valid/t4.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root SYSTEM 't4.dtd'>
|
||||||
|
<root>&abc;</root>
|
5
test/valid/t4a.dtd
Normal file
5
test/valid/t4a.dtd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<!ENTITY % percent "%">
|
||||||
|
<!ENTITY%percent;def "ghi">
|
||||||
|
<!ENTITY abc "%def;">
|
||||||
|
<!ELEMENT root (#PCDATA)>
|
||||||
|
|
3
test/valid/t4a.xml
Normal file
3
test/valid/t4a.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root SYSTEM 't4a.dtd'>
|
||||||
|
<root>&abc;</root>
|
5
test/valid/t6.dtd
Normal file
5
test/valid/t6.dtd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<!ENTITY % xdef "def">
|
||||||
|
<!ENTITY % %xdef; "ghi">
|
||||||
|
<!ENTITY abc "%def;">
|
||||||
|
<!ELEMENT root (#PCDATA)>
|
||||||
|
|
3
test/valid/t6.xml
Normal file
3
test/valid/t6.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root SYSTEM 't6.dtd'>
|
||||||
|
<root>&abc;</root>
|
8
test/valid/t8.xml
Normal file
8
test/valid/t8.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest '<!ELEMENT test (#PCDATA) >' >
|
||||||
|
<!ENTITY % defmiddle '<!ELEMENT middle (test) >' >
|
||||||
|
<!ENTITY % defroot '<!ELEMENT root (middle) >' >
|
||||||
|
%defroot; %defmiddle; %deftest;
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
8
test/valid/t8a.xml
Normal file
8
test/valid/t8a.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest '<!ELEMENT test (#PCDATA) >' >
|
||||||
|
<!ENTITY % defmiddle '<!ELEMENT middle (test) >' >
|
||||||
|
<!ENTITY % defroot '<!ELEMENT root (middle) >' >
|
||||||
|
%defroot;%defmiddle;%deftest;
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
8
test/valid/t9.xml
Normal file
8
test/valid/t9.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest '<!ELEMENT test (#PCDATA) >' >
|
||||||
|
<!ENTITY % defmiddle '<!ELEMENT middle (test) >' >
|
||||||
|
<!ENTITY % defroot '<!ELEMENT root (middle) >' >
|
||||||
|
%defroot; %defmiddle; %deftest;
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
8
test/valid/t9a.xml
Normal file
8
test/valid/t9a.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE root [
|
||||||
|
<!ENTITY % deftest '<!ELEMENT test (#PCDATA) >' >
|
||||||
|
<!ENTITY % defmiddle '<!ELEMENT middle (test) >' >
|
||||||
|
<!ENTITY % defroot '<!ELEMENT root (middle) >' >
|
||||||
|
%defroot;%defmiddle;%deftest;
|
||||||
|
]>
|
||||||
|
<root><middle><test>sample</test></middle></root>
|
Reference in New Issue
Block a user