| Home | Products | Issue Tracker | Service Providers | FAQ | Twitter | Download

# Working Around the LibXML2 XSD Schema GML Bug

## Issue

TinyOWS makes use of GML, an XML-based language that encodes geometry. Frequently the input and the output of TinyOWS are in GML.

Even if LibXML2 is a great lib, older versions (i.e previous to 2.8) didn’t handled correctly GML 3.1.1 XSD Schema (see https://bugzilla.gnome.org/show_bug.cgi?id=630130).

## Workaround and options

For TinyOWS users, you have several options

- Take a recent libxml2 version (i.e 2.8 or later)

- Patch your oldest copy of LibXML2 release and link TinyOWS against your local copy:

    --- xmlschemas.c.orig   2011-04-24 14:58:16.000000000 +0000
    +++ xmlschemas.c        2011-04-24 15:47:50.000000000 +0000
    @@ -15158,7 +15158,11 @@
       }
       if ( (WXS_IS_LIST(type) || WXS_IS_UNION(type)) &&
           (WXS_IS_RESTRICTION(type) == 0) &&
    -        (! WXS_IS_ANY_SIMPLE_TYPE(baseType))) {
    +        (
    +          (! WXS_IS_ANY_SIMPLE_TYPE(baseType))
    +          && (baseType->type != XML_SCHEMA_TYPE_SIMPLE)
    +        )
    +       ) {
          xmlSchemaPCustomErr(ctxt,
              XML_SCHEMAP_ST_PROPS_CORRECT_1,
              WXS_BASIC_CAST type, NULL,
    }}}

- Modify the XSD GML Schema itself (but you violate the OGC License if you do this!):

    Index: schema/gml/3.1.1/base/valueObjects.xsd
    ===================================================================
    --- schema/gml/3.1.1/base/valueObjects.xsd (revision 550)
    +++ schema/gml/3.1.1/base/valueObjects.xsd (revision 561)
    @@ -200,11 +200,13 @@
            <group name="ValueExtent">
                    <choice>
    +<!--
                            <element ref="gml:CategoryExtent"/>
                            <element ref="gml:QuantityExtent"/>
    +-->
                            <element ref="gml:CountExtent"/>
                    </choice>
            </group>
    -       <!-- ======================================================================
    -       <element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:_Value"> -->
    +       <!-- ======================================================================
    +       <element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:_Value">
            <element name="QuantityExtent" type="gml:QuantityExtentType">
                    <annotation>
    @@ -212,5 +214,4 @@
                    </annotation>
            </element>
    -       <!-- -->
            <complexType name="QuantityExtentType">
                    <annotation>
    @@ -223,6 +224,7 @@
                    </simpleContent>
            </complexType>
    +-->
            <!-- ======================================================================
    -       <element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:_Value"> -->
    +       <element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:_Value">
            <element name="CategoryExtent" type="gml:CategoryExtentType">
                    <annotation>
    @@ -230,5 +232,4 @@
                    </annotation>
            </element>
    -       <!-- -->
            <complexType name="CategoryExtentType">
                    <annotation>
    @@ -241,4 +242,5 @@
                    </simpleContent>
            </complexType>
    +-->
            <!-- ======================================================================
            <element name="CountExtent" type="gml:CountExtentType" substitutionGroup="gml:_Value"> -->

- Or choose to use only GML 2.1.2 in the meantime.