@@ -164,6 +164,9 @@ private function schemaNode(Schema $schema, DOMElement $node, Schema $parent = n
164164 case 'import ' :
165165 $ functions [] = $ this ->loadImport ($ schema , $ childNode );
166166 break ;
167+ case 'redefine ' :
168+ $ functions [] = $ this ->loadRedefine ($ schema , $ childNode );
169+ break ;
167170 case 'element ' :
168171 $ functions [] = $ this ->loadElementDef ($ schema , $ childNode );
169172 break ;
@@ -204,7 +207,7 @@ private function loadElement(Schema $schema, DOMElement $node)
204207
205208 $ xp = new \DOMXPath ($ node ->ownerDocument );
206209 $ xp ->registerNamespace ('xs ' , 'http://www.w3.org/2001/XMLSchema ' );
207-
210+
208211 if ($ xp ->query ('ancestor::xs:choice ' , $ node )->length ) {
209212 $ element ->setMin (0 );
210213 }
@@ -639,6 +642,41 @@ private function fillItem(Item $element, DOMElement $node)
639642 }
640643 }
641644
645+ private function loadRedefine (Schema $ schema , DOMElement $ node )
646+ {
647+ $ base = urldecode ($ node ->ownerDocument ->documentURI );
648+ $ file = UrlUtils::resolveRelativeUrl ($ base , $ node ->getAttribute ("schemaLocation " ));
649+
650+ if (isset ($ this ->loadedFiles [$ file ])) {
651+ /* @var $redefined Schema */
652+ $ redefined = clone $ this ->loadedFiles [$ file ];
653+
654+ if ($ schema ->getTargetNamespace () != $ redefined ->getTargetNamespace ()){
655+ $ redefined ->setTargetNamespace ($ schema ->getTargetNamespace ());
656+ }
657+
658+ $ schema ->addSchema ($ redefined );
659+
660+ $ callbacks = $ this ->schemaNode ($ redefined , $ node , $ schema );
661+ }
662+ else {
663+ $ redefined = new Schema ();
664+ $ redefined ->addSchema ($ this ->getGlobalSchema ());
665+
666+ $ xml = $ this ->getDOM (isset ($ this ->knownLocationSchemas [$ file ]) ? $ this ->knownLocationSchemas [$ file ] : $ file );
667+
668+ $ callbacks = $ this ->schemaNode ($ redefined , $ xml ->documentElement , $ schema );
669+
670+ $ schema ->addSchema ($ redefined );
671+ }
672+
673+ return function () use ($ callbacks ) {
674+ foreach ($ callbacks as $ callback ) {
675+ call_user_func ($ callback );
676+ }
677+ };
678+ }
679+
642680 private function loadImport (Schema $ schema , DOMElement $ node )
643681 {
644682 $ base = urldecode ($ node ->ownerDocument ->documentURI );
@@ -722,7 +760,7 @@ public function getGlobalSchema()
722760 /**
723761 * @param DOMNode $node
724762 * @param string $file
725- *
763+ *
726764 * @return Schema
727765 */
728766 public function readNode (DOMNode $ node , $ file = 'schema.xsd ' )
0 commit comments