فهرست منبع

2005-12-26 Atsushi Enomoto <[email protected]>

        * XsdValidatingReader.cs : Fixed the bug that only the last
        * schema
          URL in a schemaLocation was processed. Patch by Vorobiev
Maksim.

        * XsdValidatingReaderTests.cs : test for multi URLs in
          schemaLocation. Test by Vorobiev Maskim.

        * multi-schemaLocation.xml,
          x-net-config-storage-factory-provider-schema.xsd,
          x-net-config-schema.xsd :
          test support files for XsdValidatingReaderTests
          .MultipleSchemaInSchemaLocation() by Vorobiev Maskim.


svn path=/trunk/mcs/; revision=54848
Atsushi Eno 20 سال پیش
والد
کامیت
bf5bf0e19f

+ 5 - 0
mcs/class/System.XML/Mono.Xml.Schema/ChangeLog

@@ -1,3 +1,8 @@
+2005-12-26  Atsushi Enomoto <[email protected]>
+
+	* XsdValidatingReader.cs : Fixed the bug that only the last schema
+	  URL in a schemaLocation was processed. Patch by Vorobiev Maksim.
+
 2005-12-12  Atsushi Enomoto <[email protected]>
 
 	* XsdValidatingReader.cs : it is not IXmlNamespaceResolver anymore.

+ 19 - 15
mcs/class/System.XML/Mono.Xml.Schema/XsdValidatingReader.cs

@@ -1487,28 +1487,32 @@ namespace Mono.Xml.Schema
 				if (tmp.Length % 2 != 0)
 					if (schemas.Count == 0)
 						HandleError ("Invalid schemaLocation attribute format.");
-				for (int i = 0; i < tmp.Length; i += 2) {
+				int i=0;
+				do {
 					try {
-						schema = ReadExternalSchema (tmp [i + 1]);
-					} catch (Exception) { // FIXME: (wishlist) It is bad manner ;-(
+						for (; i < tmp.Length; i += 2) {
+							schema = ReadExternalSchema (tmp [i + 1]);
+							if (schema.TargetNamespace == null)
+								schema.TargetNamespace = tmp [i];
+							else if (schema.TargetNamespace != tmp [i])
+								HandleError ("Specified schema has different target namespace.");
+							if (schema != null) {
+								if (!schemas.Contains (schema.TargetNamespace)) {
+									schemaAdded = true;
+									schemas.Add (schema);
+								}
+								schema = null;
+							}
+						}
+					} catch (Exception) {
 						if (!schemas.Contains (tmp [i]))
 							HandleError (String.Format ("Could not resolve schema location URI: {0}",
 								i + 1 < tmp.Length ? tmp [i + 1] : String.Empty), null, true);
+						i += 2;
 						continue;
 					}
-					if (schema.TargetNamespace == null)
-						schema.TargetNamespace = tmp [i];
-					else if (schema.TargetNamespace != tmp [i])
-						HandleError ("Specified schema has different target namespace.");
-				}
-			}
-			if (schema != null) {
-				if (!schemas.Contains (schema.TargetNamespace)) {
-					schemaAdded = true;
-					schemas.Add (schema);
-				}
+				} while (i < tmp.Length);
 			}
-			schema = null;
 			string noNsSchemaLocation = reader.GetAttribute ("noNamespaceSchemaLocation", XmlSchema.InstanceNamespace);
 			if (noNsSchemaLocation != null) {
 				try {

+ 5 - 0
mcs/class/System.XML/Test/System.Xml/ChangeLog

@@ -1,3 +1,8 @@
+2005-12-26  Atsushi Enomoto <[email protected]>
+
+	* XsdValidatingReaderTests.cs : test for multi URLs in
+	  schemaLocation. Test by Vorobiev Maskim.
+
 2005-12-26  Gert Driesen <[email protected]>
 
 	* XmlElementTests.cs: Fixed line endings.

+ 9 - 0
mcs/class/System.XML/Test/System.Xml/XsdValidatingReaderTests.cs

@@ -227,5 +227,14 @@ namespace MonoTests.System.Xml
 			vr.Read (); // bug
 			AssertEquals ("#4", "urn:a", vr.NamespaceURI);
 		}
+
+		[Test]
+		public void MultipleSchemaInSchemaLocation ()
+		{
+			XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/xsd/multi-schemaLocation.xml");
+			XmlValidatingReader vr = new XmlValidatingReader (xtr);
+			while (!vr.EOF)
+				vr.Read ();
+		}
 	}
 }

