diff --git a/src/unstable/xml/Document.winxed b/src/unstable/xml/Document.winxed
index a54c5d2c..c56edd2d 100644
--- a/src/unstable/xml/Document.winxed
+++ b/src/unstable/xml/Document.winxed
@@ -130,10 +130,10 @@ class Rosella.Xml.DtdDocument
self.typedefs[name] = elem;
}
- function add_element_attlist(string elemname, var attr)
+ function add_element_attribute_def(string elemname, string attrname, string attrtype, string default_value, string default_rule, string fixed_value)
{
if (!(exists self.typedefs[elemname]))
Rosella.Error.error("!ELEMENT type '%s' is not defined", elemname);
- self.typedefs[elemname].add_attribute(attr);
+ self.typedefs[elemname].add_attribute(attrname, attrtype, default_value, default_rule, fixed_value);
}
}
diff --git a/src/unstable/xml/Parser.winxed b/src/unstable/xml/Parser.winxed
index 72213bc5..f7b88772 100644
--- a/src/unstable/xml/Parser.winxed
+++ b/src/unstable/xml/Parser.winxed
@@ -228,9 +228,6 @@ namespace Rosella.Xml.Parser
Rosella.Parse.error_unknown_char(c, "!ELEMENT tag", current_position(len, s, b));
break;
case "ATTLIST":
- var attr = new Rosella.Xml.Tag.DtdAttlist(start_pos, elemname);
- dtd_doc.add_element_attlist(elemname, attr);
-
while (true) {
c = peek_next(s, b);
if (c == ASCII_GREATER_THAN)
@@ -268,7 +265,7 @@ namespace Rosella.Xml.Parser
} else
Rosella.Parse.error_unknown_char(c, "!ATTLIST tag", current_position(len, s, b));
}
- attr.add_attr(attrname, attrtype, default_value, default_rule, fixed_value);
+ dtd_doc.add_element_attribute_def(elemname, attrname, attrtype, default_value, default_rule, fixed_value);
eat_whitespace(s, b);
}
diff --git a/src/unstable/xml/Tag.winxed b/src/unstable/xml/Tag.winxed
index e1e4e318..a602dc7c 100644
--- a/src/unstable/xml/Tag.winxed
+++ b/src/unstable/xml/Tag.winxed
@@ -251,7 +251,7 @@ class Rosella.Xml.Tag.DtdElement
{
var children;
var children_rule;
- var attributes;
+ var attlist;
var name;
var pos;
@@ -259,7 +259,6 @@ class Rosella.Xml.Tag.DtdElement
{
self.pos = pos;
self.children = {};
- self.attributes = [];
self.name = name;
}
@@ -269,9 +268,11 @@ class Rosella.Xml.Tag.DtdElement
self.children[name] = modifier;
}
- function add_attribute(var attr)
+ function add_attribute(string attrname, string attrtype, string default_value, string default_rule, string fixed_value)
{
- push(self.attributes, attr);
+ if (self.attlist == null)
+ self.attlist = new Rosella.Xml.Tag.DtdAttlist(self.name);
+ self.attlist.add_attr(attrname, attrtype, default_value, default_rule, fixed_value);
}
function set_child_rule(string rule)
@@ -307,17 +308,23 @@ class Rosella.Xml.Tag.DtdAttlist
var default_values;
var default_rules;
var fixed_values;
- var pos;
- function DtdAttlist(int pos, string elemname)
+ function DtdAttlist(string elemname)
{
- self.pos = pos;
self.elemname = elemname;
- self.attrnames = [];
- self.attrtypes = [];
- self.default_values = [];
- self.default_rules = [];
- self.fixed_values = [];
+ self.attrtypes = []; // This might need to be non-string for enumerated types
+
+ string attrnames[] = [];
+ self.attrnames = attrnames;
+
+ string default_values[] = [];
+ self.default_values = default_values;
+
+ string default_rules[] = [];
+ self.default_rules = default_rules;
+
+ string fixed_values[] = [];
+ self.fixed_values = fixed_values;
}
function add_attr(string attrname, string typename, string default_value, string default_rule, string fixed_value)
diff --git a/t/xml/Parsing.t b/t/xml/Parsing.t
index 71518923..9ae5528a 100644
--- a/t/xml/Parsing.t
+++ b/t/xml/Parsing.t
@@ -125,13 +125,26 @@ function __test_data() { return {
"!ATTLIST with multiple attributes" : <<:
-
-
+
+
+]>
+
+:>>
+,
+ "Multiple !ATTLISTs for a single element" : <<:
+
+
+
+
]>
:>>
,
+
+
// The empty string (Keep this one last)
"Empty string" : ""
};}