Skip to content

Commit c7c8758

Browse files
Kacper Stasikcebe
Kacper Stasik
authored andcommitted
basic redefine support
based on goetas-webservices#17 by @kstasik ported code to latest version/rebased on master. implements `<xsd:redefine ...>` https://www.w3.org/TR/xmlschema11-1/#modify-schema
1 parent 3f6526d commit c7c8758

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

src/SchemaReader.php

+25
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ function (
254254
case 'import':
255255
$callback = $this->loadImport($schema, $childNode);
256256
break;
257+
case 'redefine':
258+
$callback = $this->loadRedefine($schema, $childNode);
259+
break;
257260
case 'element':
258261
$callback = $this->loadElementDef($schema, $childNode);
259262
break;
@@ -1144,6 +1147,28 @@ private function loadImport(
11441147
return $this->loadImportFresh($namespace, $schema, $file);
11451148
}
11461149

1150+
private function loadRedefine(Schema $schema, DOMElement $node)
1151+
{
1152+
$base = urldecode($node->ownerDocument->documentURI);
1153+
$file = UrlUtils::resolveRelativeUrl($base, $node->getAttribute('schemaLocation'));
1154+
1155+
if (isset($this->loadedFiles[$file])) {
1156+
/* @var $redefined Schema */
1157+
$redefined = clone $this->loadedFiles[$file];
1158+
1159+
if($schema->getTargetNamespace() !== $redefined->getTargetNamespace()){
1160+
$redefined->setTargetNamespace($schema->getTargetNamespace());
1161+
}
1162+
1163+
$schema->addSchema($redefined);
1164+
1165+
return function (): void {
1166+
};
1167+
}
1168+
1169+
return $this->loadImportFresh($schema->getTargetNamespace(), $schema, $file);
1170+
}
1171+
11471172
private function createOrUseSchemaForNs(
11481173
Schema $schema,
11491174
string $namespace

tests/RedefineTest.php

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
namespace GoetasWebservices\XML\XSDReader\Tests;
3+
4+
class RedefineTest extends BaseTest
5+
{
6+
public function testBase()
7+
{
8+
$remoteSchema = $this->reader->readString(
9+
'
10+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
11+
<xs:complexType name="personName">
12+
<xs:sequence>
13+
<xs:element name="title" minOccurs="0"/>
14+
<xs:element name="forename" minOccurs="0" maxOccurs="unbounded"/>
15+
</xs:sequence>
16+
</xs:complexType>
17+
18+
<xs:element name="addressee" type="personName"/>
19+
</xs:schema>', 'http://www.example.com/xsd.xsd');
20+
21+
22+
$schema = $this->reader->readString(
23+
'
24+
<xs:schema targetNamespace="http://www.user.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ex="http://www.example.com">
25+
<xs:redefine schemaLocation="http://www.example.com/xsd.xsd">
26+
<xs:complexType name="personName">
27+
<xs:complexContent>
28+
<xs:extension base="personName">
29+
<xs:sequence>
30+
<xs:element name="generation" minOccurs="0"/>
31+
</xs:sequence>
32+
</xs:extension>
33+
</xs:complexContent>
34+
</xs:complexType>
35+
</xs:redefine>
36+
37+
<xs:element name="author" type="personName"/>
38+
</xs:schema>');
39+
40+
// check if schema is not included
41+
// we don't want to redefine original schema
42+
$this->assertNotContains($remoteSchema, $schema->getSchemas(), '', true);
43+
44+
/* @var $localAttr \GoetasWebservices\XML\XSDReader\Schema\Element\ElementDef */
45+
46+
// it should inherit namespace of main schema
47+
$localAttr = $schema->findElement("addressee", "http://www.user.com");
48+
$this->assertNotNull($localAttr);
49+
50+
// find author element
51+
$localAttr = $schema->findElement("author", "http://www.user.com");
52+
$this->assertNotNull($localAttr);
53+
54+
/* @var $type \GoetasWebservices\XML\XSDReader\Schema\Type\ComplexType */
55+
$type = $localAttr->getType();
56+
57+
$this->assertInstanceOf('\GoetasWebservices\XML\XSDReader\Schema\Type\ComplexType', $type);
58+
59+
$children = array();
60+
foreach($type->getElements() as $element){
61+
$children[] = $element->getName();
62+
}
63+
64+
$this->assertContains('generation', $children);
65+
}
66+
}

0 commit comments

Comments
 (0)