diff --git a/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl
new file mode 100644
index 000000000..7e586b0b1
--- /dev/null
+++ b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl
new file mode 100644
index 000000000..d639461ac
--- /dev/null
+++ b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wst/trunk/tests/test_suite/test_parsers.pas b/wst/trunk/tests/test_suite/test_parsers.pas
index b23970127..0c3126f6b 100644
--- a/wst/trunk/tests/test_suite/test_parsers.pas
+++ b/wst/trunk/tests/test_suite/test_parsers.pas
@@ -157,6 +157,8 @@ type
procedure signature_last();
procedure signature_result();
procedure signature_return();
+ procedure xsd_not_declared_at_top_node();
+ procedure xsd_not_declared_at_top_node_2();
end;
implementation
@@ -1573,7 +1575,7 @@ begin
Result := ParseDoc(x_complexType_class_properties_extended_metadata);
end;
-function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata2: TwstPasTreeContainer;
+function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata2(): TwstPasTreeContainer;
begin
Result := ParseDoc(x_complexType_class_properties_extended_metadata + '_2');
end;
@@ -1926,6 +1928,16 @@ begin
end;
end;
+procedure TTest_WsdlParser.xsd_not_declared_at_top_node();
+begin
+ ParseDoc('xsd_not_declared_at_top_node').Free();
+end;
+
+procedure TTest_WsdlParser.xsd_not_declared_at_top_node_2();
+begin
+ ParseDoc('xsd_not_declared_at_top_node_2').Free();
+end;
+
function TTest_WsdlParser.LoadComplexType_Class_default_values() : TwstPasTreeContainer;
begin
Result := ParseDoc(x_complexType_class_default);
@@ -1936,7 +1948,7 @@ begin
Result := ParseDoc(x_complexType_class_properties_extended_metadata);
end;
-function TTest_WsdlParser.LoadComplexType_Class_properties_extended_metadata2: TwstPasTreeContainer;
+function TTest_WsdlParser.LoadComplexType_Class_properties_extended_metadata2(): TwstPasTreeContainer;
begin
Result := ParseDoc(x_complexType_class_properties_extended_metadata + '_2');
end;
diff --git a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
index 6e5821490..cc270e7c5 100644
--- a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
+++ b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
@@ -1,12 +1,12 @@
-
+
-
+
@@ -14,13 +14,14 @@
+
-
+
@@ -96,12 +97,12 @@
-
+
-
+
@@ -129,9 +130,10 @@
+
-
-
+
+
diff --git a/wst/trunk/ws_helper/parserutils.pas b/wst/trunk/ws_helper/parserutils.pas
index ecca5615a..5357d561f 100644
--- a/wst/trunk/ws_helper/parserutils.pas
+++ b/wst/trunk/ws_helper/parserutils.pas
@@ -33,6 +33,20 @@ type
const
sNEW_LINE = sLineBreak;
+type
+
+ { TQualifiedNameObjectFilter }
+
+ TQualifiedNameObjectFilter = class(TInterfacedObject,IObjectFilter)
+ private
+ FNameSpace : string;
+ FName : string;
+ protected
+ function Evaluate(const AObject : TObject) : Boolean;
+ public
+ constructor Create(const AName,ANameSpace : string);
+ end;
+
function IsStrEmpty(Const AStr : String):Boolean;
function ExtractIdentifier(const AValue : string) : string ;
{$IFDEF WST_HANDLE_DOC}
@@ -430,4 +444,45 @@ begin
end;
+{ TQualifiedNameObjectFilter }
+
+function TQualifiedNameObjectFilter.Evaluate(const AObject: TObject): Boolean;
+var
+ locObj : TDOMNodeRttiExposer;
+ startPos, i : PtrInt;
+ shortNameSpace : string;
+ locContinue : Boolean;
+ tmpNode : TDOMNode;
+begin
+ Result := False;
+ if ( AObject <> nil ) then begin
+ locObj := TDOMNodeRttiExposer(AObject);
+ i := Length(FName);
+ startPos := ( Length(locObj.NodeName) - i + 1 );
+ if ( startPos > 0 ) and ( FName = Copy(locObj.NodeName,startPos,i) ) then begin
+ if ( startPos = 1 ) then begin
+ shortNameSpace := 'xmlns';
+ locContinue := True;
+ end else begin
+ locContinue := ( startPos > 2 ) and ( locObj.NodeName[startPos-1] = ':' );
+ if locContinue then
+ shortNameSpace := 'xmlns:' + Copy(locObj.NodeName,1,( startPos - 2 ));
+ end;
+ if locContinue then begin
+ if ( locObj.InnerObject.Attributes <> nil ) then begin
+ tmpNode := locObj.InnerObject.Attributes.GetNamedItem(shortNameSpace);
+ if ( tmpNode <> nil ) and ( tmpNode.NodeValue = FNameSpace ) then
+ Result := True;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TQualifiedNameObjectFilter.Create(const AName, ANameSpace: string);
+begin
+ FName := AName;
+ FNameSpace := ANameSpace;;
+end;
+
end.
diff --git a/wst/trunk/ws_helper/ws_parser_imp.pas b/wst/trunk/ws_helper/ws_parser_imp.pas
index 0aa13c9d3..832b188be 100644
--- a/wst/trunk/ws_helper/ws_parser_imp.pas
+++ b/wst/trunk/ws_helper/ws_parser_imp.pas
@@ -19,7 +19,7 @@ uses
{$IFNDEF FPC}xmldom, wst_delphi_xml{$ELSE}DOM, wst_fpc_xml{$ENDIF},
cursor_intf, rtti_filters,
pastree, pascal_parser_intf, logger_intf,
- xsd_parser;
+ xsd_parser, wst_types;
type
diff --git a/wst/trunk/ws_helper/wsdl_parser.pas b/wst/trunk/ws_helper/wsdl_parser.pas
index b9352c8d5..9d6a299a4 100644
--- a/wst/trunk/ws_helper/wsdl_parser.pas
+++ b/wst/trunk/ws_helper/wsdl_parser.pas
@@ -1229,8 +1229,16 @@ begin
FSchemaCursor.Reset();
FSchemaCursor := CreateCursorOn(
FSchemaCursor,
- ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer)
+ TAggregatedFilter.Create(
+ ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer),
+ TQualifiedNameObjectFilter.Create(s_schema,s_xs),
+ fcOr
+ )
);
+ { FSchemaCursor := CreateCursorOn(
+ FSchemaCursor,
+ ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer)
+ );}
FSchemaCursor.Reset();
if FSchemaCursor.MoveNext() then begin
FSchemaCursor.Reset();