diff --git a/generateDS.py b/generateDS.py index 748f6686901f15c40cbdbc0e2b76b21dd1f6a764..42da8e1b04e8c42571f456bf9afcfb6a17f92ce6 100755 --- a/generateDS.py +++ b/generateDS.py @@ -1132,27 +1132,7 @@ class XschemaElement(XschemaElementBase): else: self.complex = 1 elif type_val in SimpleTypeDict: - count = 0 - type_val1 = type_val - while True: - element = SimpleTypeDict[type_val1] - type_val1 = element.getBase() - if type_val1 and not is_builtin_simple_type(type_val1): - type_val1 = strip_namespace(type_val1) - if type_val1 is None: - # Something seems wrong. Can't find base simple type. - # Give up and use default. - type_val = StringType[0] - break - if type_val1 in SimpleTypeDict: - count += 1 - if count > 10: - # Give up. We're in a loop. Use default. - type_val = StringType[0] - break - else: - type_val = type_val1 - break + type_val = resolveBaseTypeForSimpleType(type_val) # Add the namespace prefix to the simple type if needed. if len(type_val.split(':')) == 1: type_val = CurrentNamespacePrefix + type_val @@ -4183,7 +4163,10 @@ def generateCtor(wrt, prefix, element): wrt(" initvalue_ = %s\n" % (mbrname, )) wrt(" self.%s = initvalue_\n" % (name, )) else: - pythonType = SchemaToPythonTypeMap.get(attrDef.getType()) + attrType = attrDef.getType() + if attrType in SimpleTypeDict: + attrType = resolveBaseTypeForSimpleType(attrType) + pythonType = SchemaToPythonTypeMap.get(attrType) attrVal = "_cast(%s, %s)" % (pythonType, mbrname, ) wrt(' self.%s = %s\n' % (name, attrVal, )) # Generate member initializers in ctor. @@ -4304,6 +4287,31 @@ def find_simple_type_def(tree, stName, element, child, ns, base): return st +def resolveBaseTypeForSimpleType(type_val): + count = 0 + type_val1 = type_val + while True: + element = SimpleTypeDict[type_val1] + type_val1 = element.getBase() + if type_val1 and not is_builtin_simple_type(type_val1): + type_val1 = strip_namespace(type_val1) + if type_val1 is None: + # Something seems wrong. Can't find base simple type. + # Give up and use default. + type_val = StringType[0] + break + if type_val1 in SimpleTypeDict: + count += 1 + if count > 10: + # Give up. We're in a loop. Use default. + type_val = StringType[0] + break + else: + type_val = type_val1 + break + return type_val + + def get_target_value(default, stName): stObj = SimpleTypeDict.get(stName) targetValue = default diff --git a/tests/validate_simpletypes.xsd b/tests/validate_simpletypes.xsd index 2493ac381399cd6d5f2e6ef2cc23f5f094edf12f..17c00070934da8da5c3aaaf0f3320dc3bdd41e77 100644 --- a/tests/validate_simpletypes.xsd +++ b/tests/validate_simpletypes.xsd @@ -15,7 +15,7 @@ <xs:complexType name="simpleOneType" mixed="0"> <xs:sequence> - <xs:element name="integer_range_1_value" type="integer_range_1_st"/> + <xs:element name="integer_range_1_value" type="integer_range_1_st" default="5"/> <xs:element name="pattern_value" type="pattern_st"/> <xs:element name="token_enum_value" type="token_enum_st"/> <xs:element name="integer_range_incl_value" type="integer_range_incl_st"/> @@ -50,6 +50,7 @@ <xs:element name="primative_integer" type="xs:integer"/> <xs:element name="primative_float" type="xs:float"/> </xs:sequence> + <xs:attribute name="integer_range_1_value_with_default" type="integer_range_1_st" default="6"/> </xs:complexType> <!-- Test for use of an anonymous simple type inside an anonymous complexType. --> <xs:element name="simpleTypeData" type="simpleTwoType"/>