indent_up();
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- generate_element(s_xsd_types_, (*m_iter)->get_name(), (*m_iter)->get_type(), (*m_iter)->get_xsd_attrs(), (*m_iter)->get_xsd_optional() || xsd_all);
+ generate_element(s_xsd_types_, (*m_iter)->get_name(), (*m_iter)->get_type(), (*m_iter)->get_xsd_attrs(), (*m_iter)->get_xsd_optional() || xsd_all, (*m_iter)->get_xsd_nillable());
}
indent_down();
t_type* ttype,
vector<string> attrs,
bool optional,
+ bool nillable,
bool list_element) {
string sminOccurs = (optional || list_element) ? " minOccurs=\"0\"" : "";
string smaxOccurs = list_element ? " maxOccurs=\"unbounded\"" : "";
string soptional = sminOccurs + smaxOccurs;
+ string snillable = nillable ? " nillable=\"true\"" : "";
if (ttype->is_void() || ttype->is_list()) {
indent(out) <<
- "<xsd:element name=\"" << name << "\"" << soptional << ">" << endl;
+ "<xsd:element name=\"" << name << "\"" << soptional << snillable << ">" << endl;
indent_up();
if (attrs.size() == 0 && ttype->is_void()) {
indent(out) <<
} else {
indent(out) <<
"<xsd:complexType>" << endl;
- indent_up();
-
- vector<string>::iterator a_iter;
- for (a_iter = attrs.begin(); a_iter != attrs.end(); ++a_iter) {
- indent(out) << "<xsd:attribute name=\"" << (*a_iter) << "\" type=\"xsd:boolean\" />" << endl;
- }
-
+ indent_up();
if (ttype->is_list()) {
- indent(out) << "<xsd:attribute name=\"list\" type=\"xsd:boolean\" />" << endl;
indent(out) << "<xsd:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">" << endl;
indent_up();
string subname;
subname = type_name(subtype);
}
f_php_ << "$GLOBALS['" << program_->get_name() << "_xsd_elt_" << name << "'] = '" << subname << "';" << endl;
- generate_element(out, subname, subtype, vector<string>(), false, true);
+ generate_element(out, subname, subtype, vector<string>(), false, false, true);
indent_down();
indent(out) << "</xsd:sequence>" << endl;
+ indent(out) << "<xsd:attribute name=\"list\" type=\"xsd:boolean\" />" << endl;
+ }
+ vector<string>::iterator a_iter;
+ for (a_iter = attrs.begin(); a_iter != attrs.end(); ++a_iter) {
+ indent(out) << "<xsd:attribute name=\"" << (*a_iter) << "\" type=\"xsd:boolean\" />" << endl;
}
indent_down();
indent(out) <<
} else {
if (attrs.size() == 0) {
indent(out) <<
- "<xsd:element name=\"" << name << "\"" << soptional << " type=\"" << type_name(ttype) << "\" />" << endl;
+ "<xsd:element name=\"" << name << "\"" << " type=\"" << type_name(ttype) << "\"" << soptional << snillable << " />" << endl;
} else {
// Wow, all this work for a SIMPLE TYPE with attributes?!?!?!
- indent(out) << "<xsd:element name=\"" << name << "\"" << soptional << ">" << endl;
+ indent(out) << "<xsd:element name=\"" << name << "\"" << soptional << snillable << ">" << endl;
indent_up();
indent(out) << "<xsd:complexType>" << endl;
indent_up();
private:
- void generate_element(std::ostream& out, std::string name, t_type* ttype, std::vector<std::string> attrs=std::vector<std::string>(), bool optional=false, bool list_element=false);
+ void generate_element(std::ostream& out, std::string name, t_type* ttype, std::vector<std::string> attrs=std::vector<std::string>(), bool optional=false, bool nillable=false, bool list_element=false);
std::string ns(std::string in, std::string ns) {
return ns + ":" + in;
name_(name),
key_(0),
value_(NULL),
- xsd_optional_(false) {}
+ xsd_optional_(false),
+ xsd_nillable_(false) {}
t_field(t_type* type, std::string name, int32_t key) :
type_(type),
name_(name),
key_(key),
value_(NULL),
- xsd_optional_(false) {}
+ xsd_optional_(false),
+ xsd_nillable_(false) {}
~t_field() {}
return xsd_optional_;
}
+ void set_xsd_nillable(bool xsd_nillable) {
+ xsd_nillable_ = xsd_nillable;
+ }
+
+ bool get_xsd_nillable() const {
+ return xsd_nillable_;
+ }
+
void add_xsd_attr(std::string attr) {
xsd_attrs_.push_back(attr);
}
t_const_value* value_;
bool xsd_optional_;
+ bool xsd_nillable_;
std::vector<std::string> xsd_attrs_;
std::string doc_;