diff --git a/lib/xmerl/src/xmerl_xsd.erl b/lib/xmerl/src/xmerl_xsd.erl index b00a66918435..581970a7210e 100644 --- a/lib/xmerl/src/xmerl_xsd.erl +++ b/lib/xmerl/src/xmerl_xsd.erl @@ -2620,6 +2620,9 @@ check_element_type(XML=[#xmlText{}|_], {ResolvedType,_} = resolve({simple_or_complex_Type,BT},S), check_element_type(XML,ResolvedType,Env,Block,S,Checked); +check_element_type(_C, optional_text, _Env, _Block, S, _Checked) -> + {[], [], S}; + %% single schema object check_element_type(XML=[_H|_], #schema_complex_type{name=Name,block=Bl,content=C}, @@ -3055,12 +3058,16 @@ allow_empty_content([{extension,{_BT,_CM=[]}}]) -> true; allow_empty_content([{_,{_,{0,_}}}|Rest]) -> allow_empty_content(Rest); +allow_empty_content([{any,{_,{0,_},_}}|Rest]) -> + allow_empty_content(Rest); allow_empty_content([{_,{Content,_}}|Rest]) -> case allow_empty_content(Content) of true -> allow_empty_content(Rest); _ -> false end; +allow_empty_content([optional_text|Rest]) -> + allow_empty_content(Rest); allow_empty_content(_) -> false. @@ -3913,6 +3920,8 @@ is_optional(G={group,_},S) -> {#schema_group{content=[CM]},_} -> is_optional(CM,S) end; +is_optional(optional_text,_) -> + true; is_optional(_,_) -> false. diff --git a/lib/xmerl/test/xmerl_SUITE.erl b/lib/xmerl/test/xmerl_SUITE.erl index 11ec26192f00..08d7c8a4c08e 100644 --- a/lib/xmerl/test/xmerl_SUITE.erl +++ b/lib/xmerl/test/xmerl_SUITE.erl @@ -309,7 +309,7 @@ export(Config) -> {ok, B} = file:read_file(TestFile), ok. -export_cdata(Config) -> +export_cdata(_Config) -> InData = <<" Test... diff --git a/lib/xmerl/test/xmerl_xsd_SUITE.erl b/lib/xmerl/test/xmerl_xsd_SUITE.erl index 3060f27e6c98..5890f50d4e11 100644 --- a/lib/xmerl/test/xmerl_xsd_SUITE.erl +++ b/lib/xmerl/test/xmerl_xsd_SUITE.erl @@ -66,7 +66,7 @@ groups() -> sis2, state2file_file2state, union]}, {ticket_tests, [], [ticket_6910, ticket_7165, ticket_7190, ticket_7288, - ticket_7736, ticket_8599, ticket_9410]}, + ticket_7736, ticket_8599, ticket_9410, ticket_19792]}, {facets, [], [length, minLength, maxLength, pattern, enumeration, whiteSpace, maxInclusive, maxExclusive, minExclusive, @@ -970,6 +970,22 @@ ticket_9410(Config) -> file:set_cwd(datadir_join(Config,[".."])), {ok, _S} = xmerl_xsd:process_schema("xmerl_xsd_SUITE_data/small.xsd"). + +ticket_19792(Config) -> + {ok, S} = xmerl_xsd:process_schema(datadir_join(Config,["ticket_19792.xsd"])), + {E0,_} = xmerl_scan:file(datadir_join(Config,["ticket_19792_0.xml"])), + {{xmlElement,file,file,_,_,_,_,_,_,_,_,_},_GlobalState1} = xmerl_xsd:validate(E0, S), + {E1,_} = xmerl_scan:file(datadir_join(Config,["ticket_19792_1.xml"])), + {{xmlElement,file,file,_,_,_,_,_,_,_,_,_},_GlobalState1} = xmerl_xsd:validate(E1, S), + {E2,_} = xmerl_scan:file(datadir_join(Config,["ticket_19792_2.xml"])), + {{xmlElement,file,file,_,_,_,_,_,_,_,_,_},_GlobalState2} = xmerl_xsd:validate(E2, S), + {E3,_} = xmerl_scan:file(datadir_join(Config,["ticket_19792_3.xml"])), + {{xmlElement,file,file,_,_,_,_,_,_,_,_,_},_GlobalState3} = xmerl_xsd:validate(E3, S), + {E4,_} = xmerl_scan:file(datadir_join(Config,["ticket_19792_4.xml"])), + {{xmlElement,file,file,_,_,_,_,_,_,_,_,_},_GlobalState4} = xmerl_xsd:validate(E4, S), + ok. + + %%====================================================================== %% Support Functions %%====================================================================== diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792.xsd new file mode 100644 index 000000000000..aabfdd4c3ac6 --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792.xsd @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_0.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_0.xml new file mode 100644 index 000000000000..381c0194677d --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_0.xml @@ -0,0 +1,31 @@ + + + + + 100 + + + + + diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_1.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_1.xml new file mode 100644 index 000000000000..2997edcd89f6 --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_1.xml @@ -0,0 +1,31 @@ + + + + + 100 + teststring + + + + diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_2.xml new file mode 100644 index 000000000000..30f8d37f556a --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_2.xml @@ -0,0 +1,31 @@ + + + + + 100 + teststring100 + + + + diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_3.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_3.xml new file mode 100644 index 000000000000..dfe8737429ee --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_3.xml @@ -0,0 +1,31 @@ + + + + + 100 + 100teststring + + + + diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_4.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_4.xml new file mode 100644 index 000000000000..e989627eaad7 --- /dev/null +++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_19792_4.xml @@ -0,0 +1,31 @@ + + + + + 100 + teststring100teststring + + + +