Files
1/xsd/wpkg.xsd
Шершнев Игорь Александрович 350ea7e6c6 first commit
2022-05-25 16:54:13 +03:00

715 lines
25 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.wpkg.org/wpkg"
elementFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.wpkg.org/wpkg">
<xsd:annotation>
<xsd:documentation>XML Schema Definition for WPKG packages. The root element (packages) contains all packages.
There might be multiple XML files of this type put to the packages/ sub-directory where WPKG is installed.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType name="check">
<xsd:annotation>
<xsd:documentation>Generic check definition - used for compatibility. Does not verify correct
combination of attributes for all kind of checks. If you would like to verify
the attributes in more detail please specify the xsi:type='checkFile'
attribute where 'checkFile' can be replaced with any more-specific check type
of check*.
Valid types include:
- checkFile
- checkRegistry
- checkExecute
- checkUninstall
- checkLogical</xsd:documentation>
</xsd:annotation>
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:sequence maxOccurs="unbounded" minOccurs="0">
<xsd:element name="check" type="check">
<xsd:annotation>
<xsd:documentation>Checks can be nested. Use logical checks to group checks with logical conditions.</xsd:documentation>
</xsd:annotation></xsd:element>
</xsd:sequence>
<xsd:sequence maxOccurs="1" minOccurs="0">
<xsd:element name="condition" type="condition">
<xsd:annotation>
<xsd:documentation>Specify a condition under which this check applies. If the condition does not
apply then the check is ignored (exactly as if it would not have been
specifyed at all).
For example you might add a condition to check for specific OS version. So the
check will only be applied if the OS version matches the condition.</xsd:documentation>
</xsd:annotation></xsd:element>
</xsd:sequence>
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Type of check, valid values are: - file - registry -
uninstall - execute - logical
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required"
type="xsd:string">
<xsd:annotation>
<xsd:documentation>Check condition. Valid values are:
- equals
- exists
- sizeequals
- versionsmallerthan
- versionlessorequal
- versionequalto
- versiongreaterorequal
- versiongreaterthan
- datemodifyequalto
- datemodifynewerthan
- datemodfyolderthan
- datecreateequalto
- datecreatenewerthan
- datecreateolderthan
- dateaccessequalto
- dateaccessnewerthan
- dateaccessolderthan
- exitcodesmallerthan
- exitcodelessorequal
- exitcodeequalto
- exitcodegreaterorequal
- exitcodegreaterthan
- not
- and
- or
- atleast
- atmost
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="path" type="xsd:string" use="optional"
default="%SystemRoot%\explorer.exe">
<xsd:annotation>
<xsd:documentation>Path to be used for checks (registry path, file path).
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="optional"
default="1.0">
<xsd:annotation>
<xsd:documentation>A value is required for some check conditions like
VERSION, SIZE or EQUALS checks.
Note for registry equals checks: The value should
contain a string representing the data within the
registry value. In case the value is a DWORD just
enter a numeric string. The values will be compared
in their string representation (DWORD converted to
String). In case you compare to a REG_MULTI_SZ value
all data fields will be concatenated to a single
string separated by newline characters.
Example:
REG_MULTI_SZ='a
b
c'
value='a
b
c' will match.
REG_BINARY values will be converted to multiline
string as well. Each octett of the binary value is
converted to its decimal representation.
REG_BINARY= '11 22 33 44'
value = '17 34 51 68' will match.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attributeGroup ref="HostMatch"></xsd:attributeGroup>
</xsd:complexType>
<xsd:complexType name="checkFile">
<xsd:annotation>
<xsd:documentation>Check type for file specific tests.
</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" use="required" fixed="file" type="xsd:string">
<xsd:annotation>
<xsd:documentation>File checks need to specify 'file' as the TYPE of check.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>Specify what should be tested on the file specified within the 'path' property.
- exists: Check for file existence.
- sizeequals: Check for file size (exact size in Bytes specified within the
'value' attribute.
- version*: Compare file version to version specified within the 'value'
attribute.
- date*: Compare file date to date specified within the 'value' attribute.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="exists"></xsd:enumeration>
<xsd:enumeration value="sizeequals"></xsd:enumeration>
<xsd:enumeration
value="versionsmallerthan">
</xsd:enumeration>
<xsd:enumeration
value="versionlessorequal">
</xsd:enumeration>
<xsd:enumeration value="versionequalto"></xsd:enumeration>
<xsd:enumeration
value="versiongreaterorequal">
</xsd:enumeration>
<xsd:enumeration
value="versiongreaterthan">
</xsd:enumeration>
<xsd:enumeration
value="datemodifyequalto">
</xsd:enumeration>
<xsd:enumeration
value="datemodifynewerthan">
</xsd:enumeration>
<xsd:enumeration
value="datemodifyolderthan">
</xsd:enumeration>
<xsd:enumeration
value="datecreateequalto">
</xsd:enumeration>
<xsd:enumeration
value="datecreatenewerthan">
</xsd:enumeration>
<xsd:enumeration
value="datecreateolderthan">
</xsd:enumeration>
<xsd:enumeration
value="dateaccessequalto">
</xsd:enumeration>
<xsd:enumeration
value="dateaccessnewerthan">
</xsd:enumeration>
<xsd:enumeration
value="dateaccessolderthan">
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="path" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Path to the file to be checked. You might use
environment variables as well:
'C:\Windows\explorer.exe'
'%TEMP%\somefile.txt'
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation>
This value is optional only for existence check. For all other checks it it is
required.
The value should have the following format:
- for 'exists' condition:
For the 'exists' condition the value attribute is not evaluated. Exists just
checks for existence of the file referred within the 'path' attribute.
- for 'sizeequals' condition:
The 'value' attribute has to tontain the file size (in bytes).
- for 'version*' condition:
The value has to contain a version string which can be compared against the file
version. Some examples for valid version comparisons:
A B Result
'1' '2' B is newer
'1' '15' B is newer
'1.0' '1.2.b' B is newer
'1.35' '1.35-2' B is newer
'1.35-2' '1.36' B is newer
'1.35R3' '1.36' B is newer
'1' '1.0.00.0000' Versions are equal
'1' '1.0' Versions are equal
'1.35' '1.35-2' B is newer
'1.35-2' '1.35' A is newer
'1.35R3' '1.36R4' B is newer
'1.35-2' '1.35-2.0' Versions are equal
'1.35.1' '1.35.1.0' Versions are equal
'1.3RC2' '1.3' B is newer (special case where A is an 'RC' version)
'1.5' '1.5I3656' A is newer (B is an 'I'/integration version)
'1.5' '1.5M3656' A is newer (B is an 'M'/milestone version)
'1.5' '1.5u3656' B is newer (B is an update version)
- for 'date*' condition:
This value allwos to do comparison to file creation, modification and access
timestamps.
The 'value' attribute has to contain a string in the following format:
Relative timestamp (in minutes):
-100 Means the file timestamp is compared to the timestamp 100 minutes ago.
+50 Means the file timestamp is compared to the timestamp 50 minutes in
the future.
Absolute timestamp in ISO 8601 format:
'2007-11-23 22:00' (22:00 local time)
'2007-11-23T22:00' (Both, 'T' and space delimiter are allowed)
'2007-11-23 22:00:00' (specifies seconds which default to 0 above)
'2007-11-23 22:00:00.000' (specifies milliseconds which default to 0)
It is allowed to specify the timezone as well:
'2007-11-23 22:00+01:00' (22:00 CET)
'2007-11-23 21:00Z' (21:00 UTC/GMT = 22:00 CET)
'2007-11-23 22:00+00:00' (21:00 UTC/GMT = 22:00 CET)
File-Comparison:
Prefix your value with the '@' character in order to point to a file to which
the timestamp of the file referred in path is compared.
Examples:
@%SystemRoot%\explorer.exe
@c:\myfile.txt
Special terms:
last-week Check afainst timestamp of exactly one week ago (7 days).
last-month Check afainst timestamp of exactly one month ago (30 days).
last-year Check afainst timestamp of exactly one year ago (365 days).
yesterday Check afainst timestamp of yesterday (24 hours ago).
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="checkRegistry">
<xsd:annotation>
<xsd:documentation>Use this type to specify a check for registry values.
</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" use="required" fixed="registry" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Registry checks need to specify 'registry' as the the TYPE of check.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>exist: Check for existence of the key/value supplied within the 'path'
attribute.
equals: Check if the specified value contains the data entered within the
'value' attribute.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="exists"></xsd:enumeration>
<xsd:enumeration value="equals"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="path" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Enter registry path to a key which you like to check. Valid examples:
'HKLM\Software'
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation>Data to check te specified registry value against. NOTE: This attribute is
optional only for registry existence checks. It is REQUIRED if you use equal
checks.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="checkUninstall">
<xsd:annotation>
<xsd:documentation>Use this type to specify a check for uninstall entries
(Control Panel, Add/Remove programs).
</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" fixed="uninstall" use="required" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Uninstall checks need to specify 'uninstall' as the the TYPE of check.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>- exist: Check if an uninstall entry equal to the value within the 'value'
attribute exists (see Control Pane, Add/Remove software)
version*:
Compares the uninstall entry version to the value within the 'value' attribute.
NOTE: This only works if the application specifies a 'DisplayVersion' value
within the Windows registry.
Valid values:
- versionsmallerthan
- versionlessorequal
- versionequalto
- versiongreaterorequal
- versiongreaterthan
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="exists"></xsd:enumeration>
<xsd:enumeration value="versionsmallerthan">
</xsd:enumeration>
<xsd:enumeration value="versionlessorequal">
</xsd:enumeration>
<xsd:enumeration value="versionequalto"></xsd:enumeration>
<xsd:enumeration value="versiongreaterorequal">
</xsd:enumeration>
<xsd:enumeration value="versiongreaterthan">
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="path" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Name of the uninstall entry as it appears
within Control Panel, Add/Remove software.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation>Specifies a version if any of the version* checks are used.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="checkExecute">
<xsd:annotation>
<xsd:documentation>Use this type of check to execute a script. Its exit code can be evaluated by rules then.</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" use="required" fixed="execute" type="xsd:string">
<xsd:annotation>
<xsd:documentation> Execute checks need to specify 'execute' here.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>Verify the exit code of the script executed. Please specify the exit code to
compare to within the 'value' attribute. Valid values:
exitcodesmallerthan: true in case the script exit code is numerically less
than the value specified
exitcodelessorequal: true in case the script exit code is numerically less
or equal than the value specified
exitcodeequalto: true in case the script exit code is numerically equal to
the value specified
exitcodegreaterorequal: true in case the script exit code is numerically
greater or equal to the value specified
exitcodegreaterthan: true in case the script exit code is numerically larger
than the value specified</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="exitcodesmallerthan">
</xsd:enumeration>
<xsd:enumeration value="exitcodelessorequal">
</xsd:enumeration>
<xsd:enumeration value="exitcodeequalto"></xsd:enumeration>
<xsd:enumeration value="exitcodegreaterorequal">
</xsd:enumeration>
<xsd:enumeration value="exitcodegreaterthan">
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="path" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>
Path to the script to be executed.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>
Value used in exit code comparison.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="checkLogical">
<xsd:annotation>
<xsd:documentation>Use this check for logical chaining of other checks.</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" use="required"
fixed="logical" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Type of check has to be set to 'logical' for logical checks.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>Check condition:
not: Requires exactly one single sub-element of type 'check' whose exit code
boolean value is inverted.
and: Returns false immediately if one of the contained checks returns
false. Only evaluates true in case ALL checks contained evaluate true.
or: Returns true immediately as soon as one of the checks return true. Only
evaluates false if ALL checks contained evaluate false.
atleast: Returns true only if at least the specified amount of checks
contained return true. For example if you specify 5 checks and the value for
'atleast' is set to 3 then it returns true as soon as 3 checks out of 5
evaluated true.
atmost: Returns true if maximum the specified amount of checks return true.
For example if you specify 5 checks and the value for 'atmost' is set to 3 it
will return true only if no more than 3 checks evaluate true.</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="not"></xsd:enumeration>
<xsd:enumeration value="and"></xsd:enumeration>
<xsd:enumeration value="or"></xsd:enumeration>
<xsd:enumeration value="atleast"></xsd:enumeration>
<xsd:enumeration value="atmost"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string"
use="optional">
<xsd:annotation>
<xsd:documentation>Number of checks required for 'atleast' and 'atmost' checks. Unused for all other conditions.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="variable">
<xsd:sequence maxOccurs="1" minOccurs="0">
<xsd:element name="condition" type="condition"></xsd:element>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Variable name.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Variable value.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attributeGroup ref="HostMatch"></xsd:attributeGroup>
</xsd:complexType>
<xsd:complexType name="condition">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="check" type="check"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="packageReference">
<xsd:annotation>
<xsd:documentation>Reference to a package.</xsd:documentation>
</xsd:annotation>
<xsd:sequence maxOccurs="1" minOccurs="0">
<xsd:element name="condition" type="condition">
<xsd:annotation>
<xsd:documentation>Specifies a condition under which the package reference is taken into account.
If the condition is not met, then the package reference is ignored.</xsd:documentation>
</xsd:annotation></xsd:element>
</xsd:sequence>
<xsd:attribute name="package-id" type="xsd:string"
use="required">
<xsd:annotation>
<xsd:documentation>Equal to the ID attribute of any existing package.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attributeGroup ref="HostMatch"></xsd:attributeGroup>
</xsd:complexType>
<xsd:attributeGroup name="HostMatch">
<xsd:attribute name="hostname" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Regular expression which matches host name.
If hostname attribute is specified then this node is only applied if
the host name is matched by the specified attribute regular
expression.</xsd:documentation></xsd:annotation></xsd:attribute>
<xsd:attribute name="os" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Regular expression which matches host operating
system. e.g. 'microsoft windows 7 professional' Host
OS description string will have the following
format:
'[OS-caption], [OS-description],[CSD-version], [OS-version]'
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="ipaddresses" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Regular expression matching machine IP address. Any
IP address of the host (if it has multiple) will
have to match this expression. e.g.
^192\.168\.1\..*
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="domainname" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Regular expression matching domain name of the host.
e.g.
^domain$
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="groups" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Regular expression matching group membership of
host. At least one group has to match the regular
expression. e.g.
^group.*$
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="architecture">
<xsd:annotation>
<xsd:documentation>Regular expression matching the host architecture.
Currently the following architecture are supported:
x86: 32-bit Windows operating system running on x86 instruction set
x64: 64-bit Windows operating system running on x86-64 instruction set
ia64: 64-bit Windows operating system running on IA64 instruction set
Note: Note: You will have to match x86 also if you
run Windows 32-bit on AMD64/EMT64/x64 hardware.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="x86"></xsd:enumeration>
<xsd:enumeration value="x64"></xsd:enumeration>
<xsd:enumeration value="ia64"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="environment" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Define environment variables which have to match in
order to match the host. Environment variables need
to be specified in the following format:
environment='variable1=^regexp$|variable2=regexp...'
Please note that regular expressions are matched
case-insensitive and multiple variables have to be
separated by the pipe ('|') character. Please also
note that in case you use WPKG-client the
system-user environment might differ from the
environment you see when opening a command prompt
and typing 'set'. Some variables might be missing
and others might have different content. So use with
caution.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="lcid" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Comma-separated list of LCID values to be matched
against executing host (LCID seetting of executing
user locale). A full list of LCIDs might be found at:
http://www.microsoft.com/globaldev/reference/lcid-all.mspx
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="lcidOS" type="xsd:string">
<xsd:annotation>
<xsd:documentation>Comma-separated list of LCID values to be matched
against executing host (LCID setting of Windows
install language). A full list of LCIDs might be
found at:
http://www.microsoft.com/globaldev/reference/lcid-all.mspx
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:attributeGroup>
<xsd:complexType name="checkHost">
<xsd:annotation>
<xsd:documentation>
Use this type to specify a check for host attributes.
</xsd:documentation>
</xsd:annotation>
<xsd:complexContent>
<xsd:restriction base="check">
<xsd:attribute name="type" type="xsd:string" fixed="host" use="required">
<xsd:annotation>
<xsd:documentation>
Type of check. Set this tho "host" for host
type checks.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="condition" use="required">
<xsd:annotation>
<xsd:documentation>
Set condition for host check.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="hostname"></xsd:enumeration>
<xsd:enumeration value="architecture"></xsd:enumeration>
<xsd:enumeration value="os"></xsd:enumeration>
<xsd:enumeration value="ipaddresses"></xsd:enumeration>
<xsd:enumeration value="domainname"></xsd:enumeration>
<xsd:enumeration value="groups"></xsd:enumeration>
<xsd:enumeration value="lcid"></xsd:enumeration>
<xsd:enumeration value="lcidOS"></xsd:enumeration>
<xsd:enumeration value="environment"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="value" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>Regular expression to match the condition.</xsd:documentation>
</xsd:annotation></xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>