Jump to: navigation, search

COSMOS SDD Tooling BTG Data Type Comparisons

Revision as of 09:18, 12 August 2008 by Josh.hester.sas.com (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Contents

Preface

This document will describe the way in which the aggregator will work. Upon reading in SDD snippets to merge, the aggregator will start at the top level of either the DeploymentDescriptorType or the PackageDescriptorType. As we start our comparisons, we will look to this chart for what we will compare for each type. We will then traverse down through the sdd as we make our way through the chart, comparing in each type what we have marked with compare in the chart. If this comparison is not a simple type, we will call its type's comparing function, and this will continue until we can determine if the upper level type can be merged, at which point it will be added to our new aggregate sdd.

The work will be broken down into a class for each type, along with a class to read in the sdd snippets and to start the process. The type classes will contain functions for comparing and merging that type.

Common Schema Elements

DescriptorInfoGroup

<xsd:attributeGroup name="DescriptorInfoGroup">
  <xsd:attribute name="schemaVersion" type="xsd:string" fixed="1.0" use="required"/>
  <xsd:attribute name="descriptorID" type="sdd-common:UUIDType" use="required"/>
  <xsd:attribute name="lastModified" type="xsd:dateTime" use="required"/>
  <xsd:attribute name="descriptorLanguageBundle" type="xsd:token" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:attributeGroup>
Type Element Attribute Data Type Compare?
DescriptorInfoGroup
schemaVersion xsd:string Throw Away
descriptorID <UUIDType> Throw Away
lastModified xsd:dateTime Throw Away
descriptorLanguageBundle xsd:token Merge
any namespace="##other"  ?

Notes:
DescriptorInfoGroup is always merged.

<DisplayTextType>

<xsd:complexType name="DisplayTextType">
  <xsd:simpleContent>
    <xsd:extension base="xsd:string">
      <xsd:attribute name="translationKey" type="xsd:NCName" use="optional"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<DisplayTextType> Extension Of: xsd:string Yes
translationKey xsd:NCName Merge

Notes:
DisplayTextType is always merged. When xsd:strings are equal, the merging algorithm must resolve translationKey and choose one of the translations to use.

<VersionType>

<xsd:simpleType name="VersionType">
  <xsd:restriction base="xsd:string"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<VersionType> xsd:string Yes

<FixIdentityType>

<xsd:complexType name="FixIdentityType">
  <xsd:sequence>
    <xsd:element name="Name" type="xsd:NMTOKEN"/>
    <xsd:element name="Description" type="sdd-common:DisplayTextType"/>
    <xsd:element name="ShortDescription" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:element name="Symptom" type="sdd-common:DisplayTextType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<FixIdentityType>
Name xsd:NMTOKEN Yes
Description <DisplayTextType> Merge
ShortDescription <DisplayTextType> Merge
Symptom <DisplayTextType> Merge
any namespace="##other"  ?

<MaintenanceInformationType>

<xsd:complexType name="MaintenanceInformationType">
  <xsd:sequence>
    <xsd:element name="Severity" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:element name="Category" type="sdd-common:DisplayTextType" minOccurs="0" maxOccurs="unbounded"/>	
    <xsd:element name="Fix" type="sdd-common:FixIdentityType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Supersedes" type="sdd-common:MaintenanceInformationType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<MaintenanceInformationType>
Severity <DisplayTextType> Merge
Category <DisplayTextType> Merge
Fix <FixIdentityType> Yes
Supersedes <MaintenanceInformationType> Merge
any namespace="##other"  ?

Notes:
In a MaintenanceInformationType, all Categories apply to all Fixes. When merging two or more instances, it's important to only keep information that is true for all inputs. So, all fixes are kept and as many categories as apply to all fixes are kept.

For example, if MI one contains category FUNCTION and fix A, MI two contains categories FUNCTION, PERFORMANCE and fixes B,C and MI three contains category PERFORMANCE and fix D - the merged MI could contain no categories and fixes A,B,C,D.

Another case is when MI one contains category FUNCTION and fix A and MI two contains categories FUNCTION,PERFORMANCE and fixes B,C. Then the merged MI would contain category FUNCTION and fixes A,B,C.

<BuildInformationType>

<xsd:complexType name="BuildInformationType">
  <xsd:attribute name="buildID" type="xsd:token" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BuildInformationType>
buildID xsd:token Merge
any namespace="##other"  ?

Notes:
If a buildID comes from a build system plugin, that buildID should be kept.

<LocationType>

<xsd:complexType name="LocationType">
  <xsd:sequence>
    <xsd:element name="Address" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:element name="Country" type="sdd-common:DisplayTextType" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<LocationType>
Address <DisplayTextType> Merge
Country <DisplayTextType> Merge

<ManufacturerType>

<xsd:complexType name="ManufacturerType">
  <xsd:sequence>
    <xsd:element name="Name" type="sdd-common:DisplayTextType"/>
    <xsd:element name="Location" type="sdd-common:LocationType" minOccurs="0"/>
    <xsd:element name="ContactInformation" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ManufacturerType>
Name <DisplayTextType> Yes
Location <LocationType> Merge
ContactInformation <DisplayTextType> Merge
any namespace="##other"  ?

<IdentityType>

<xsd:complexType name="IdentityType">
  <xsd:sequence>
    <xsd:element name="Description" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:element name="ShortDescription" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-common:DisplayTextType" minOccurs="0" />
    <xsd:element name="Version" type="sdd-common:VersionType" minOccurs="0"/>
    <xsd:element name="MaintenanceInformation" type="sdd-common:MaintenanceInformationType" minOccurs="0"/>
    <xsd:element name="BuildInformation" type="sdd-common:BuildInformationType" minOccurs="0"/>
    <xsd:element name="Manufacturer" type="sdd-common:ManufacturerType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="softwareID" type="xsd:string" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<IdentityType>
softwareID xsd:string Yes
any namespace="##other"  ?
Description <DisplayTextType> Merge
ShortDescription <DisplayTextType> Merge
Name <DisplayTextType> Merge
Version <VersionType> Merge
MaintenanceInformation <MaintenanceInformationType> Merge
BuildInformation <BuildInformationType> Merge
Manufacturer <ManufacturerType> Merge
any namespace="##other"  ?

<UUIDType>

<xsd:simpleType name="UUIDType">
  <xsd:restriction base="xsd:hexBinary">
    <xsd:length value="16"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<UUIDType> xsd:hexBinary Yes

Package Descriptor Schema Elements

DigestInfoGroup

<xsd:group name="DigestInfoGroup">
  <xsd:sequence>
    <xsd:element ref="ds:DigestMethod"/>
    <xsd:element ref="ds:DigestValue"/>
  </xsd:sequence>
</xsd:group>
Type Element Attribute Data Type Compare?
DigestInfoGroup
DigestMethod <DigestMethodType> Yes
DigestValue <DigestValueType> Yes

<SDDContentPurposeType>

<xsd:simpleType name="SDDContentPurposeType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="readMe"/>
    <xsd:enumeration value="endUserLicenseAgreement"/>
    <xsd:enumeration value="responseFile"/>
    <xsd:enumeration value="deploymentDescriptor"/>
    <xsd:enumeration value="packageDescriptor"/>	
    <xsd:enumeration value="descriptorLanguageBundle"/>	
    <xsd:enumeration value="content"/>	
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<SDDContentPurposeType> xsd:NCName Yes

<ContentPurposeType>

<xsd:simpleType name="ContentPurposeType">
  <xsd:union memberTypes="sdd-pd:SDDContentPurposeType xsd:NCName"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<ContentPurposeType> Union Of: <SDDContentPurposeType> + xsd:NCName Yes

<ContentType>

<xsd:complexType name="ContentType">
  <xsd:sequence>
    <xsd:group ref="sdd-pd:DigestInfoGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="pathname" type="xsd:anyURI" use="required"/>
  <xsd:attribute name="purpose" type="sdd-pd:ContentPurposeType" default="content" use="optional"/>
  <xsd:attribute name="charEncoding" type="xsd:string" use="optional"/>
  <xsd:attribute name="length" type="xsd:nonNegativeInteger" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ContentType>
DigestInfoGroup DigestInfoGroup No
id xsd:ID Throw Away
pathname xsd:anyURI Yes
purpose <ContentPurposeType> Merge
charEncoding xsd:string No
length xsd:nonNegativeInteger No
any namespace="##other"  ?

Notes:
If there are two matching pathnames, log a message to the user that the correct file needs to be chosen via a custom rule in order for DigestInfoGroup, charEncoding and length to be valid. The default rule will simply pick one, but it must pick DigestInfoGroup, charEncoding and length together as a set from one of the inputs.

<ContentsType>

<xsd:complexType name="ContentsType">
  <xsd:sequence>
    <xsd:element name="Content" type="sdd-pd:ContentType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ContentsType>
Content <ContentType> Merge

<SDDPackageTypeType>

<xsd:simpleType name="SDDPackageTypeType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="baseInstall"/>
    <xsd:enumeration value="baseUninstall"/>
    <xsd:enumeration value="configuration"/>
    <xsd:enumeration value="maintenance"/>
    <xsd:enumeration value="modification"/>
    <xsd:enumeration value="replacement"/>
    <xsd:enumeration value="localization"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<SDDPackageTypeType> xsd:NCName Yes

<ExtensiblePackageTypeType>

<xsd:simpleType name="ExtensiblePackageTypeType">
  <xsd:union memberTypes="sdd-pd:SDDPackageTypeType xsd:NCName"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<ExtensiblePackageTypeType> Union Of: <SDDPackageTypeType> + xsd:NCName Yes

<PackageTypeType>

<xsd:simpleType name="PackageTypeType">
  <xsd:list itemType="sdd-pd:ExtensiblePackageTypeType"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<PackageTypeType> List Of: <ExtensiblePackageTypeType> Merge

<PackageIdentityType>

<xsd:complexType name="PackageIdentityType">
  <xsd:complexContent>
    <xsd:extension base="sdd-common:IdentityType">
      <xsd:attribute name="packageType" type="sdd-pd:PackageTypeType" default="baseInstall" use="optional"/>
      <xsd:attribute name="contentType" type="xsd:QName" use="optional"/>
      <xsd:attribute name="label" type="xsd:NCName" use="optional"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PackageIdentityType> Extension Of: <IdentityType> Merge
packageType <PackageTypeType> Merge
contentType xsd:QName Merge
label xsd:NCName Merge

<PackageDescriptorType>

<xsd:complexType name="PackageDescriptorType">
  <xsd:sequence>			
    <xsd:element name="PackageIdentity" type="sdd-pd:PackageIdentityType"/>
    <xsd:element name="Contents" type="sdd-pd:ContentsType"/>
    <xsd:element ref="ds:Signature" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attributeGroup ref="sdd-common:DescriptorInfoGroup"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PackageDescriptorType>
DescriptorInfoGroup DescriptorInfoGroup Merge
PackageIdentity <PackageIdentityType> Merge
Contents <ContentsType> Merge
Signature <SignatureType> Merge

Deployment Descriptor Schema Elements CL1 and CL2

DescriptionGroup

<xsd:group name="DescriptionGroup">
  <xsd:sequence>
    <xsd:element name="Description" type="sdd-common:DisplayTextType"/>
    <xsd:element name="ShortDescription" type="sdd-common:DisplayTextType" minOccurs="0"/>
  </xsd:sequence>
</xsd:group>
Type Element Attribute Data Type Compare?
DescriptionGroup
Description <DisplayTextType> Merge
ShortDescription <DisplayTextType> Merge

DisplayElementGroup

<xsd:group name="DisplayElementGroup">
  <xsd:sequence>
    <xsd:element name="DisplayName" type="sdd-common:DisplayTextType" minOccurs="0"/>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
  </xsd:sequence>
</xsd:group>
Type Element Attribute Data Type Compare?
DisplayElementGroup
DisplayName <DisplayTextType> Merge
DescriptionGroup DescriptionGroup Merge

ResourceConstraintGroup

<xsd:group name="ResourceConstraintGroup">
  <xsd:choice>
    <xsd:element name="CapacityConstraint" type="sdd-dd:CapacityConstraintType"/>
    <xsd:element name="ConsumptionConstraint" type="sdd-dd:ConsumptionConstraintType"/>
    <xsd:element name="PropertyConstraint" type="sdd-dd:PropertyConstraintType"/>
    <xsd:element name="VersionConstraint" type="sdd-dd:VersionConstraintType"/>
    <xsd:element name="UniquenessConstraint" type="sdd-dd:UniquenessConstraintType"/>
    <xsd:element name="RelationshipConstraint" type="sdd-dd:RelationshipConstraintType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:choice>
</xsd:group>
Type Element Attribute Data Type Compare?
ResourceConstraintGroup
CapacityConstraint <CapacityConstraintType> No
ConsumptionConstraint <ConsumptionConstraintType> No
PropertyConstraint <PropertyConstraintType> No
VersionConstraint <VersionConstraintType> No
UniquenessConstraint <UniquenessConstraintType> No
RelationshipConstraint <RelationshipConstraintType> No
any namespace="##other"  ?

Notes:
No rule is needed for this type since it only appears in RequirementResourceConstraint and is never merged.

<VariableExpressionType>

<xsd:simpleType name="VariableExpressionType">
  <xsd:restriction base="xsd:token">
    <xsd:pattern value="([^$]*($[^(])*($\([a-zA-Z_]+[0-9a-zA-Z_]*\))*)*"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<VariableExpressionType> xsd:token Yes

<PropertyType>

<xsd:complexType name="PropertyType">
  <xsd:sequence>
    <xsd:element name="PropertyName" type="xsd:QName"/>
    <xsd:element name="Value" type="sdd-dd:VariableExpressionType"/>
  </xsd:sequence>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PropertyType>
any namespace="##other"  ?
PropertyName xsd:QName Yes
Value <VariableExpressionType> Yes

<ResourceTypeNameType>

<xsd:simpleType name="ResourceTypeNameType">
  <xsd:restriction base="xsd:QName"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
ResourceTypeNameType xsd:QName Yes

<ResourceType>

<xsd:complexType name="ResourceType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:element name="Property" type="sdd-dd:PropertyType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="HostedResource" type="sdd-dd:ResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="type" type="sdd-dd:ResourceTypeNameType" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResourceType>
id xsd:ID Throw Away
type <ResourceTypeNameType> Yes
any namespace="##other"  ?
DescriptionGroup Merge
Name <VariableExpressionType> Yes
Property <PropertyType> Yes
HostedResource <ResourceType> Merge
any namespace="##other"  ?

<TopologyType>

<xsd:complexType name="TopologyType">
  <xsd:sequence>
    <xsd:element name="Resource" type="sdd-dd:ResourceType" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<TopologyType>
Resource <ResourceType> Merge
any namespace="##other"  ?

<VersionValueType>

<xsd:complexType name="VersionValueType">
  <xsd:sequence>
    <xsd:element name="Version" type="sdd-common:VersionType"/>
    <xsd:element name="FixName" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<VersionValueType>
Version <VersionType> Yes
FixName xsd:string Yes

<MaxVersionType>

<xsd:complexType name="MaxVersionType">
  <xsd:simpleContent>
    <xsd:extension base="sdd-common:VersionType">
      <xsd:attribute name="inclusive" type="xsd:boolean" use="optional" default="false"/>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>	
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<MaxVersionType> Extension Of: <VersionType> Yes
inclusive xsd:boolean Yes
any namespace="##other"  ?

Notes:
If the inclusive attribute is not present, it's the same as if it is present with a value of false (since the default is false).

<VersionRangeType>

<xsd:complexType name="VersionRangeType">
  <xsd:sequence>
    <xsd:element name="MinVersion" type="sdd-common:VersionType" minOccurs="0"/>
    <xsd:element name="MaxVersion" type="sdd-dd:MaxVersionType" minOccurs="0"/>
    <xsd:element name="FixName" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<VersionRangeType>
MinVersion <VersionType> Yes
MaxVersion <MaxVersionType> Yes
FixName xsd:string  ?

<VersionConstraintValueType>

<xsd:complexType name="VersionConstraintValueType">
  <xsd:sequence>
    <xsd:element name="Value" type="sdd-dd:VersionValueType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Range" type="sdd-dd:VersionRangeType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<VersionConstraintValueType>
Value <VersionValueType> Merge
Range <VersionRangeType> Merge

<VersionConstraintType>

<xsd:complexType name="VersionConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="Supported" type="sdd-dd:VersionConstraintValueType"/>
    <xsd:element name="Certified" type="sdd-dd:VersionConstraintValueType" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<VersionConstraintType>
DescriptionGroup DescriptionGroup Merge
Supported <VersionConstraintValueType> Merge
Certified <VersionConstraintValueType> Merge

<PropertyMatchType>

<xsd:simpleType name="PropertyMatchType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="any"/>
    <xsd:enumeration value="all"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<PropertyMatchType> xsd:NCName Yes

<PropertyValueListType>

<xsd:complexType name="PropertyValueListType">
  <xsd:sequence>
    <xsd:element name="Value" type="sdd-dd:VariableExpressionType" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="match" type="sdd-dd:PropertyMatchType" use="optional" default="any"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PropertyValueListType>
match <PropertyMatchType> Yes
any namespace="##other"  ?
Value <VariableExpressionType> Yes

Notes:
There is no clean way to merge the list of Values, so if either the Value or match is different for a given PropertyName then the higher level type containing PropertyValueListType should be duplicated.

<ConditionalPropertyConstraintType>

<xsd:complexType name="ConditionalPropertyConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="PropertyName" type="xsd:QName"/>
    <xsd:choice>
      <xsd:element name="Value" type="xsd:string"/>
      <xsd:element name="ListOfValues" type="sdd-dd:PropertyValueListType"/>
    </xsd:choice>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConditionalPropertyConstraintType>
DescriptionGroup DescriptionGroup Merge
PropertyName xsd:QName Yes
Value xsd:string Yes
ListOfValues <PropertyValueListType> Yes

Notes:

<ConditionalResourceConstraintType>

<xsd:complexType name="ConditionalResourceConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:element name="VersionConstraint" type="sdd-dd:VersionConstraintValueType" minOccurs="0"/>
    <xsd:element name="PropertyConstraint" type="sdd-dd:ConditionalPropertyConstraintType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="UniquenessConstraint" type="sdd-dd:UniquenessConstraintType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="RelationshipConstraint" type="sdd-dd:RelationshipConstraintType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="testValue" type="xsd:boolean" use="optional" default="true"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConditionalResourceConstraintType>
id xsd:ID Throw Away
resourceRef xsd:IDREF Yes
testValue xsd:boolean Yes
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Name <VariableExpressionType> Merge
VersionConstraint <VersionConstraintValueType> Merge
PropertyConstraint <ConditionalPropertyConstraintType> Merge
UniquenessConstraint <UniquenessConstraintType> Merge
RelationshipConstraint <RelationshipConstraintType> Merge
any namespace="##other"  ?

Notes:
The comparison of resourceRef involves comparing the Resource pointed to, not the reference itself.

When comparing testValue, a missing value is the same as a true value since true is the default.

<AlternativeConditionalType>

<xsd:complexType name="AlternativeConditionalType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="ResourceConstraint" type="sdd-dd:ConditionalResourceConstraintType" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<AlternativeConditionalType>
id xsd:ID Throw Away
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
ResourceConstraint <ConditionalResourceConstraintType> Merge
any namespace="##other"  ?

<OperationType>

<xsd:simpleType name="OperationType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="configure"/>
    <xsd:enumeration value="install"/>
    <xsd:enumeration value="repair"/>
    <xsd:enumeration value="undo"/>
    <xsd:enumeration value="update"/>
    <xsd:enumeration value="use"/>
    <xsd:enumeration value="uninstall"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<OperationType> xsd:NCName Yes

Notes: The repair enumeration value is only valid for CL2.

<OperationListType>

<xsd:simpleType name="OperationListType">
  <xsd:list itemType="sdd-dd:OperationType"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<OperationListType> List Of:<OperationType> Yes

<ConditionType>

<xsd:complexType name="ConditionType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:choice>
      <xsd:element name="Alternative" type="sdd-dd:AlternativeConditionalType" maxOccurs="unbounded"/>
      <xsd:sequence>
        <xsd:element name="ResourceConstraint" type="sdd-dd:ConditionalResourceConstraintType" maxOccurs="unbounded"/>
        <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:choice>
  </xsd:sequence>
  <xsd:attribute name="operation" type="sdd-dd:OperationListType" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConditionType>
operation <OperationListType> Yes
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Alternative <AlternativeConditionalType> Merge
ResourceConstraint <ConditionalResourceConstraintType> Merge
any namespace="##other"  ?

Notes:
May need to look at operation here when deciding what kind of ContentUnits to output in the merged descriptor.

<BaseParameterType>

<xsd:complexType name="BaseParameterType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="defaultValue" type="sdd-dd:VariableExpressionType" use="optional"/>
  <xsd:attribute name="sensitive" type="xsd:boolean" use="optional" default="false"/>
  <xsd:attribute name="required" type="xsd:boolean" use="optional" default="true"/>
  <xsd:attribute name="operation" type="sdd-dd:OperationListType" use="optional"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BaseParameterType>
id xsd:ID Throw Aawy
defaultValue <VariableExpressionType> Yes
sensitive xsd:boolean Yes
required xsd:boolean Yes
operation <OperationListType> Yes
DisplayElementGroup DisplayElementGroup Merge

<BoundaryType>

<xsd:complexType name="BoundaryType">
  <xsd:sequence>
    <xsd:element name="LowerBound" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
    <xsd:element name="UpperBound" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BoundaryType>
LowerBound <VariableExpressionType> Yes
UpperBound <VariableExpressionType> Yes

<IntegerParameterType>

<xsd:complexType name="IntegerParameterType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseParameterType">
      <xsd:sequence>
        <xsd:element name="Bounds" type="sdd-dd:BoundaryType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<IntegerParameterType> Extension Of:<BaseParameterType>
any namespace="##other"  ?
Bounds <BoundaryType> Merge

<StringCaseType>

<xsd:simpleType name="StringCaseType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="lower"/>
    <xsd:enumeration value="upper"/>
    <xsd:enumeration value="mixed"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<StringCaseType> xsd:NCName Yes

<StringParameterType>

<xsd:complexType name="StringParameterType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseParameterType">
      <xsd:sequence>
        <xsd:element name="ValidValue" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="minLength" type="xsd:positiveInteger" use="optional"/>
      <xsd:attribute name="maxLength" type="xsd:positiveInteger" use="optional"/>
      <xsd:attribute name="case" type="sdd-dd:StringCaseType" use="optional" default="mixed"/>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<StringParameterType> Extension Of:<BaseParameterType>
minLength xsd:positiveInteger Merge
maxLength xsd:positiveInteger Merge
case <StringCaseType> Merge
any namespace="##other"  ?
ValidValue xsd:string Merge

Notes:
A warning should be logged describing the way minLength, maxLength and ValueValue are merged. The default is to combine all ValueValues, take the longest minLength and the shortest maxLength. If minLength ends up longer than maxLength, then throw an error.

For case, if the values don't match then the output becomes mixed. So, upper and lower would merge to mixed, as would upper and mixed or lower and mixed.

<BooleanParameterType>

<xsd:complexType name="BooleanParameterType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseParameterType">
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BooleanParameterType> Extension Of:<BaseParameterType>
any namespace="##other"  ?

<URIParameterType>

<xsd:complexType name="URIParameterType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseParameterType">
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<URIParameterType> Extension Of:<BaseParameterType>
any namespace="##other"  ?

<ParametersType>

<xsd:complexType name="ParametersType">
  <xsd:choice maxOccurs="unbounded">
    <xsd:element name="IntegerParameter" type="sdd-dd:IntegerParameterType"/>
    <xsd:element name="StringParameter" type="sdd-dd:StringParameterType"/>
    <xsd:element name="BooleanParameter" type="sdd-dd:BooleanParameterType"/>
    <xsd:element name="URIParameter" type="sdd-dd:URIParameterType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:choice>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ParametersType>
IntegerParameter <IntegerParameterType> Merge
StringParameter <StringParameterType> Merge
BooleanParameter <BooleanParameterType> Merge
URIParameter <URIParameterType> Merge
any namespace="##other"  ?

<BaseVariableType>

<xsd:complexType name="BaseVariableType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="sensitive" type="xsd:boolean" use="optional" default="false"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BaseVariableType>
id xsd:ID Throw Away
sensitive xsd:boolean Yes
DescriptionGroup DescriptionGroup Merge

<ResourcePropertyType>

<xsd:complexType name="ResourcePropertyType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseVariableType">
      <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
      <xsd:attribute name="propertyName" type="xsd:QName" use="required"/>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResourcePropertyType> Extension Of:<BaseVariableType>
resourceRef xsd:IDREF Yes
propertyName xsd:QName Yes
any namespace="##other"  ?

Notes:
Compare the Resource pointed to by the resourceRef, not the reference itself.

<ConditionalDerivedVariableExpressionType>

<xsd:complexType name="ConditionalDerivedVariableExpressionType">
  <xsd:sequence>
    <xsd:element name="Condition" type="sdd-dd:ConditionType"/>
    <xsd:element name="Expression" type="sdd-dd:VariableExpressionType"/>
  </xsd:sequence>
  <xsd:attribute name="priority" type="xsd:positiveInteger" use="optional" default="1"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConditionalDerivedVariableExpressionType>
priority xsd:positiveInteger Merge
Condition <ConditionType> Yes
Expression <VariableExpressionType> Yes

Notes:
SDDTooling TwoLists.png

Merging Algorithm

Walk down the left list, checking if each item is equal to anything in the right list. If an item is equal to something in the right list, replace the left item with the item from the right and everything in the right list above that item (excluding items that have already been copied to the left list). Continue until reaching the end of the left list. If any un-copied items remain in the right list, append them to the end of the left list.

There are two special cases that have to be handled slightly differently. The first case is when an item in one list is equal to more than one item in the other list. Merging should take place as normal, but all priorities should be removed from the final list. This case is an error in the input so a warning should be logged. The second case is when an item in the left list is equal to an item in the right list that has already been copied to the left list. Normal merging should continue and the priorities should be removed from the final list.

Here's what the lists above would look like after merging:

SDDTooling MergedList.png

<DerivedVariableType>

<xsd:complexType name="DerivedVariableType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseVariableType">
      <xsd:choice>
        <xsd:element name="Expression" type="sdd-dd:VariableExpressionType"/>
        <xsd:element name="ConditionalExpression" type="sdd-dd:ConditionalDerivedVariableExpressionType" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<DerivedVariableType> Extension Of:<BaseVariableType>
Expression <VariableExpressionType> Yes
ConditionalExpression <ConditionalDerivedVariableExpressionType> Merge

<VariablesType>

<xsd:complexType name="VariablesType">
  <xsd:choice maxOccurs="unbounded">
    <xsd:element name="Parameters" type="sdd-dd:ParametersType"/>
    <xsd:element name="ResourceProperty" type="sdd-dd:ResourcePropertyType"/>
    <xsd:element name="DerivedVariable" type="sdd-dd:DerivedVariableType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:choice>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<VariablesType>
Parameters <ParametersType> Merge
ResourceProperty <ResourcePropertyType> Merge
DerivedVariable <DerivedVariableType> Merge
any namespace="##other"  ?

<RequiredBaseConstraintType>

<xsd:complexType name="RequiredBaseConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:element name="VersionConstraint" type="sdd-dd:VersionConstraintType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="testValue" type="xsd:boolean" use="optional" default="true"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequiredBaseConstraintType>
id xsd:ID Throw Away
resourceRef xsd:IDREF Yes
testValue xsd:boolean Yes
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Name <VariableExpressionType> Merge
VersionConstraint <VersionConstraintType> Yes
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by the resourceRef, not the references themselves.

<AlternativeRequiredBaseConstraintType>

<xsd:complexType name="AlternativeRequiredBaseConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="ResourceConstraint" type="sdd-dd:RequiredBaseConstraintType" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="priority" type="xsd:positiveInteger" use="optional" default="1"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<AlternativeRequiredBaseConstraintType>
id xsd:ID Throw Away
priority xsd:positiveInteger Merge
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
ResourceConstraint <RequiredBaseConstraintType> Yes
any namespace="##other"  ?

Notes:
See notes in <ConditionalDerivedVariableExpressionType>

<RequiredBaseType>

<xsd:complexType name="RequiredBaseType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:choice>
      <xsd:element name="Alternative" type="sdd-dd:AlternativeRequiredBaseConstraintType" maxOccurs="unbounded"/>
      <xsd:sequence>
        <xsd:element name="ResourceConstraint" type="sdd-dd:RequiredBaseConstraintType" maxOccurs="unbounded"/>
        <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:choice>
  </xsd:sequence>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequiredBaseType>
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Alternative <AlternativeRequiredBaseConstraintType> Merge
ResourceConstraint <RequiredBaseConstraintType> Merge
any namespace="##other"  ?

<CapacityValueType>

<xsd:complexType name="CapacityValueType">
  <xsd:sequence>
    <xsd:element name="Minimum" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
    <xsd:element name="Maximum" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
    <xsd:element name="MinimumRecommended" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
    <xsd:element name="MaximumRecommended" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="unit" type="xsd:string" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CapacityValueType>
unit xsd:string Merge
any namespace="##other"  ?
Minimum <VariableExpressionType> Merge
Maximum <VariableExpressionType> Merge
MinimumRecommended <VariableExpressionType> Merge
MaximumRecommended <VariableExpressionType> Merge

Notes:
A merge can take place in the case where the units are the same or the units are different and the Aggregator can understand and covert between the units (like MB and KB). If the units are both different and not known the the Aggregator then the CapacityValueType is marked not equal and merging takes place farther up the tree.

When merging, use the highest Minimum and highest Maximum.

<CapacityConstraintType>

<xsd:complexType name="CapacityConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="PropertyName" type="xsd:QName"/>
    <xsd:element name="Value" type="sdd-dd:CapacityValueType"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CapacityConstraintType>
DescriptionGroup DescriptionGroup No
PropertyName xsd:QName No
Value <CapacityValueType> No

Notes:
No rule is needed for this type since it only appears in ResourceConstraintGroup and is never merged.

<ConsumptionConstraintValueType>

<xsd:complexType name="ConsumptionConstraintValueType">
  <xsd:simpleContent>
    <xsd:extension base="sdd-dd:VariableExpressionType">
      <xsd:attribute name="unit" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConsumptionConstraintValueType> Extension Of: <VariableExpressionType>
unit xsd:string No
any namespace="##other"  ?

Notes:
No rule is needed for this type since it only appears in ConsumptionConstrainType and is never merged.

<ConsumptionConstraintType>

<xsd:complexType name="ConsumptionConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="PropertyName" type="xsd:QName"/>
    <xsd:element name="Value" type="sdd-dd:ConsumptionConstraintValueType"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConsumptionConstraintType>
DescriptionGroup DescriptionGroup No
PropertyName xsd:QName No
Value <ConsumptionConstraintValueType> No

Notes:
No rule is needed for this type since it only appears in ResourceConstraintGroup and is never merged.

<PropertyConstraintType>

<xsd:complexType name="PropertyConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="PropertyName" type="xsd:QName"/>
    <xsd:choice>
      <xsd:element name="Value" type="sdd-dd:VariableExpressionType"/>
      <xsd:element name="ListOfValues" type="sdd-dd:PropertyValueListType"/>
    </xsd:choice>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PropertyConstraintType>
DescriptionGroup DescriptionGroup No
PropertyName xsd:QName No
Value <VariableExpressionType> No
ListOfValues <PropertyValueListType> No

Notes:
No rule is needed for this type since it only appears in ResourceConstraintGroup and is never merged.

<RequirementResourceConstraintType>

<xsd:complexType name="RequirementResourceConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:group ref="sdd-dd:ResourceConstraintGroup" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="testValue" type="xsd:boolean" use="optional" default="true"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequirementResourceConstraintType>
id xsd:ID Throw Away
resourceRef xsd:IDREF No
testValue xsd:boolean No
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup No
Name <VariableExpressionType> No
ResourceConstraintGroup ResourceConstraintGroup No

Notes:
RequirementResourceConstraintType is never merged. Instead, they will either be left alone inside their original RequirementType or moved inside an AlternativeRequirementType, depending on which RequirementType rule has been chosen. No rules is needed for this type.

<AlternativeRequirementType>

<xsd:complexType name="AlternativeRequirementType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="ResourceConstraint" type="sdd-dd:RequirementResourceConstraintType"/>
      <xsd:element name="Dependency" type="sdd-dd:InternalDependencyType"/>
      <xsd:any namespace="##other" processContents="lax"/>
    </xsd:choice>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="priority" type="xsd:positiveInteger" use="optional" default="1"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<AlternativeRequirementType>
id xsd:ID Throw Away
priority xsd:positiveInteger Merge
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
ResourceConstraint <RequirementResourceConstraintType> Yes
Dependency <InternalDependencyType> Yes
any namespace="##other"  ?

Notes:
See notes in <ConditionalDerivedVariableExpressionType> for merging priorities.

<RequirementType>

<xsd:complexType name="RequirementType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:choice>
      <xsd:element name="Alternative" type="sdd-dd:AlternativeRequirementType" maxOccurs="unbounded"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="ResourceConstraint" type="sdd-dd:RequirementResourceConstraintType"/>
        <xsd:element name="Dependency" type="sdd-dd:InternalDependencyType"/>
        <xsd:any namespace="##other" processContents="lax"/>
      </xsd:choice>
    </xsd:choice>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="operation" type="sdd-dd:OperationListType" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequirementType>
id xsd:ID Throw Away
operation <OperationListType> Yes
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Alternative <AlternativeRequirementType> Merge
ResourceConstraint <RequirementResourceConstraintType> Yes
Dependency <InternalDependencyType> Yes
any namespace="##other"  ?

Notes:
There should be two rules created for this type so that the user can choose which one to include in their rule set. The first rule will merge RequirementTypes that have the same operation and create Alternatives for any ResourceConstraints. The second rule will never merge RequirementTypes and instead combine them all together in a big list under RequirementsType.

<RequirementsType>

<xsd:complexType name="RequirementsType">
  <xsd:sequence>
    <xsd:element name="Requirement" type="sdd-dd:RequirementType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequirementsType>
Requirement <RequirementType> Merge

<LanguageType>

<xsd:complexType name="LanguageType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="type" type="xsd:language" use="required"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<LanguageType>
type xsd:language Yes
DisplayElementGroup DisplayElementGroup Merge

<LanguagesType>

<xsd:complexType name="LanguagesType">
  <xsd:sequence>
    <xsd:element name="Language" type="sdd-dd:LanguageType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>	
Type Element Attribute Data Type Compare?
<LanguagesType>
Language <LanguageType> Merge

<SDDCompletionTypeNamesType>

<xsd:simpleType name="SDDCompletionTypeNamesType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="restartRequiredImmediately"/>
    <xsd:enumeration value="restartRequiredBeforeUse"/>
    <xsd:enumeration value="restartOccurs"/>
    <xsd:enumeration value="logoffRequired"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<SDDCompletionTypeNamesType> xsd:NCName Yes

<DescriptionGroup>

<xsd:simpleType name="CompletionTypeNamesType">
  <xsd:union memberTypes="sdd-dd:SDDCompletionTypeNamesType xsd:NCName" />
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<DescriptionGroup> Union Of: <SDDCompletionTypeNamesType> + xsd:NCName Yes

<CompletionType>

<xsd:complexType name="CompletionType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="type" type="sdd-dd:CompletionTypeNamesType" use="required"/>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="operation" type="sdd-dd:OperationListType" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CompletionType>
type <CompletionTypeNamesType> Yes
resourceRef xsd:IDREF Yes
operation <OperationListType> Yes
any namespace="##other"  ?
DisplayElementGroup <DisplayElementGroup> Merge
Condition <ConditionType> Merge
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by resourceRef, not the references themselves.

<ResultingPropertyType>

<xsd:complexType name="ResultingPropertyType">
  <xsd:sequence>
    <xsd:element name="PropertyName" type="xsd:string"/>
    <xsd:element name="Value" type="sdd-dd:VariableExpressionType"/>
  </xsd:sequence>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResultingPropertyType>
any namespace="##other"  ?
PropertyName xsd:string Yes
Value <VariableExpressionType> Merge

<ResultingResourceType>

<xsd:complexType name="ResultingResourceType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:element name="Version" type="sdd-common:VersionType" minOccurs="0"/>
    <xsd:element name="FixName" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Property" type="sdd-dd:ResultingPropertyType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Relationship" type="sdd-dd:RelationshipType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResultingResourceType>
resourceRef xsd:IDREF Yes
any namespace="##other"  ?
DescriptionGroup DescriptionGroup Merge
Condition <ConditionType> Yes
Name <VariableExpressionType> Merge
Version <VersionType> Yes
FixName xsd:string Merge
Property <ResultingPropertyType> Merge
Relationship <RelationshipType> Merge
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by the resourceRefs, not the references themselves.

<ResultingChangeType>

<xsd:complexType name="ResultingChangeType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0" />
    <xsd:element name="Property" type="sdd-dd:ResultingPropertyType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Relationship" type="sdd-dd:RelationshipType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResultingChangeType>
resourceRef xsd:IDREF Yes
any namespace="##other"  ?
DescriptionGroup DescriptionGroup Merge
Condition <ConditionType> Yes
Name <VariableExpressionType> Merge
Property <ResultingPropertyType> Merge
Relationship <RelationshipType> Merge
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by the resourceRefs, not the references themselves.

<ArgumentType>

<xsd:complexType name="ArgumentType">
  <xsd:attribute name="name" type="sdd-dd:VariableExpressionType" use="required"/>
  <xsd:attribute name="value" type="sdd-dd:VariableExpressionType" use="optional"/>
  <xsd:attribute name="required" type="xsd:boolean" use="optional" default="true"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ArgumentType>
name <VariableExpressionType> Yes
value <VariableExpressionType> Marge
required xsd:boolean Merge
any namespace="##other"  ?

Notes:
Merge required by performing a logical OR.

<ArgumentListType>

<xsd:complexType name="ArgumentListType">
  <xsd:sequence>
    <xsd:element name="Argument" type="sdd-dd:ArgumentType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ArgumentListType>
Argument <ArgumentType> Merge

<OutputVariableType>

<xsd:complexType name="OutputVariableType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:BaseVariableType">
      <xsd:attribute name="outputParameterName" type="xsd:NCName" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<OutputVariableType> Extension Of:<BaseVariableType>
outputParameterName xsd:NCName Yes
any namespace="##other"  ?

<OutputVariableListType>

<xsd:complexType name="OutputVariableListType">
  <xsd:sequence>
    <xsd:element name="OutputVariable" type="sdd-dd:OutputVariableType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<OutputVariableListType>
OutputVariable <OutputVariableType> Merge

<SubstitutionType>

<xsd:complexType name="SubstitutionType">
  <xsd:sequence>
    <xsd:element name="Pattern" type="xsd:string"/>
    <xsd:element name="Value" type="sdd-dd:VariableExpressionType"/>
  </xsd:sequence>
  <xsd:attribute name="limit" type="xsd:positiveInteger" use="optional"/>
  <xsd:attribute name="required" type="xsd:boolean" use="optional" default="true"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<SubstitutionType>
limit xsd:positiveInteger Merge
required xsd:boolean Merge
any namespace="##other"  ?
Pattern xsd:string Yes
Value <VariableExpressionType> Yes

Notes:
Merge required by using a logical AND.

<ArtifactTypeNameType>

<xsd:simpleType name="ArtifactTypeNameType">
  <xsd:restriction base="xsd:QName"/>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<ArtifactTypeNameType> xsd:QName Yes

<AdditionalContentType>

<xsd:complexType name="AdditionalContentType">
  <xsd:sequence>
    <xsd:element name="Substitution" type="sdd-dd:SubstitutionType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="contentRef" type="xsd:token" use="required"/>
  <xsd:attribute name="type" type="sdd-dd:ArtifactTypeNameType" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<AdditionalContentType>
contentRef xsd:token Yes
type <ArtifactTypeNameType> Merge
any namespace="##other"  ?
Substitution <SubstitutionType> Merge
any namespace="##other"  ?

Notes:
Compare the Content pointed to by contentRef, not the references themselves.

When merging, type and contentRef must stay together as a pair. So, whichever contentRef is kept, the associated type must be kept.

<ArtifactType>

<xsd:complexType name="ArtifactType">
  <xsd:sequence>
    <xsd:element name="Arguments" type="sdd-dd:ArgumentListType" minOccurs="0"/>
    <xsd:element name="OutputVariables" type="sdd-dd:OutputVariableListType" minOccurs="0"/>
    <xsd:element name="AdditionalContent" type="sdd-dd:AdditionalContentType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="contentRef" type="xsd:token" use="optional"/>
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="optional"/>
  <xsd:attribute name="type" type="sdd-dd:ArtifactTypeNameType" use="optional"/>
  <xsd:attribute name="weight" type="xsd:positiveInteger" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ArtifactType>
contentRef xsd:token Yes
resourceRef xsd:IDREF Yes
type <ArtifactTypeNameType> Merge
weight xsd:positiveInteger Merge
any namespace="##other"  ?
Arguments <ArgumentListType> Merge
OutputVariables <OutputVariableListType> Merge
AdditionalContent <AdditionalContentType> Merge
any namespace="##other"  ?

Notes:
If two weights are different (which means two inputs think the same Artifact takes two different times to install), then log a warning and do not include weight in the ouput.

When merging, type must go along as a pair with the contentRef or resourceRef that it's associated with.

When comparing conrentRef or resourceRef, compare the element pointed to instead of the references themselves.

<InstallationArtifactsType>

<xsd:complexType name="InstallationArtifactsType">
  <xsd:sequence>
    <xsd:element name="InstallArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:element name="UpdateArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:element name="UndoArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:element name="UninstallArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:element name="RepairArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<InstallationArtifactsType>
InstallArtifact <ArtifactType> Merge
UpdateArtifact <ArtifactType> Merge
UndoArtifact <ArtifactType> Merge
UninstallArtifact <ArtifactType> Merge
RepairArtifact <ArtifactType> Merge
any namespace="##other"  ?

Notes: The RepairArtifact sub-element is only valid for CL2.

<InstallableUnitType>

<xsd:complexType name="InstallableUnitType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="RequiredBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="Languages" type="sdd-dd:LanguagesType" minOccurs="0"/>
    <xsd:element name="Completion" type="sdd-dd:CompletionType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ResultingResource" type="sdd-dd:ResultingResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ResultingChange" type="sdd-dd:ResultingChangeType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Artifacts" type="sdd-dd:InstallationArtifactsType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="targetResourceRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<InstallableUnitType>
id xsd:ID Throw Away
targetResourceRef xsd:IDREF Yes
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
RequiredBase <RequiredBaseType> Merge
Requirements <RequirementsType> Merge
Languages <LanguagesType> Merge
Completion <CompletionType> Merge
ResultingResource <ResultingResourceType> Yes
ResultingChange <ResultingChangeType> Yes
Artifacts <InstallationArtifactsType> No
any namespace="##other"  ?

Notes:
When comparing targetResourceRefs, compare the TargetResources pointed to instead of the targetResourceRefs themselves.

Artifacts, ResultingResource and ResultingChange must all stay together as a set. If ResultingResource and ResultingChange from two InstallableUnits match but the Artifacts are different, pick one Artifacts and log a warning.

<ConfigurationArtifactsType>

<xsd:complexType name="ConfigurationArtifactsType">
  <xsd:sequence>
    <xsd:element name="ConfigArtifact" type="sdd-dd:ArtifactType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConfigurationArtifactsType>
ConfigArtifact <ArtifactType> Yes
any namespace="##other"  ?

<ConfigurationUnitType>

<xsd:complexType name="ConfigurationUnitType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="Completion" type="sdd-dd:CompletionType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ResultingChange" type="sdd-dd:ResultingChangeType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Artifacts" type="sdd-dd:ConfigurationArtifactsType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="targetResourceRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConfigurationUnitType>
id xsd:ID Throw Away
targetResourceRef xsd:IDREF Yes
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
Requirements <RequirementsType> Merge
Completion <CompletionType> Merge
ResultingChange <ResultingChangeType> Yes
Artifacts <ConfigurationArtifactsType> No
any namespace="##other"  ?

Notes:
When comparing targetResourceRefs, compare the TargetResources pointed to instead of the tergerResourceRefs themselves.

<LocalizationUnitType>

<xsd:complexType name="LocalizationUnitType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="RequiredBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="Languages" type="sdd-dd:LanguagesType" minOccurs="0"/>
    <xsd:element name="Completion" type="sdd-dd:CompletionType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="LocalizationBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="ResultingResource" type="sdd-dd:ResultingResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Artifacts" type="sdd-dd:InstallationArtifactsType"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="targetResourceRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<LocalizationUnitType>
id xsd:ID Throw Away
targetResourceRef xsd:IDREF Yes
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
RequiredBase <RequiredBaseType> Merge
Requirements <RequirementsType> Merge
Languages <LanguagesType> Merge
Completion <CompletionType> Merge
LocalizationBase <RequiredBaseType> Merge
ResultingResource <ResultingResourceType> Yes
Artifacts <InstallationArtifactsType> No
any namespace="##other"  ?

Notes:
When comparing targetResourceRefs, compare the TargetResources pointed to instead of the tergerResourceRefs themselves.

<LanguageSetType>

<xsd:complexType name="LanguageSetType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Language" type="sdd-dd:LanguageType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<LanguageSetType>
DisplayElementGroup DisplayElementGroup Merge
Language <LanguageType> Merge

<DeploymentDescriptorType>

<xsd:complexType name="DeploymentDescriptorType">
  <xsd:sequence>
    <xsd:element name="Topology" type="sdd-dd:TopologyType"/>
    <xsd:choice>
      <xsd:choice>
        <xsd:element name="InstallableUnit" type="sdd-dd:InstallableUnitType"/>
        <xsd:element name="ConfigurationUnit" type="sdd-dd:ConfigurationUnitType"/>
        <xsd:element name="LocalizationUnit" type="sdd-dd:LocalizationUnitType"/>
      </xsd:choice>
      <xsd:sequence maxOccurs="unbounded">
        <xsd:element name="CompositeInstallable" type="sdd-dd:CompositeInstallableType"/>
      </xsd:sequence>
    </xsd:choice>
    <xsd:element name="Requisites" type="sdd-dd:RequisitesType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attributeGroup ref="sdd-common:DescriptorInfoGroup"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<DeploymentDescriptorType>
DescriptorInfoGroup DescriptorInfoGroup Merge
Topology <TopologyType> Merge
InstallableUnit <InstallableUnitType> Merge
ConfigurationUnit <ConfigurationUnitType> Merge
LocalizationUnit <LocalizationUnitType> Merge
CompositeInstallable <CompositeInstallableType> Merge
Requisites <RequisitesType> Merge
any namespace="##other"  ?

Deployment Descriptor Schema Elements CL2 specific

<BaseContentType>

<xsd:complexType name="BaseContentType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:ContentListGroup"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<BaseContentType>
ContentListGroup ContentListGroup Merge

<CompositeInstallableType>

<xsd:complexType name="CompositeInstallableType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="RequiredBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="Languages" type="sdd-dd:LanguageSelectionsType" minOccurs="0"/>
    <xsd:element name="ResultingResource" type="sdd-dd:ResultingResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ResultingChange" type="sdd-dd:ResultingChangeType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="BaseContent" type="sdd-dd:BaseContentType" minOccurs="0"/>
    <xsd:element name="SelectableContent" type="sdd-dd:SelectableContentType" minOccurs="0"/>
    <xsd:element name="LocalizationContent" type="sdd-dd:LocalizationContentType" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="operation" type="sdd-dd:OperationType" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CompositeInstallableType>
id xsd:ID Throw Away
operation <OperationType> Yes
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
RequiredBase <RequiredBaseType> Merge
Requirements <RequirementsType> Merge
Languages <LanguageSelectionsType> Merge
Completion <CompletionType> Merge
ResultingResource <ResultingResourceType> Yes
ResultingChange <ResultingChangeType> Yes
BaseContent <BaseContentType> Merge
SelectableContent <SelectableContentType> Merge
LocalizationContent <LocalizationContentType> Merge
any namespace="##other"  ?

<CompositeLocalizationUnitType>

<xsd:complexType name="CompositeLocalizationUnitType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="RequiredBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="Languages" type="sdd-dd:LanguagesType" minOccurs="0"/>
    <xsd:element name="Completion" type="sdd-dd:CompletionType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="LocalizationBase" type="sdd-dd:RequiredBaseType" minOccurs="0"/>
    <xsd:element name="ResultingResource" type="sdd-dd:ResultingResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="LocalizationUnit" type="sdd-dd:LocalizationUnitType"/>
      <xsd:element name="ContainedLocalizationPackage" type="sdd-dd:ReferencedPackageType"/>
      <xsd:element name="CompositeLocalizationUnit" type="sdd-dd:CompositeLocalizationUnitType"/>
    </xsd:choice>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CompositeLocalizationUnitType>
id xsd:ID Throw Away
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
RequiredBase <RequiredBaseType> Merge
Requirements <RequirementsType> Merge
Languages <LanguagesType> Merge
Completion <CompletionType> Merge
LocalizationBase <RequiredBaseType> Merge
ResultingResource <ResultingResourceType> Yes
LocalizationUnit <LocalizationUnitType> Merge
ContainedLocalizationPackage <ReferencedPackageType> Merge
CompositeLocalizationUnit <CompositeLocalizationUnitType> Merge
any namespace="##other"  ?

<CompositeUnitType>

<xsd:complexType name="CompositeUnitType">
  <xsd:sequence>
    <xsd:element name="Identity" type="sdd-common:IdentityType" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Variables" type="sdd-dd:VariablesType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:group ref="sdd-dd:ContentListGroup"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<CompositeUnitType>
id xsd:ID Throw Away
any namespace="##other"  ?
Identity <IdentityType> Merge
Condition <ConditionType> Merge
Variables <VariablesType> Merge
Requirements <RequirementsType> Merge
ContentListGroup ContentListGroup Merge

<ConstrainedResourceType>

<xsd:complexType name="ConstrainedResourceType">
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="constraintType" type="sdd-dd:MultiplicityConstraintType" use="optional" default="same"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ConstrainedResourceType>
resourceRef xsd:IDREF Yes
constraintType <MultiplicityConstraintType> Yes
any namespace="##other"  ?

Notes:
When comparing resourceRefs, compare the Resources pointed to instead of the references themselves.

<MultiplicityType>

<xsd:complexType name="MultiplicityType">
  <xsd:sequence>
    <xsd:element name="ConstrainedFeature" type="sdd-dd:FeatureReferenceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ConstrainedResource" type="sdd-dd:ConstrainedResourceType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="multiplesAllowed" type="xsd:boolean" fixed="true" use="required"/>
  <xsd:attribute name="minSelections" type="xsd:positiveInteger" default="1" use="optional"/>
  <xsd:attribute name="maxSelections" type="xsd:positiveInteger" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<MultiplicityType>
multiplesAllowed xsd:boolean Merge
minSelections xsd:positiveInteger Merge
maxSelections xsd:positiveInteger Merge
any namespace="##other"  ?
ConstrainedFeature <FeatureReferenceType> Yes
ConstrainedResource <ConstrainedResourceType> Yes
any namespace="##other"  ?

Notes:
If minSelections and maxSelections are different in the two inputs, keep the lowest min and lowest max. If that makes the max smaller than the min, set them both to the smaller of the values and log a warning.

<ContentElementReferenceType>

<xsd:complexType name="ContentElementReferenceType">
  <xsd:attribute name="contentElementRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ContentElementReferenceType>
contentElementRef xsd:IDREF Yes
any namespace="##other"  ?

<PackageFeatureReferenceType>

<xsd:complexType name="PackageFeatureReferenceType">
  <xsd:attribute name="contentElementRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="packageFeatureRef" type="xsd:NCName" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<PackageFeatureReferenceType>
contentElementRef xsd:IDREF Yes
packageFeatureRef xsd:NCName Yes
any namespace="##other"  ?

<NestedFeatureType>

<xsd:complexType name="NestedFeatureType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="Multiplicity" type="sdd-dd:MultiplicityType" minOccurs="0"/>
    <xsd:element name="Languages" type="sdd-dd:LanguageSelectionsType" minOccurs="0"/>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="NestedFeature" type="sdd-dd:NestedFeatureType"/>
      <xsd:element name="ContentElement" type="sdd-dd:ContentElementReferenceType"/>
      <xsd:element name="PackageFeatureReference" type="sdd-dd:PackageFeatureReferenceType"/>
      <xsd:element name="RequiredFeature" type="sdd-dd:FeatureReferenceType"/>
      <xsd:element name="Variable" type="sdd-dd:DerivedVariableType"/>
    </xsd:choice>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="addOn" type="xsd:boolean" use="optional" default="false"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<NestedFeatureType>
id xsd:ID Throw Away
addOn xsd:boolean Merge
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
Condition <ConditionType> Merge
Multiplicity <MultiplicityType> Merge
Languages <LanguageSelectionsType> Merge
NestedFeature <NestedFeatureType> Merge
ContentElement <ContentElementReferenceType> Yes
PackageFeatureReference <PackageFeatureReferenceType> Merge
RequiredFeature <FeatureReferenceType> Merge
Variable <DerivedVariableType> Merge
any namespace="##other"  ?

Notes:
Merge addOn by performing a logical AND.

If two Conditions can't be merged (meaning they have different operations), then throw an error.

If two Miltiplicitys can't be merged (meaning they have different ConstrainedFeatures or ConstrainedResources), then throw an error.

<FeatureType>

<xsd:complexType name="FeatureType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:NestedFeatureType">
      <xsd:attribute name="required" type="xsd:boolean" use="optional" default="false"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<FeatureType> Extension Of:<NestedFeatureType>
required xsd:boolean Merge

Notes:
Merge required by performing a logical OR.

<MultiSelectType>

<xsd:complexType name="MultiSelectType">
  <xsd:sequence>
    <xsd:element name="Feature" type="sdd-dd:FeatureReferenceType" minOccurs="2" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="minSelections" type="xsd:nonNegativeInteger" use="optional" default="0"/>
  <xsd:attribute name="maxSelections" type="xsd:positiveInteger" use="optional"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<MultiSelectType>
minSelections xsd:nonNegativeInteger Merge
maxSelections xsd:positiveInteger Merge
Feature <FeatureReferenceType> Merge

Notes:
When merging minSelections and maxSelections, use the lowest min and highest max.

<FeaturesType>

<xsd:complexType name="FeaturesType">
  <xsd:sequence>
    <xsd:element name="Feature" type="sdd-dd:FeatureType" maxOccurs="unbounded"/>
    <xsd:element name="MultiSelect" type="sdd-dd:MultiSelectType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<FeaturesType>
Feature <FeatureType> Merge
MultiSelect <MultiSelectType> Merge
any namespace="##other"  ?

<SelectableContentType>

<xsd:complexType name="SelectableContentType">
  <xsd:sequence>	
    <xsd:element name="Groups" type="sdd-dd:GroupsType" minOccurs="0"/>
    <xsd:element name="Features" type="sdd-dd:FeaturesType" minOccurs="0"/>
    <xsd:group ref="sdd-dd:ContentListGroup"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<SelectableContentType>
Groups <GroupsType> Merge
Features <FeaturesType> Merge
ContentListGroup ContentListGroup Merge

<LocalizationContentType>

<xsd:complexType name="LocalizationContentType">
  <xsd:sequence>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="LocalizationUnit" type="sdd-dd:LocalizationUnitType"/>
      <xsd:element name="ContainedLocalizationPackage" type="sdd-dd:ReferencedPackageType"/>
      <xsd:element name="CompositeLocalizationUnit" type="sdd-dd:CompositeLocalizationUnitType"/>
    </xsd:choice>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<LocalizationContentType>
LocalizationUnit <LocalizationUnitType> Merge
ContainedLocalizationPackage <ReferencedPackageType> Merge
CompositeLocalizationUnit <CompositeLocalizationUnitType> Merge

<RequisitesType>

<xsd:complexType name="RequisitesType">
  <xsd:sequence>
    <xsd:element name="ReferencedPackage" type="sdd-dd:ReferencedPackageType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequisitesType>
ReferencedPackage <ReferencedPackageType> Merge

ContentListGroup

<xsd:group name="ContentListGroup">
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="InstallableUnit" type="sdd-dd:InstallableUnitType"/>
      <xsd:element name="ConfigurationUnit" type="sdd-dd:ConfigurationUnitType"/>
      <xsd:element name="CompositeUnit" type="sdd-dd:CompositeUnitType"/>
      <xsd:element name="ContainedPackage" type="sdd-dd:ReferencedPackageType"/>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:choice>
  </xsd:sequence>
</xsd:group>
Type Element Attribute Data Type Compare?
ContentListGroup
InstallableUnit <InstallableUnitType> Merge
ConfigurationUnit <ConfigurationUnitType> Merge
CompositeUnit <CompositeUnitType> Merge
RequiredBase <RequiredBaseType> Merge
ContainedPackage <ReferencedPackageType> Merge
any namespace="##other"  ?

<ContentSelectionFeatureType>

<xsd:complexType name="ContentSelectionFeatureType">
  <xsd:simpleContent>
    <xsd:extension base="xsd:token">
      <xsd:attribute name="selections" type="sdd-dd:VariableExpressionType" use="optional"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ContentSelectionFeatureType> Extension Of:xsd:token
selections <VariableExpressionType> Merge

Notes:
If selections in the two inputs are different, do not include selections at all in the output. After merging, another pass needs to be made to verify that selections is still within the min and max Selections of the Feature's MultiplicityType. If selections is out of range, modify it so that it is within the range (set to minimum if too small, set to maximum if too big).

<RequiredContentSelectionType>

<xsd:complexType name="RequiredContentSelectionType">
  <xsd:sequence>
    <xsd:element name="Group" type="xsd:token" minOccurs="0"/>
    <xsd:element name="Feature" type="sdd-dd:ContentSelectionFeatureType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RequiredContentSelectionType>
Group xsd:token Yes
Feature <ContentSelectionFeatureType> Merge

<ResourceMapType>

<xsd:complexType name="ResourceMapType">
  <xsd:attribute name="resourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="foreignId" type="xsd:NCName" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResourceMapType>
resourceRef xsd:IDREF Yes
foreignId xsd:NCName Yes
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by the resourceRef and foreignId instead of the references themselves.

<ResultingResourceMapType>

<xsd:complexType name="ResultingResourceMapType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:ResourceMapType">
      <xsd:sequence>
        <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
        <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
        <xsd:element name="Version" type="sdd-common:VersionType" minOccurs="0"/>
        <xsd:element name="FixName" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="Property" type="sdd-dd:ResultingPropertyType" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="Relationship" type="sdd-dd:RelationshipType" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResultingResourceMapType> Extension Of:<ResourceMapType>
Condition <ConditionType> Yes
Name <VariableExpressionType> Merge
Version <VersionType> Yes
FixName xsd:string Merge
Property <ResultingPropertyType> Merge
Relationship <RelationshipType> Merge
any namespace="##other"  ?

<ResultingChangeMapType>

<xsd:complexType name="ResultingChangeMapType">
  <xsd:complexContent>
    <xsd:extension base="sdd-dd:ResourceMapType">
      <xsd:sequence>
        <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
        <xsd:element name="Name" type="sdd-dd:VariableExpressionType" minOccurs="0"/>
        <xsd:element name="Property" type="sdd-dd:ResultingPropertyType" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="Relationship" type="sdd-dd:RelationshipType" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ResultingChangeMapType> Extension Of:<ResourceMapType>
Condition <ConditionType> Yes
Name <VariableExpressionType> Merge
Property <ResultingPropertyType> Merge
Relationship <RelationshipType> Merge
any namespace="##other"  ?

<ReferencedPackageType>

<xsd:complexType name="ReferencedPackageType">
  <xsd:sequence>
    <xsd:element name="Condition" type="sdd-dd:ConditionType" minOccurs="0"/>
    <xsd:element name="RequiredContentSelection" type="sdd-dd:RequiredContentSelectionType" minOccurs="0"/>
    <xsd:element name="Arguments" type="sdd-dd:ArgumentListType" minOccurs="0"/>
    <xsd:element name="OutputVariables" type="sdd-dd:OutputVariableListType" minOccurs="0"/>
    <xsd:element name="Requirements" type="sdd-dd:RequirementsType" minOccurs="0"/>
    <xsd:element name="ResultingResourceMap" type="sdd-dd:ResultingResourceMapType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="ResultingChangeMap" type="sdd-dd:ResultingChangeMapType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="RequiredResourceMap" type="sdd-dd:ResourceMapType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Languages" type="sdd-dd:LanguagesType" minOccurs="0"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="contentRef" type="xsd:token" use="required"/>
  <xsd:attribute name="weight" type="xsd:positiveInteger" use="optional"/>
  <xsd:attribute name="operation" type="sdd-dd:OperationType" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<ReferencedPackageType>
id xsd:ID Throw Away
contentRef xsd:token Yes
weight xsd:positiveInteger Merge
operation <OperationType> Yes
any namespace="##other"  ?
Condition <ConditionType> Yes
RequiredContentSelection <RequiredContentSelectionType> Merge
Arguments <ArgumentListType> Merge
OutputVariables <OutputVariableListType> Merge
Requirements <RequirementsType> Merge
ResultingResourceMap <ResultingResourceMapType> Merge
ResultingChangeMap <ResultingChangeMapType> Merge
RequiredResourceMap <ResourceMapType> Merge
Languages <LanguagesType> Merge
any namespace="##other"  ?

Notes:
If two inputs have different weights, don't include weight in the output.

When comparing contentRefs, compare the Contents pointed to instead of the references themselves.

<FeatureReferenceType>

<xsd:complexType name="FeatureReferenceType">
  <xsd:attribute name="featureRef" type="xsd:IDREF" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<FeatureReferenceType>
featureRef xsd:IDREF Yes
any namespace="##other"  ?

Notes:
When comparing featureReferences, compare the Features pointed to instead of the references themselves.

<GroupType>

<xsd:complexType name="GroupType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DisplayElementGroup" minOccurs="0"/>
    <xsd:element name="SelectedFeature" type="sdd-dd:FeatureReferenceType" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="default" type="xsd:boolean" use="optional" default="false"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<GroupType>
id xsd:ID Throw Away
default xsd:boolean Merge
any namespace="##other"  ?
DisplayElementGroup DisplayElementGroup Merge
SelectedFeature <FeatureReferenceType> Yes
any namespace="##other"  ?

Notes:
Merge default by performing a logical OR. The resulting SDD can only have one instance of default=true, so a check for multiple must be performed. If more than one true is found, all instances should be set to false.

<GroupsType>

<xsd:complexType name="GroupsType">
  <xsd:sequence>
    <xsd:element name="Group" type="sdd-dd:GroupType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<GroupsType>
Group <GroupType> Merge

<MultiplicityConstraintType>

<xsd:simpleType name="MultiplicityConstraintType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="same"/>
    <xsd:enumeration value="unique"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<MultiplicityConstraintType> xsd:NCName Yes

<DependencyType>

<xsd:simpleType name="DependencyType">
  <xsd:restriction base="xsd:NCName">
    <xsd:enumeration value="pre-req"/>
    <xsd:enumeration value="co-req"/>
    <xsd:enumeration value="ex-req"/>
  </xsd:restriction>
</xsd:simpleType>
Type Element Attribute Data Type Compare?
<DependencyType> xsd:NCName Yes{Center}

<InternalDependencyType>

<xsd:complexType name="InternalDependencyType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="type" type="sdd-dd:DependencyType" use="optional" default="pre-req"/>
  <xsd:attribute name="contentElementRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="contentElementRefOperation" type="sdd-dd:OperationListType" use="optional"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<InternalDependencyType>
type <DependencyType> Yes
contentElementRef xsd:IDREF Yes
contentElementRefOperation <OperationListType> Yes
any namespace="##other"  ?
DescriptionGroup DescriptionGroup Merge

Notes:
Compare the ContentElement pointed to by the contentElementRef, not the reference itself.

<LanguageSelectionsType>

<xsd:complexType name="LanguageSelectionsType">
  <xsd:sequence>
    <xsd:element name="Mandatory" type="sdd-dd:LanguagesType" minOccurs="0"/>
    <xsd:element name="Optional" type="sdd-dd:OptionalLanguagesType" minOccurs="0" />
  </xsd:sequence>
</xsd:complexType>	
Type Element Attribute Data Type Compare?
<LanguageSelectionsType>
Mandatory <LanguagesType> Merge
Optional <OptionalLanguagesType> Merge

<OptionalLanguagesType>

<xsd:complexType name="OptionalLanguagesType">
  <xsd:choice maxOccurs="unbounded">
    <xsd:element name="Language" type="sdd-dd:LanguageType"/>
    <xsd:element name="LanguageSet" type="sdd-dd:LanguageSetType"/>
  </xsd:choice>
</xsd:complexType>	
Type Element Attribute Data Type Compare?
<OptionalLanguagesType>
Language <LanguageType> Merge
LanguageSet <LanguageSetType> Merge

<RelationshipConstraintType>

<xsd:complexType name="RelationshipConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
    <xsd:element name="Property" type="sdd-dd:PropertyType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="relatedResourceRef" type="xsd:IDREF" use="optional"/>
  <xsd:attribute name="type" type="xsd:QName" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RelationshipConstraintType>
relatedResourceRef xsd:IDREF Yes
type xsd:QName Yes
any namespace="##other"  ?
DescriptionGroup DescriptionGroup Merge
Property <PropertyType> Yes

Notes:
The comparison of relatedResourceRef involves comparing the Resource pointed to, not the reference itself.

<RelationshipType>

<xsd:complexType name="RelationshipType">
  <xsd:sequence>
    <xsd:element name="Property" type="sdd-dd:PropertyType" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="relatedResourceRef" type="xsd:IDREF" use="required"/>
  <xsd:attribute name="type" type="xsd:QName" use="required"/>
  <xsd:anyAttribute namespace="##other" processContents="lax"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<RelationshipType>
relatedResourceRef xsd:IDREF Yes
type xsd:QName Yes
any namespace="##other"  ?
Property <PropertyType> Yes
any namespace="##other"  ?

Notes:
Compare the Resources pointed to by the relatedResourceRef, not the references themselves.

<UniquenessConstraintType>

<xsd:complexType name="UniquenessConstraintType">
  <xsd:sequence>
    <xsd:group ref="sdd-dd:DescriptionGroup" minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="distinctResourceRef" type="xsd:IDREF" use="required"/>
</xsd:complexType>
Type Element Attribute Data Type Compare?
<UniquenessConstraintType>
distinctResourceRef xsd:IDREF Yes
DescriptionGroup DescriptionGroup Merge

Notes:
The comparison of distinceResourceRef involves comparing the Resource pointed to, not the reference itself.


Notes on Lineage Calculation

When calculating the lineage of an SDD element, it is necessary to include the element's ancestors and the children of those ancestors. When determining which children to include and how far down each child's tree to go, the basic logic is: Follow the Yeses. That means that only children whose Compare column is Yes in the above tables should be included in the lineage calculation, and only the Yes children of those children should be included, and so on. If a particular child has all Merge or No children, then walking down that branch should stop there.