1

Can we create a group and refer to element of that group?

For example, we have a group say

<xs:group name="custGroup">
  <xs:sequence>
    <xs:element name="customerId" type="xs:string"/>
    <xs:element name="customerName" type="xs:string"/>
    <xs:element name="Address1" type="xs:string"/>
    <xs:element name="Address2" type="xs:string"/>
    <xs:element name="mobile" type="xs:string"/>
  </xs:sequence>
</xs:group>

Suppose I want to create another element to have only customerId and mobile:

<xs:element name="custBrief">
  <xs:sequence>
    <xs:element name="customerId" type="xs:string"/>
    <xs:element name="mobile" type="xs:string"/>
  </xs:sequence>
</xs:element>

So, I should be able to refer to custGroup.

kjhughes
  • 106,133
  • 27
  • 181
  • 240
Y.Vim
  • 11
  • 1

2 Answers2

0

Option 1: Re-use parts of your group by declaring the constituent elements by reference rather than by name:

<xs:group name="custGroup">
  <xs:sequence>
    <xs:element ref="customerId"/>
    <xs:element ref="customerName"/>
    <xs:element ref="Address1"/>
    <xs:element ref="Address2"/>
    <xs:element ref="mobile"/>
  </xs:sequence>
</xs:group>

<xs:element name="customerId" type="xs:string"/>
<xs:element name="customerName" type="xs:string"/>
<xs:element name="Address1" type="xs:string"/>
<xs:element name="Address2" type="xs:string"/>
<xs:element name="mobile" type="xs:string"/>

This way, your second, similar group can at least share the global declarations of the referenced elements:

<xs:element name="custBrief">
  <xs:sequence>
    <xs:element ref="customerId"/>
    <xs:element ref="mobile"/>
  </xs:sequence>
</xs:element>

Option 2: Use subgroups:

<xs:group name="custGroup">
  <xs:sequence>
    <xs:group ref="custBriefGroup"/>
    <xs:element ref="customerName"/>
    <xs:element ref="Address1"/>
    <xs:element ref="Address2"/>
  </xs:sequence>
</xs:group>

<xs:group name="custBriefGroup">
  <xs:sequence>
    <xs:element name="customerId" type="xs:string"/>
    <xs:element name="mobile" type="xs:string"/>
  </xs:sequence>
</xs:group>

<xs:element name="custBrief">
  <xs:sequence>
    <xs:group ref="custBriefGroup"/>
  </xs:sequence>
</xs:element>

This way, custBriefGroup is defined in one place an re-used.

Note that I took liberties with re-arranging element ordering.

See also: The difference between <all> <sequence> <choice> and <group> in XSD?

kjhughes
  • 106,133
  • 27
  • 181
  • 240
0

You're mixing two different schema construction models here.

You can assemble a type from a set of building blocks by using model groups.

You can "subset" a type by using derivation-by-restriction.

But you can't mix the two in the way you are attempting.

Michael Kay
  • 156,231
  • 11
  • 92
  • 164