@@ -164,6 +164,9 @@ private function schemaNode(Schema $schema, DOMElement $node, Schema $parent = n
164
164
case 'import ' :
165
165
$ functions [] = $ this ->loadImport ($ schema , $ childNode );
166
166
break ;
167
+ case 'redefine ' :
168
+ $ functions [] = $ this ->loadRedefine ($ schema , $ childNode );
169
+ break ;
167
170
case 'element ' :
168
171
$ functions [] = $ this ->loadElementDef ($ schema , $ childNode );
169
172
break ;
@@ -204,7 +207,7 @@ private function loadElement(Schema $schema, DOMElement $node)
204
207
205
208
$ xp = new \DOMXPath ($ node ->ownerDocument );
206
209
$ xp ->registerNamespace ('xs ' , 'http://www.w3.org/2001/XMLSchema ' );
207
-
210
+
208
211
if ($ xp ->query ('ancestor::xs:choice ' , $ node )->length ) {
209
212
$ element ->setMin (0 );
210
213
}
@@ -639,6 +642,41 @@ private function fillItem(Item $element, DOMElement $node)
639
642
}
640
643
}
641
644
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
+
642
680
private function loadImport (Schema $ schema , DOMElement $ node )
643
681
{
644
682
$ base = urldecode ($ node ->ownerDocument ->documentURI );
@@ -722,7 +760,7 @@ public function getGlobalSchema()
722
760
/**
723
761
* @param DOMNode $node
724
762
* @param string $file
725
- *
763
+ *
726
764
* @return Schema
727
765
*/
728
766
public function readNode (DOMNode $ node , $ file = 'schema.xsd ' )
0 commit comments