+ 42 - 42
mcs/class/System.XML/Test/XmlFiles/xsd/1.xsd

@@ -1,42 +1,42 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	xmlns="urn:bar"
-	targetNamespace="urn:bar"
->
-
-<xs:element name="Foo" type="xs:string" />
-<xs:element name="Bar" type="FugaType" />
-<xs:element name="Baz">
-	<xs:simpleType>
-		<xs:list itemType="xs:int" />
-	</xs:simpleType>
-</xs:element>
-
-<xs:element name="Blah">
-	<xs:complexType>
-		<xs:sequence>
-			<xs:element ref="Foo" />
-			<xs:element ref="Bar" />
-			<xs:element ref="Baz" />
-		</xs:sequence>
-	</xs:complexType>
-</xs:element>
-
-<xs:complexType name="FugaType">
-	<xs:complexContent>
-		<xs:extension base="HogeType">
-			<xs:sequence>
-				<xs:element name="Baz" type="xs:string" />
-			</xs:sequence>
-		</xs:extension>
-	</xs:complexContent>
-</xs:complexType>
-
-<xs:complexType name="HogeType">
-	<xs:sequence>
-		<xs:element ref="Foo" />
-		<xs:element ref="Bar" />
-	</xs:sequence>
-</xs:complexType>
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns="urn:bar"
+	targetNamespace="urn:bar"
+>
+
+<xs:element name="Foo" type="xs:string" />
+<xs:element name="Bar" type="FugaType" />
+<xs:element name="Baz">
+	<xs:simpleType>
+		<xs:list itemType="xs:int" />
+	</xs:simpleType>
+</xs:element>
+
+<xs:element name="Blah">
+	<xs:complexType>
+		<xs:sequence>
+			<xs:element ref="Foo" />
+			<xs:element ref="Bar" />
+			<xs:element ref="Baz" />
+		</xs:sequence>
+	</xs:complexType>
+</xs:element>
+
+<xs:complexType name="FugaType">
+	<xs:complexContent>
+		<xs:extension base="HogeType">
+			<xs:sequence>
+				<xs:element name="Baz" type="xs:string" />
+			</xs:sequence>
+		</xs:extension>
+	</xs:complexContent>
+</xs:complexType>
+
+<xs:complexType name="HogeType">
+	<xs:sequence>
+		<xs:element ref="Foo" />
+		<xs:element ref="Bar" />
+	</xs:sequence>
+</xs:complexType>
+
+</xs:schema>

+ 11 - 11
mcs/class/System.XML/Test/XmlFiles/xsd/2.xsd

@@ -1,11 +1,11 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	xmlns="urn:bar"
-	targetNamespace="urn:bar"
->
-
-<!-- just for flag deserialization -->
-<xs:element name="Foo" type="xs:string" block="extension" />
-<xs:element name="Bar" type="xs:string" block="extension restriction" />
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns="urn:bar"
+	targetNamespace="urn:bar"
+>
+
+<!-- just for flag deserialization -->
+<xs:element name="Foo" type="xs:string" block="extension" />
+<xs:element name="Bar" type="xs:string" block="extension restriction" />
+
+</xs:schema>

+ 11 - 11
mcs/class/System.XML/Test/XmlFiles/xsd/3.xsd

