Search code examples
xmlxsdxsd-validationmsxmlxsd-1.0

validate pipe-separated string in XSD


I have a use case where I need to validate pipe-separated string in XSD attribute value.

Example: XML Attribute

<Fruits Names="Apple|Grapes|Banana">

I want to write a XSD pattern where Fruits attribute Name allows following and other valid combination from above 3 values.

Apple
Banana
Grapes
Apple|Banana
Grapes|Banana
Apple|Grapes
Banana|Grapes
Grapes|apple
Apple|Grapes|Banana

I currently wrote something like

    <xs:simpleType name="Fruits">
        <xs:restriction base="xs:string">
            <xs:pattern value="Apple*|Grapes*|Banana" ></xs:pattern>
        </xs:restriction>
    </xs:simpleType>

I want to use this in C#, so I guess I can only use XSD 1.0.


Solution

  • I'd recommend that you give up the | separator and use space () instead.

    I.e:

    <Fruits Names="Apple Grapes Banana"/>
    

    Then, the following XSD will meet your requirements:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Fruits">
        <xs:complexType>
          <xs:attribute name="Names">
            <xs:simpleType>
              <xs:list itemType="FruitTypes"/>
            </xs:simpleType>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:simpleType name="FruitTypes">
        <xs:restriction base="xs:string">
          <xs:enumeration value="Apple"/>
          <xs:enumeration value="Grapes"/>
          <xs:enumeration value="BAnana"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>