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.