@@ -1,11 +1,11 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	xmlns="urn:bar"
-	targetNamespace="urn:foo"
->
-
-<xs:import schemaLocation="4.xsd" namespace="urn:bar" />
-<xs:element name="Foo" type="xs:string" />
-<xs:element name="Bar" type="xs:string" />
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns="urn:bar"
+	targetNamespace="urn:foo"
+>
+
+<xs:import schemaLocation="4.xsd" namespace="urn:bar" />
+<xs:element name="Foo" type="xs:string" />
+<xs:element name="Bar" type="xs:string" />
+
+</xs:schema>

+ 11 - 11
mcs/class/System.XML/Test/XmlFiles/xsd/4.xsd

@@ -1,11 +1,11 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	xmlns="urn:bar"
-	targetNamespace="urn:bar"
->
-
-<!-- to be included from 3.xsd -->
-<xs:element name="Foo" type="xs:int" />
-<xs:element name="Bar" type="xs:int" />
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns="urn:bar"
+	targetNamespace="urn:bar"
+>
+
+<!-- to be included from 3.xsd -->
+<xs:element name="Foo" type="xs:int" />
+<xs:element name="Bar" type="xs:int" />
+
+</xs:schema>

+ 14 - 14
mcs/class/System.XML/Test/XmlFiles/xsd/5.xsd

@@ -1,14 +1,14 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	targetNamespace="urn:bar"
->
-
-<xs:element name="Foo">
-	<xs:complexType>
-		<xs:sequence>
-			<xs:element name="Bar" form="unqualified" />
-		</xs:sequence>
-	</xs:complexType>
-</xs:element>
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="urn:bar"
+>
+
+<xs:element name="Foo">
+	<xs:complexType>
+		<xs:sequence>
+			<xs:element name="Bar" form="unqualified" />
+		</xs:sequence>
+	</xs:complexType>
+</xs:element>
+
+</xs:schema>

+ 15 - 15
mcs/class/System.XML/Test/XmlFiles/xsd/6.xsd

@@ -1,15 +1,15 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	targetNamespace="urn:bar"
-	elementFormDefault="unqualified"
->
-
-<xs:element name="Foo">
-	<xs:complexType>
-		<xs:sequence>
-			<xs:element name="Bar" form="qualified" />
-		</xs:sequence>
-	</xs:complexType>
-</xs:element>
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="urn:bar"
+	elementFormDefault="unqualified"
+>
+
+<xs:element name="Foo">
+	<xs:complexType>
+		<xs:sequence>
+			<xs:element name="Bar" form="qualified" />
+		</xs:sequence>
+	</xs:complexType>
+</xs:element>
+
+</xs:schema>

+ 8 - 0
mcs/class/System.XML/Test/XmlFiles/xsd/ChangeLog

@@ -1,3 +1,11 @@
+2005-12-26  Atsushi Enomoto <[email protected]>
+
+	* multi-schemaLocation.xml,
+	  x-net-config-storage-factory-provider-schema.xsd,
+	  x-net-config-schema.xsd :
+	  test support files for XsdValidatingReaderTests
+	  .MultipleSchemaInSchemaLocation() by Vorobiev Maskim.
+
 2004-01-03  Atsushi Enomoto <[email protected]>
 
 	* Added 2,3,4,5 and 6.xsd

+ 38 - 0
mcs/class/System.XML/Test/XmlFiles/xsd/multi-schemaLocation.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<xfw:configuration 
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:xfw="http://www.croc.ru/Schemas/XmlFramework/Core/Config/1.0" 
+	xmlns:xs="http://www.croc.ru/Schemas/XmlFramework/Core/Config/XStorageFactoryProvider/1.0" 
+
+	xsi:schemaLocation="
+		http://www.croc.ru/Schemas/XmlFramework/Core/Config/1.0 x-net-config-schema.xsd 
+		http://www.croc.ru/Schemas/XmlFramework/Core/Config/XStorageFactoryProvider/1.0 x-net-config-storage-factory-provider-schema.xsd
+	">
+	<xfw:core debug-mode="true"/>
+	<xfw:storage>
+		<xfw:connections 
+			storage-assembly="dgdfgfdg"
+			storage-class-name="dfgfdgdg"
+			>
+			<xfw:connection n="CommonConn" protected="1">
+				<xs:connection-string>
+					<xs:text>dfgdfg</xs:text>
+				</xs:connection-string>
+			</xfw:connection>
+			<xfw:connection n="ReadOnlyConn" protected="1">
+				<xs:connection-string>
+					<xs:text>dfgfgdfg</xs:text>
+				</xs:connection-string>
+			</xfw:connection>
+		</xfw:connections>
+	</xfw:storage>
+	<xfw:server-objects>
+		<xfw:file-name>fghfhfhg</xfw:file-name>
+	</xfw:server-objects>
+	<xfw:metadata>
+		<xfw:file-name>hfghfhg</xfw:file-name>
+	</xfw:metadata>
+	<AppData>
+		<AppVersion ver-major="1" ver-minor="0" build="0" /> 
+	</AppData>
+</xfw:configuration>

+ 115 - 0
mcs/class/System.XML/Test/XmlFiles/xsd/x-net-config-schema.xsd

@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--W3C Schema generated by XMLSPY v5 rel. 2 U (http://www.xmlspy.com)-->
+<xsd:schema 
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+	xmlns="http://www.croc.ru/Schemas/XmlFramework/Core/Config/1.0" 
+	targetNamespace="http://www.croc.ru/Schemas/XmlFramework/Core/Config/1.0" 
+	elementFormDefault="qualified" 
+	attributeFormDefault="unqualified"
+	version="1.0"
+>
+	<!-- ОПРЕДЕЛЕНИЕ КОРНЕВОГО ЭЛЕМЕНТА ФАЙЛА КОНФИГУРАЦИИ -->
+	<xsd:element name="configuration">
+		<xsd:complexType mixed="true">
+			<xsd:sequence>
+				<xsd:element name="core" minOccurs="0">
+					<xsd:complexType>
+						<xsd:attribute name="debug-mode" type="xsd:boolean"/>
+						<xsd:attribute name="protected" type="xsd:boolean"/>
+						<!--	
+							Определяет режим работы Ядра в отладочном режиме; допустимые  
+							значения "true" - Ядро работает в отладочном режиме, и "false" - 
+							отладочный режим блокируется. Задание значения не обязательно; 
+							по умолчанию используется "false".
+						-->
+						<!--  Содержание элемента может быть помечно как защищенное -->
+					</xsd:complexType>
+				</xsd:element>
+				<xsd:element name="storage" type="storageType"/>
+				<xsd:element name="server-objects">
+					<xsd:complexType>
+						<xsd:sequence>
+							<xsd:element name="file-name" type="xsd:string" maxOccurs="unbounded"/>
+						</xsd:sequence>
+						<xsd:attribute name="protected" type="xsd:boolean"/>
+						<!--  Содержание элемента может быть помечно как защищенное -->
+					</xsd:complexType>
+				</xsd:element>
+				<xsd:element name="metadata">
+					<xsd:complexType>
+						<xsd:sequence>
+							<xsd:element name="file-name" type="xsd:string" maxOccurs="unbounded"/>
+						</xsd:sequence>
+						<xsd:attribute name="protected" type="xsd:boolean"/>
+						<!--  Содержание элемента может быть помечно как защищенное -->
+					</xsd:complexType>
+				</xsd:element>
+				<xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				<!-- Определяет режим функционирования ядра -->
+				<!-- 	Элемент, задающий перечень используемых реализаций подсистемы Storage -->
+				<!-- 	(Его определение дано ниже) -->
+				<!-- 	Элемент, задающий файл описания прикладных элементов ядра -->
+				<!-- 	Элемент, задающий перечень файлов метаданных приложения -->
+			</xsd:sequence>
+			<xsd:attribute name="ver-major" type="xsd:int" default="1"/>
+			<xsd:attribute name="ver-minor" type="xsd:int" default="0"/>
+			<xsd:attribute name="build" type="xsd:int" default="1"/>
+			<xsd:attribute name="instance-guid" type="xsd:string"/>
+			<xsd:attribute name="protected" type="xsd:boolean"/>
+			<!-- 
+				В целом для приложения может быть задан номер версии, как триплет 
+				номеров Major.Minor.Build. Номер версии используется механизмами
+				автоматической инсталляции и обновления. 
+				Задание номера версии приложения не является обязательным.
+				-->
+			<!-- Номер версии (по умолчанию - 1) -->
+			<!-- Номер подверсии (по умолчанию - 0) -->
+			<!-- Номер сборки (приложения в целом, build; по умолчанию - 1) -->
+			<!-- 
+				Для конкретной инстанции конечного приложения может так же 
+				задаваться уникальный номер (UUID) инстанции; 
+			-->
+			<!--  Содержание элемента может быть помечно как защищенное -->
+		</xsd:complexType>
+	</xsd:element>
+	<!-- 
+		Элемент, задающий перечень используемых реализаций подсистемы Storage
+	-->
+	<xsd:complexType name="storageType">
+		<xsd:sequence>
+			<xsd:element name="connections" maxOccurs="unbounded">
+				<xsd:complexType>
+					<xsd:sequence>
+						<xsd:element name="connection" maxOccurs="unbounded">
+							<xsd:complexType>
+								<xsd:sequence>
+									<xsd:any namespace="##other" maxOccurs="unbounded"/>
+								</xsd:sequence>
+								<xsd:attribute name="n" type="xsd:NMTOKEN" use="required"/>
+								<xsd:attribute name="protected" type="xsd:boolean"/>
+							</xsd:complexType>
+						</xsd:element>
+						<!-- 
+							Элемент, задающий данные, используеме для инициализации соединения 
+							с СУБД - строку соединения. Определения именованы - используется
+							атрибут n
+						-->
+					</xsd:sequence>
+					<xsd:attribute name="storage-assembly" type="xsd:string" use="required"/>
+					<xsd:attribute name="storage-class-name" type="xsd:string" use="required"/>
+					<xsd:attribute name="protected" type="xsd:boolean"/>
+					<!-- Задает наименование файла сборки с реализацией Storage -->
+					<!-- Задает наименование .NET-типа - класса реализации Storage -->
+					<!--  Содержание элемента может быть помечно как защищенное -->
+				</xsd:complexType>
+				<xsd:unique name="uniqueConnectionName">
+					<xsd:selector xpath="connection"/>
+					<xsd:field xpath="@n"/>
+				</xsd:unique>
+			</xsd:element>
+			<!-- Перечень должен включать как минимум одно определение -->
+		</xsd:sequence>
+		<xsd:attribute name="protected" type="xsd:boolean"/>
+		<!--  Содержание элемента может быть помечно как защищенное -->
+	</xsd:complexType>
+</xsd:schema>

+ 76 - 0
mcs/class/System.XML/Test/XmlFiles/xsd/x-net-config-storage-factory-provider-schema.xsd

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema 
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+	xmlns:ns1="http://www.croc.ru/Schemas/XmlFramework/Core/Config/XStorageFactoryProvider/1.0" 
+	targetNamespace="http://www.croc.ru/Schemas/XmlFramework/Core/Config/XStorageFactoryProvider/1.0" 
+	elementFormDefault="qualified"
+>
+	<xsd:annotation>
+		<xsd:documentation>Схема для описания содержимого узла {x-net-config-schema.xsd}:connection, 
+	используемое стандартным провайдером фабрик XStorage (XStorageFactoryProvider)
+	</xsd:documentation>
+	</xsd:annotation>
+	<xsd:element name="connection-string">
+		<xsd:complexType mixed="true">
+			<xsd:sequence>
+				<xsd:element name="secret" minOccurs="0" maxOccurs="unbounded">
+					<xsd:annotation>
+						<xsd:documentation>Описание секрета</xsd:documentation>
+					</xsd:annotation>
+					<xsd:complexType>
+						<xsd:simpleContent>
+							<xsd:extension base="xsd:string">
+								<xsd:attribute name="n" type="xsd:string" use="required">
+									<xsd:annotation>
+										<xsd:documentation>Наименование секрета</xsd:documentation>
+									</xsd:annotation>
+								</xsd:attribute>
+							</xsd:extension>
+						</xsd:simpleContent>
+					</xsd:complexType>
+				</xsd:element>
+				<xsd:element name="text" type="xsd:string">
+					<xsd:annotation>
+						<xsd:documentation>Текст строки соединения. Может содержать ссылки на значения секретов в виде @ + наименование_секрета</xsd:documentation>
+					</xsd:annotation>
+				</xsd:element>
+			</xsd:sequence>
+		</xsd:complexType>
+		<xsd:unique name="uniqueSecret">
+			<xsd:annotation>
+				<xsd:documentation>Наименования секретов должны быть уникальны</xsd:documentation>
+			</xsd:annotation>
+			<xsd:selector xpath="secret"/>
+			<xsd:field xpath="@n"/>
+		</xsd:unique>
+	</xsd:element>
+	<xsd:element name="params">
+		<xsd:complexType>
+			<xsd:sequence>
+				<xsd:element name="param" maxOccurs="unbounded">
+					<xsd:annotation>
+						<xsd:documentation>Описание параметра XStorageConnection</xsd:documentation>
+					</xsd:annotation>
+					<xsd:complexType>
+						<xsd:simpleContent>
+							<xsd:extension base="xsd:string">
+								<xsd:attribute name="n" type="xsd:string" use="required">
+									<xsd:annotation>
+										<xsd:documentation>Наименование параметра</xsd:documentation>
+									</xsd:annotation>
+								</xsd:attribute>
+							</xsd:extension>
+						</xsd:simpleContent>
+					</xsd:complexType>
+				</xsd:element>
+			</xsd:sequence>
+		</xsd:complexType>
+		<xsd:unique name="uniqueParam">
+			<xsd:annotation>
+				<xsd:documentation>Наименование параметра должно быть уникальным</xsd:documentation>
+			</xsd:annotation>
+			<xsd:selector xpath="param"/>
+			<xsd:field xpath="@n"/>
+		</xsd:unique>
+	</xsd:element>
+</xsd:schema>

+ 26 - 26
mcs/class/System.XML/Test/XmlFiles/xsd/xml.xsd

@@ -1,26 +1,26 @@
-<xs:schema
-	xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	targetNamespace="http://www.w3.org/XML/1998/namespace"
-	attributeFormDefault="qualified"
->
-
-<xs:attribute name="lang" type="xs:language" />
-
-<xs:attribute name="space" default="preserve">
-	<xs:simpleType>
-		<xs:restriction base="xs:NCName">
-			<xs:enumeration value="default" />
-			<xs:enumeration value="preserve" />
-		</xs:restriction>
-	</xs:simpleType>
-</xs:attribute>
-
-<xs:attribute name="base" type="xs:anyURI" />
-
-<xs:attributeGroup name="specialAttrs">
-	<xs:attribute ref="xml:base" />
-	<xs:attribute ref="xml:lang" />
-	<xs:attribute ref="xml:space" />
-</xs:attributeGroup>
-
-</xs:schema>
+<xs:schema
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="http://www.w3.org/XML/1998/namespace"
+	attributeFormDefault="qualified"
+>
+
+<xs:attribute name="lang" type="xs:language" />
+
+<xs:attribute name="space" default="preserve">
+	<xs:simpleType>
+		<xs:restriction base="xs:NCName">
+			<xs:enumeration value="default" />
+			<xs:enumeration value="preserve" />
+		</xs:restriction>
+	</xs:simpleType>
+</xs:attribute>
+
+<xs:attribute name="base" type="xs:anyURI" />
+
+<xs:attributeGroup name="specialAttrs">
+	<xs:attribute ref="xml:base" />
+	<xs:attribute ref="xml:lang" />
+	<xs:attribute ref="xml:space" />
+</xs:attributeGroup>
+
+</xs:schema>