[owslib] 01/05: New upstream version 0.15.0

Johan Van de Wauw johanvdw-guest at moszumanska.debian.org
Tue Sep 19 20:02:28 UTC 2017


This is an automated email from the git hooks/post-receive script.

johanvdw-guest pushed a commit to branch master
in repository owslib.

commit 9904dd30171fe6967f102cc83fb0017f1cb608e0
Author: Johan Van de Wauw <johan at gisky.be>
Date:   Sun Sep 17 22:09:06 2017 +0200

    New upstream version 0.15.0
---
 .travis.yml                                 |   2 +-
 VERSION.txt                                 |   2 +-
 owslib/__init__.py                          |   2 +-
 owslib/csw.py                               |   4 +-
 owslib/feature/__init__.py                  |   2 +-
 owslib/feature/wfs110.py                    |  11 +-
 owslib/feature/wfs200.py                    |  29 +-
 owslib/iso.py                               |  27 +
 owslib/{iso.py => iso_che.py}               |  74 ++-
 owslib/map/wms130.py                        |   6 +-
 owslib/ows.py                               |  10 +-
 owslib/sos.py                               |  31 +-
 owslib/swe/common.py                        |  30 +-
 owslib/swe/observation/sos100.py            |   2 +-
 owslib/util.py                              |  40 +-
 owslib/wcs.py                               |  10 +-
 owslib/wfs.py                               |  10 +-
 owslib/wms.py                               |   8 +-
 owslib/wmts.py                              |  36 +-
 owslib/wps.py                               |  97 ++-
 tests/doctests/csw_linz.txt                 |  12 +-
 tests/doctests/iso_che.txt                  |  26 +
 tests/doctests/tms.txt                      |  20 +-
 tests/doctests/util.txt                     |  24 +
 tests/doctests/wcs_thredds.txt              |   7 +-
 tests/doctests/wms_getmap.txt               |   4 +-
 tests/doctests/wmts.txt                     |  13 +-
 tests/doctests/wmts_geoserver21.txt         |  10 +
 tests/doctests/wps_request11_bbox.txt       |  28 +
 tests/resources/geoserver21-wmts-cap.xml    |  20 +
 tests/resources/iso_che.xml                 | 926 ++++++++++++++++++++++++++++
 tests/resources/wps_EmuExecuteRequest11.xml |   1 +
 32 files changed, 1403 insertions(+), 121 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index f84133f..a28b025 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,8 @@
 language: python
 python:
-  - "2.6"
   - "2.7"
   - "3.4"
+  - "3.6"
 #  - "pypy"
 sudo: false
 env:
diff --git a/VERSION.txt b/VERSION.txt
index a803cc2..a551051 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-0.14.0
+0.15.0
diff --git a/owslib/__init__.py b/owslib/__init__.py
index b7f5c8d..219c087 100644
--- a/owslib/__init__.py
+++ b/owslib/__init__.py
@@ -1,3 +1,3 @@
 from __future__ import (absolute_import, division, print_function)
 
-__version__ = '0.14.0'
+__version__ = '0.15.0'
diff --git a/owslib/csw.py b/owslib/csw.py
index 1fa7da6..8847328 100644
--- a/owslib/csw.py
+++ b/owslib/csw.py
@@ -68,7 +68,7 @@ class CatalogueServiceWeb(object):
 
         """
 
-        self.url = url
+        self.url = util.clean_ows_url(url)
         self.lang = lang
         self.version = version
         self.timeout = timeout
@@ -649,7 +649,7 @@ class CatalogueServiceWeb(object):
                             # Well, just use the first one.
                             request_url = post_verbs[0].get('url')
                     elif len(post_verbs) == 1:
-                        request_post_url = post_verbs[0].get('url')
+                        request_url = post_verbs[0].get('url')
             except:  # no such luck, just go with request_url
                 pass
 
diff --git a/owslib/feature/__init__.py b/owslib/feature/__init__.py
index 8505088..28ba7d8 100644
--- a/owslib/feature/__init__.py
+++ b/owslib/feature/__init__.py
@@ -150,7 +150,7 @@ class WebFeatureService_(object):
         if outputFormat is not None:
             request["outputFormat"] = outputFormat
 
-        data = urlencode(request)
+        data = urlencode(request, doseq=True)
 
         return base_url+data
 
diff --git a/owslib/feature/wfs110.py b/owslib/feature/wfs110.py
index b112d66..5d35569 100644
--- a/owslib/feature/wfs110.py
+++ b/owslib/feature/wfs110.py
@@ -299,10 +299,13 @@ class ContentMetadata:
         self.boundingBoxWGS84 = None
         b = BoundingBox(elem.find(nspath_eval('ows:WGS84BoundingBox', namespaces)), namespaces['ows'])
         if b is not None:
-            self.boundingBoxWGS84 = (
-                    float(b.minx), float(b.miny),
-                    float(b.maxx), float(b.maxy),
-                    )
+            try:
+                self.boundingBoxWGS84 = (
+                        float(b.minx), float(b.miny),
+                        float(b.maxx), float(b.maxy),
+                        )
+            except TypeError:
+                self.boundingBoxWGS84 = None
         # crs options
         self.crsOptions = [Crs(srs.text) for srs in elem.findall(nspath_eval('wfs:OtherSRS', namespaces))]
         dsrs = testXMLValue(elem.find(nspath_eval('wfs:DefaultSRS', namespaces)))
diff --git a/owslib/feature/wfs200.py b/owslib/feature/wfs200.py
index 2fdc1a6..8153583 100644
--- a/owslib/feature/wfs200.py
+++ b/owslib/feature/wfs200.py
@@ -377,19 +377,22 @@ class ContentMetadata:
         self.boundingBoxWGS84 = None
         b = elem.find(nspath('WGS84BoundingBox',ns=OWS_NAMESPACE))
         if b is not None:
-            lc = b.find(nspath("LowerCorner",ns=OWS_NAMESPACE))
-            uc = b.find(nspath("UpperCorner",ns=OWS_NAMESPACE))
-            ll = [float(s) for s in lc.text.split()]
-            ur = [float(s) for s in uc.text.split()]
-            self.boundingBoxWGS84 = (ll[0],ll[1],ur[0],ur[1])
-
-        # there is no such think as bounding box
-        # make copy of the WGS84BoundingBox
-        self.boundingBox = (self.boundingBoxWGS84[0],
-                            self.boundingBoxWGS84[1],
-                            self.boundingBoxWGS84[2],
-                            self.boundingBoxWGS84[3],
-                            Crs("epsg:4326"))
+            try:
+                lc = b.find(nspath("LowerCorner",ns=OWS_NAMESPACE))
+                uc = b.find(nspath("UpperCorner",ns=OWS_NAMESPACE))
+                ll = [float(s) for s in lc.text.split()]
+                ur = [float(s) for s in uc.text.split()]
+                self.boundingBoxWGS84 = (ll[0],ll[1],ur[0],ur[1])
+
+                # there is no such think as bounding box
+                # make copy of the WGS84BoundingBox
+                self.boundingBox = (self.boundingBoxWGS84[0],
+                                    self.boundingBoxWGS84[1],
+                                    self.boundingBoxWGS84[2],
+                                    self.boundingBoxWGS84[3],
+                                    Crs("epsg:4326"))
+            except AttributeError:
+                self.boundingBoxWGS84 = None
         # crs options
         self.crsOptions = [Crs(srs.text) for srs in elem.findall(nspath('OtherCRS',ns=WFS_NAMESPACE))]
         defaultCrs =  elem.findall(nspath('DefaultCRS',ns=WFS_NAMESPACE))
diff --git a/owslib/iso.py b/owslib/iso.py
index c23b2dc..fbd855b 100644
--- a/owslib/iso.py
+++ b/owslib/iso.py
@@ -44,6 +44,7 @@ class MD_Metadata(object):
             self.datetimestamp = None
             self.stdname = None
             self.stdver = None
+            self.locales = []
             self.referencesystem = None
             self.identification = None
             self.serviceidentification = None
@@ -96,6 +97,10 @@ class MD_Metadata(object):
             val = md.find(util.nspath_eval('gmd:metadataStandardVersion/gco:CharacterString', namespaces))
             self.stdver = util.testXMLValue(val)
 
+            self.locales = []
+            for i in md.findall(util.nspath_eval('gmd:locale/gmd:PT_Locale', namespaces)):
+                self.locales.append(PT_Locale(i))
+
             val = md.find(util.nspath_eval('gmd:referenceSystemInfo/gmd:MD_ReferenceSystem', namespaces))
             if val is not None:
                 self.referencesystem = MD_ReferenceSystem(val)
@@ -148,6 +153,28 @@ class MD_Metadata(object):
             else:
                 self.dataquality = None
 
+    def get_default_locale(self):
+        """ get default gmd:PT_Locale based on gmd:language """
+
+        for loc in self.locales:
+            if loc.languagecode == self.language:
+                return loc
+        return None
+
+
+class PT_Locale(object):
+    """ process PT_Locale """
+
+    def __init__(self, md=None):
+        if md is None:
+            self.id = None
+            self.languagecode = None
+            self.charset = None
+        else:
+            self.id = md.attrib.get('id')
+            self.languagecode = md.find(util.nspath_eval('gmd:languageCode/gmd:LanguageCode', namespaces)).attrib.get('codeListValue')
+            self.charset = md.find(util.nspath_eval('gmd:characterEncoding/gmd:MD_CharacterSetCode', namespaces)).attrib.get('codeListValue')
+
 class CI_Date(object):
     """ process CI_Date """
     def __init__(self, md=None):
diff --git a/owslib/iso.py b/owslib/iso_che.py
similarity index 92%
copy from owslib/iso.py
copy to owslib/iso_che.py
index c23b2dc..bc8b53b 100644
--- a/owslib/iso.py
+++ b/owslib/iso_che.py
@@ -21,12 +21,13 @@ from owslib.namespaces import Namespaces
 def get_namespaces():
     n = Namespaces()
     ns = n.get_namespaces(["gco","gmd","gml","gml32","gmx","gts","srv","xlink"])
+    ns["che"] = 'http://www.geocat.ch/2008/che'
     ns[None] = n.get_namespace("gmd")
     return ns
 namespaces = get_namespaces()
 
 
-class MD_Metadata(object):
+class CHE_MD_Metadata(object):
     """ Process gmd:MD_Metadata """
     def __init__(self, md=None):
 
@@ -44,6 +45,7 @@ class MD_Metadata(object):
             self.datetimestamp = None
             self.stdname = None
             self.stdver = None
+            self.locales = []
             self.referencesystem = None
             self.identification = None
             self.serviceidentification = None
@@ -83,7 +85,7 @@ class MD_Metadata(object):
             self.hierarchy = _testCodeListValue(md.find(util.nspath_eval('gmd:hierarchyLevel/gmd:MD_ScopeCode', namespaces)))
 
             self.contact = []
-            for i in md.findall(util.nspath_eval('gmd:contact/gmd:CI_ResponsibleParty', namespaces)):
+            for i in md.findall(util.nspath_eval('gmd:contact/che:CHE_CI_ResponsibleParty', namespaces)):
                 o = CI_ResponsibleParty(i)
                 self.contact.append(o)
 
@@ -96,6 +98,10 @@ class MD_Metadata(object):
             val = md.find(util.nspath_eval('gmd:metadataStandardVersion/gco:CharacterString', namespaces))
             self.stdver = util.testXMLValue(val)
 
+            self.locales = []
+            for i in md.findall(util.nspath_eval('gmd:locale/gmd:PT_Locale', namespaces)):
+                self.locales.append(PT_Locale(i))
+
             val = md.find(util.nspath_eval('gmd:referenceSystemInfo/gmd:MD_ReferenceSystem', namespaces))
             if val is not None:
                 self.referencesystem = MD_ReferenceSystem(val)
@@ -110,7 +116,7 @@ class MD_Metadata(object):
                 'Please see https://github.com/geopython/OWSLib/issues/38 for more information',
                 FutureWarning)
 
-            val = md.find(util.nspath_eval('gmd:identificationInfo/gmd:MD_DataIdentification', namespaces))
+            val = md.find(util.nspath_eval('gmd:identificationInfo/che:CHE_MD_DataIdentification', namespaces))
             val2 = md.find(util.nspath_eval('gmd:identificationInfo/srv:SV_ServiceIdentification', namespaces))
 
             if val is not None:
@@ -128,7 +134,7 @@ class MD_Metadata(object):
                 if len(idinfo) > 0:
                     val = list(idinfo)[0]
                     tagval = util.xmltag_split(val.tag)
-                    if tagval == 'MD_DataIdentification':
+                    if tagval == 'CHE_MD_DataIdentification':
                         self.identificationinfo.append(MD_DataIdentification(val, 'dataset'))
                     elif tagval == 'MD_ServiceIdentification':
                         self.identificationinfo.append(MD_DataIdentification(val, 'service'))
@@ -148,6 +154,29 @@ class MD_Metadata(object):
             else:
                 self.dataquality = None
 
+    def get_default_locale(self):
+        """ get default gmd:PT_Locale based on gmd:language """
+
+        for loc in self.locales:
+            if loc.languagecode == self.language:
+                return loc
+        return None
+
+
+class PT_Locale(object):
+    """ process PT_Locale """
+
+    def __init__(self, md=None):
+        if md is None:
+            self.id = None
+            self.languagecode = None
+            self.charset = None
+        else:
+            self.id = md.attrib.get('id')
+            self.languagecode = md.find(util.nspath_eval('gmd:languageCode/gmd:LanguageCode', namespaces)).attrib.get('codeListValue')
+            self.charset = md.find(util.nspath_eval('gmd:characterEncoding/gmd:MD_CharacterSetCode', namespaces)).attrib.get('codeListValue')
+    
+
 class CI_Date(object):
     """ process CI_Date """
     def __init__(self, md=None):
@@ -196,31 +225,40 @@ class CI_ResponsibleParty(object):
             val = md.find(util.nspath_eval('gmd:positionName/gco:CharacterString', namespaces))
             self.position = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:voice/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:phone/che:CHE_CI_Telephone/gmd:voice/gco:CharacterString', namespaces))
 
             self.phone = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:facsimile/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:phone/che:CHE_CI_Telephone/gmd:facsimile/gco:CharacterString', namespaces))
             self.fax = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:deliveryPoint/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:deliveryPoint/gco:CharacterString', namespaces))
             self.address = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:city/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:city/gco:CharacterString', namespaces))
             self.city = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:administrativeArea/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:administrativeArea/gco:CharacterString', namespaces))
             self.region = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:postalCode/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:postalCode/gco:CharacterString', namespaces))
             self.postcode = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:country/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:country/gco:CharacterString', namespaces))
             self.country = util.testXMLValue(val)
 
-            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress/gco:CharacterString', namespaces))
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/gmd:electronicMailAddress/gco:CharacterString', namespaces))
             self.email = util.testXMLValue(val)
 
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/che:streetName/gco:CharacterString', namespaces))
+            self.streetname = util.testXMLValue(val)
+
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/che:streetNumber/gco:CharacterString', namespaces))
+            self.streetnumber = util.testXMLValue(val)
+
+            val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:address/che:CHE_CI_Address/che:postBox/gco:CharacterString', namespaces))
+            self.postbox = util.testXMLValue(val)
+
             val = md.find(util.nspath_eval('gmd:contactInfo/gmd:CI_Contact/gmd:onlineResource/gmd:CI_OnlineResource', namespaces))
             if val is not None:
               self.onlineresource = CI_OnlineResource(val)
@@ -403,7 +441,7 @@ class MD_DataIdentification(object):
             self.creator = []
             self.publisher = []
             self.contributor = []
-            for val in md.findall(util.nspath_eval('gmd:pointOfContact/gmd:CI_ResponsibleParty', namespaces)):
+            for val in md.findall(util.nspath_eval('gmd:pointOfContact/che:CHE_CI_ResponsibleParty', namespaces)):
                 role = val.find(util.nspath_eval('gmd:role/gmd:CI_RoleCode', namespaces))
                 if role is not None:
                     clv = _testCodeListValue(role)
@@ -433,7 +471,7 @@ class MD_DataIdentification(object):
             self.status = _testCodeListValue(md.find(util.nspath_eval('gmd:status/gmd:MD_ProgressCode', namespaces)))
 
             self.contact = []
-            for i in md.findall(util.nspath_eval('gmd:pointOfContact/gmd:CI_ResponsibleParty', namespaces)):
+            for i in md.findall(util.nspath_eval('gmd:pointOfContact/che:CHE_CI_ResponsibleParty', namespaces)):
                 o = CI_ResponsibleParty(i)
                 self.contact.append(o)
 
@@ -528,7 +566,7 @@ class MD_Distributor(object):
             self.online = []
         else:
             self.contact = None
-            val = md.find(util.nspath_eval('gmd:MD_Distributor/gmd:distributorContact/gmd:CI_ResponsibleParty', namespaces))
+            val = md.find(util.nspath_eval('gmd:MD_Distributor/gmd:distributorContact/che:CHE_CI_ResponsibleParty', namespaces))
             if val is not None:
                 self.contact = CI_ResponsibleParty(val)
 
@@ -640,7 +678,7 @@ class SV_ServiceIdentification(object):
             self.abstract = util.testXMLValue(val)
 
             self.contact = None
-            val = md.find(util.nspath_eval('gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty', namespaces))
+            val = md.find(util.nspath_eval('gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/che:CHE_CI_ResponsibleParty', namespaces))
             if val is not None:
                 self.contact = CI_ResponsibleParty(val)
 
@@ -700,7 +738,9 @@ class CI_OnlineResource(object):
             self.description = None
             self.function = None
         else:
-            val = md.find(util.nspath_eval('gmd:linkage/gmd:URL', namespaces))
+            val = md.find(util.nspath_eval('gmd:linkage/che:PT_FreeURL/che:URLGroup/che:LocalisedURL', namespaces))
+            if val is None:
+                val = md.find(util.nspath_eval('gmd:linkage/gmd:URL', namespaces))
             self.url = util.testXMLValue(val)
 
             val = md.find(util.nspath_eval('gmd:protocol/gco:CharacterString', namespaces))
diff --git a/owslib/map/wms130.py b/owslib/map/wms130.py
index 8329ced..39ad318 100644
--- a/owslib/map/wms130.py
+++ b/owslib/map/wms130.py
@@ -599,8 +599,10 @@ class ContentMetadata(object):
         self.timepositions = None
         self.defaulttimeposition = None
         time_dimension = None
+
         for dim in elem.findall(nspath('Dimension', WMS_NAMESPACE)):
-            if dim.attrib.get('name') is not None:
+            dim_name = dim.attrib.get('name')
+            if dim_name is not None and dim_name.lower() == 'time':
                 time_dimension = dim
         if time_dimension is not None:
             self.timepositions = time_dimension.text.split(',') if time_dimension.text else None
@@ -610,7 +612,7 @@ class ContentMetadata(object):
         self.elevations = None
         elev_dimension = None
         for dim in elem.findall(nspath('Dimension', WMS_NAMESPACE)):
-            if dim.attrib.get('elevation') is not None:
+            if dim.attrib.get('name') == 'elevation':
                 elev_dimension = dim
         if elev_dimension is not None:
             self.elevations = [e.strip() for e in elev_dimension.text.split(',')] if elev_dimension.text else None
diff --git a/owslib/ows.py b/owslib/ows.py
index d5a155d..1db285d 100644
--- a/owslib/ows.py
+++ b/owslib/ows.py
@@ -17,9 +17,14 @@ Currently supports version 1.1.0 (06-121r3).
 
 from __future__ import (absolute_import, division, print_function)
 
+import logging
+
 from owslib.etree import etree
 from owslib import crs, util
 from owslib.namespaces import Namespaces
+
+LOGGER = logging.getLogger(__name__)
+
 n = Namespaces()
 
 OWS_NAMESPACE_1_0_0 = n.get_namespace("ows")
@@ -215,9 +220,10 @@ class BoundingBox(object):
         self.maxy = None
 
         val = elem.attrib.get('crs')
-        if val is not None:
+        try:
             self.crs = crs.Crs(val)
-        else:
+        except (AttributeError, ValueError):
+            LOGGER.warning('Invalid CRS %r. Expected integer')
             self.crs = None
 
         val = elem.attrib.get('dimensions')
diff --git a/owslib/sos.py b/owslib/sos.py
index c3e15d1..15989a6 100644
--- a/owslib/sos.py
+++ b/owslib/sos.py
@@ -14,12 +14,31 @@ Sensor Observation Service (SOS) methods and metadata. Factory function.
 from __future__ import (absolute_import, division, print_function)
 
 from .swe.observation import sos100, sos200
+from .util import clean_ows_url
 
 
-def SensorObservationService(url, version='1.0.0', xml=None):
-    """sos factory function, returns a version specific SensorObservationService object"""
-    if version in  ['1.0', '1.0.0']:
-        return sos100.SensorObservationService_1_0_0.__new__(sos100.SensorObservationService_1_0_0, url, version, xml)
-    elif version in ['2.0', '2.0.0']:
-        return sos200.SensorObservationService_2_0_0.__new__(sos200.SensorObservationService_2_0_0, url, version, xml)
+def SensorObservationService(url,
+                             version='1.0.0',
+                             xml=None,
+                             username=None,
+                             password=None,):
+    """
+    SOS factory function
+    :param url: url of capabilities document
+    :param version: SOS version 1.0.0 or 2.0.0
+    :param xml: elementtree object
+    :param username: username allowed to handle with SOS
+    :param password: password for the username
+    :return: a version specific SensorObservationService object
+    """
+
+    clean_url = clean_ows_url(url)
 
+    if version in ['1.0', '1.0.0']:
+        return sos100.SensorObservationService_1_0_0.__new__(
+            sos100.SensorObservationService_1_0_0, clean_url, version,
+            xml, username, password)
+    elif version in ['2.0', '2.0.0']:
+        return sos200.SensorObservationService_2_0_0.__new__(
+            sos200.SensorObservationService_2_0_0, clean_url, version,
+            xml, username, password)
diff --git a/owslib/swe/common.py b/owslib/swe/common.py
index ea11064..e378ca4 100644
--- a/owslib/swe/common.py
+++ b/owslib/swe/common.py
@@ -9,6 +9,9 @@ from datetime import timedelta
 
 from owslib.etree import etree
 
+import inspect
+from sys import modules
+
 def get_namespaces():
     ns = Namespaces()
     return ns.get_namespaces(["swe20", "xlink"])
@@ -69,8 +72,15 @@ class NamedObject(object):
         # No call to super(), the type object will process that.
         self.name           = testXMLAttribute(element, "name")
         try:
-            self.content    = eval(element[-1].tag.split("}")[-1])(element[-1])
-        except IndexError:
+            # attempt to find a class with the same name as the XML tag parsed
+            # which is also contained within this module.
+            # Ideally the classes should be explicitly whitelisted, but I
+            # don't know what the set of possible classes to dispatch to should
+            # be
+            self.content = obj_mapping[element[-1].tag.split("}")[-1]](
+                                                                    element[-1])
+
+        except (IndexError, KeyError):
             self.content    = None
         except BaseException:
             raise
@@ -268,6 +278,10 @@ def get_time(value, referenceTime, uom):
         elif value.lower() == "-inf":
             value  = NegativeInfiniteDateTime()
 
+    # Usually due to not finding the element
+    except TypeError:
+        value = None
+
     return value
 
 class Time(AbstractSimpleComponent):
@@ -284,8 +298,10 @@ class Time(AbstractSimpleComponent):
         # Attributes
         self.localFrame         = testXMLAttribute(element,"localFrame")                                    # anyURI, optional
         try:
-            self.referenceTime  = parser.parse(testXMLAttribute(element,"referenceTime"))                   # dateTime, optional
-        except (AttributeError, ValueError):
+            self.referenceTime  = parser.parse(testXMLAttribute(element,
+                                                                "referenceTime")
+                                               ) # dateTime, optional
+        except (AttributeError, ValueError, TypeError):
             self.referenceTime  = None
 
         value                   = testXMLValue(element.find(nspv("swe20:value")))                           # TimePosition, min=0, max=1
@@ -306,7 +322,7 @@ class TimeRange(AbstractSimpleComponent):
         self.localFrame         = testXMLAttribute(element,"localFrame")                                # anyURI, optional
         try:
             self.referenceTime  = parser.parse(testXMLAttribute(element,"referenceTime"))               # dateTime, optional
-        except (AttributeError, ValueError):
+        except (AttributeError, ValueError, TypeError):
             self.referenceTime  = None
 
         values                  = make_pair(testXMLValue(element.find(nspv("swe20:value"))))            # TimePosition, min=0, max=1
@@ -410,3 +426,7 @@ class XMLEncoding(AbstractEncoding):
 class BinaryEncoding(AbstractEncoding):
     def __init__(self, element):
         raise NotImplementedError
+
+# TODO: Individually whitelist valid classes which correspond to XML tags
+obj_mapping = {name: obj for name, obj in inspect.getmembers(modules[__name__],
+                                                             inspect.isclass)}
diff --git a/owslib/swe/observation/sos100.py b/owslib/swe/observation/sos100.py
index 7920582..9bf9f0e 100644
--- a/owslib/swe/observation/sos100.py
+++ b/owslib/swe/observation/sos100.py
@@ -27,7 +27,7 @@ class SensorObservationService_1_0_0(object):
         Implements ISensorObservationService.
     """
 
-    def __new__(self,url, version, xml=None, username=None, password=None):
+    def __new__(self, url, version, xml=None, username=None, password=None):
         """overridden __new__ method"""
         obj=object.__new__(self)
         obj.__init__(url, version, xml, username, password)
diff --git a/owslib/util.py b/owslib/util.py
index 0eb6813..206b1ed 100644
--- a/owslib/util.py
+++ b/owslib/util.py
@@ -15,11 +15,7 @@ from datetime import datetime
 import pytz
 from owslib.etree import etree, ParseError
 from owslib.namespaces import Namespaces
-try:                    # Python 3
-    from urllib.parse import urlsplit, urlencode
-except ImportError:     # Python 2
-    from urlparse import urlsplit
-    from urllib import urlencode
+from six.moves.urllib.parse import urlsplit, urlencode, urlparse, parse_qs, urlunparse
 
 try:
     from StringIO import StringIO  # Python 2
@@ -133,7 +129,7 @@ class ResponseWrapper(object):
         return self._response.content
 
     def geturl(self):
-        return self._response.url
+        return self._response.url.replace('&&', '&')
 
     # @TODO: __getattribute__ for poking at response
 
@@ -573,6 +569,38 @@ def strip_bom(raw_text):
     return raw_text
 
 
+def clean_ows_url(url):
+    """
+    clean an OWS URL of basic service elements
+
+    source: https://stackoverflow.com/a/11640565
+    """
+
+    if url is None or not url.startswith('http'):
+        return url
+
+    filtered_kvp = {}
+    basic_service_elements = ('service', 'version', 'request')
+
+    parsed = urlparse(url)
+    qd = parse_qs(parsed.query, keep_blank_values=True)
+
+    for key, value in qd.items():
+        if key.lower() not in basic_service_elements:
+            filtered_kvp[key] = value
+
+    newurl = urlunparse([
+        parsed.scheme,
+        parsed.netloc,
+        parsed.path,
+        parsed.params,
+        urlencode(filtered_kvp, doseq=True),
+        parsed.fragment
+    ])
+
+    return newurl
+
+
 def bind_url(url):
     """binds an HTTP GET query string endpiont"""
     if url.find('?') == -1: # like http://host/wms
diff --git a/owslib/wcs.py b/owslib/wcs.py
index b67e771..1be0863 100644
--- a/owslib/wcs.py
+++ b/owslib/wcs.py
@@ -17,7 +17,7 @@ from __future__ import (absolute_import, division, print_function)
 
 from . import etree
 from .coverage import wcs100, wcs110, wcs111, wcsBase
-from owslib.util import openURL
+from owslib.util import clean_ows_url, openURL
 
 
 def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30):
@@ -33,9 +33,11 @@ def WebCoverageService(url, version=None, xml=None, cookies=None, timeout=30):
         version = capabilities.get('version')
         del capabilities
 
+    clean_url = clean_ows_url(url)
+
     if version == '1.0.0':
-        return wcs100.WebCoverageService_1_0_0.__new__(wcs100.WebCoverageService_1_0_0, url, xml, cookies)
+        return wcs100.WebCoverageService_1_0_0.__new__(wcs100.WebCoverageService_1_0_0, clean_url, xml, cookies)
     elif version == '1.1.0':
-        return wcs110.WebCoverageService_1_1_0.__new__(wcs110.WebCoverageService_1_1_0,url, xml, cookies)
+        return wcs110.WebCoverageService_1_1_0.__new__(wcs110.WebCoverageService_1_1_0, clean_url, xml, cookies)
     elif version == '1.1.1':
-        return wcs111.WebCoverageService_1_1_1.__new__(wcs111.WebCoverageService_1_1_1,url, xml, cookies)
+        return wcs111.WebCoverageService_1_1_1.__new__(wcs111.WebCoverageService_1_1_1, clean_url, xml, cookies)
diff --git a/owslib/wfs.py b/owslib/wfs.py
index 8550bbb..e27ca43 100644
--- a/owslib/wfs.py
+++ b/owslib/wfs.py
@@ -16,6 +16,7 @@ Web Feature Server (WFS) methods and metadata. Factory function.
 from __future__ import (absolute_import, division, print_function)
 
 from .feature import wfs100, wfs110, wfs200
+from .util import clean_ows_url
 
 
 def WebFeatureService(url, version='1.0.0', xml=None, parse_remote_metadata=False,
@@ -33,18 +34,21 @@ def WebFeatureService(url, version='1.0.0', xml=None, parse_remote_metadata=Fals
     @param password: service authentication password
     @return: initialized WebFeatureService_2_0_0 object
     '''
+
+    clean_url = clean_ows_url(url)
+
     if version in  ['1.0', '1.0.0']:
-        return wfs100.WebFeatureService_1_0_0(url, version, xml, parse_remote_metadata,
+        return wfs100.WebFeatureService_1_0_0(clean_url, version, xml, parse_remote_metadata,
                                               timeout=timeout,
                                               username=username,
                                               password=password)
     elif version in  ['1.1', '1.1.0']:
-        return wfs110.WebFeatureService_1_1_0(url, version, xml, parse_remote_metadata,
+        return wfs110.WebFeatureService_1_1_0(clean_url, version, xml, parse_remote_metadata,
                                               timeout=timeout,
                                               username=username,
                                               password=password)
     elif version in ['2.0', '2.0.0']:
-        return wfs200.WebFeatureService_2_0_0(url,  version, xml, parse_remote_metadata,
+        return wfs200.WebFeatureService_2_0_0(clean_url, version, xml, parse_remote_metadata,
                                               timeout=timeout,
                                               username=username,
                                               password=password)
diff --git a/owslib/wms.py b/owslib/wms.py
index 10c6394..1697879 100644
--- a/owslib/wms.py
+++ b/owslib/wms.py
@@ -17,6 +17,7 @@ Currently supports only version 1.1.1 of the WMS protocol.
 
 from __future__ import (absolute_import, division, print_function)
 from .map import wms111, wms130
+from .util import clean_ows_url
 
 
 def WebMapService(url,
@@ -39,13 +40,16 @@ def WebMapService(url,
     @param timeout: time (in seconds) after which requests should timeout
     @return: initialized WebFeatureService_2_0_0 object
     '''
+
+    clean_url = clean_ows_url(url)
+
     if version in ['1.1.1']:
-        return wms111.WebMapService_1_1_1(url, version=version, xml=xml,
+        return wms111.WebMapService_1_1_1(clean_url, version=version, xml=xml,
                                           parse_remote_metadata=parse_remote_metadata,
                                           username=username, password=password,
                                           timeout=timeout, headers=headers)
     elif version in ['1.3.0']:
-        return wms130.WebMapService_1_3_0(url, version=version, xml=xml,
+        return wms130.WebMapService_1_3_0(clean_url, version=version, xml=xml,
                                           parse_remote_metadata=parse_remote_metadata,
                                           username=username, password=password,
                                           timeout=timeout, headers=headers)
diff --git a/owslib/wmts.py b/owslib/wmts.py
index 716790a..ec7a5c2 100644
--- a/owslib/wmts.py
+++ b/owslib/wmts.py
@@ -42,7 +42,7 @@ except ImportError:      # Python 2
     from urllib import urlencode
     from urlparse import urlparse, urlunparse, parse_qs, ParseResult
 from .etree import etree
-from .util import openURL, testXMLValue, getXMLInteger
+from .util import clean_ows_url, openURL, testXMLValue, getXMLInteger
 from .fgdc import Metadata
 from .iso import MD_Metadata
 from .ows import ServiceProvider, ServiceIdentification, OperationsMetadata
@@ -52,6 +52,9 @@ _OWS_NS = '{http://www.opengis.net/ows/1.1}'
 _WMTS_NS = '{http://www.opengis.net/wmts/1.0}'
 _XLINK_NS = '{http://www.w3.org/1999/xlink}'
 
+# OpenGIS Web Map Tile Service (WMTS) Implementation Standard
+# Version 1.0.0, document 07-057r7
+
 _ABSTRACT_TAG = _OWS_NS + 'Abstract'
 _IDENTIFIER_TAG = _OWS_NS + 'Identifier'
 _LOWER_CORNER_TAG = _OWS_NS + 'LowerCorner'
@@ -77,7 +80,11 @@ _MIN_TILE_ROW_TAG = _WMTS_NS + 'MinTileRow'
 _RESOURCE_URL_TAG = _WMTS_NS + 'ResourceURL'
 _SCALE_DENOMINATOR_TAG = _WMTS_NS + 'ScaleDenominator'
 _SERVICE_METADATA_URL_TAG = _WMTS_NS + 'ServiceMetadataURL'
+
+# Table 7, page 20-21, Parts of Style data structure
 _STYLE_TAG = _WMTS_NS + 'Style'
+_STYLE_LEGEND_URL = _WMTS_NS + 'LegendURL'
+
 _THEME_TAG = _WMTS_NS + 'Theme'
 _THEMES_TAG = _WMTS_NS + 'Themes'
 _TILE_HEIGHT_TAG = _WMTS_NS + 'TileHeight'
@@ -152,7 +159,7 @@ class WebMapTileService(object):
             requests.
 
         """
-        self.url = url
+        self.url = clean_ows_url(url)
         self.username = username
         self.password = password
         self.version = version
@@ -729,12 +736,33 @@ class ContentMetadata:
             style = {}
             isdefaulttext = s.attrib.get('isDefault')
             style['isDefault'] = (isdefaulttext == "true")
-            identifier = s.find(_IDENTIFIER_TAG)
+            identifier = s.find(_IDENTIFIER_TAG)  # one and mandatory
             if identifier is None:
                 raise ValueError('%s missing identifier' % (s,))
+
             title = s.find(_TITLE_TAG)
             if title is not None:
-                style['title'] = title.text
+                style['title'] = testXMLValue(title)
+
+            abstract = s.find(_ABSTRACT_TAG)
+            if abstract is not None:
+                style['abstract'] = testXMLValue(abstract)
+
+            legendURL = s.find(_STYLE_LEGEND_URL)
+            if legendURL is not None:
+                style['legend'] = legendURL.attrib[_HREF_TAG]
+                if 'width' in legendURL.attrib.keys():
+                    style['width'] = legendURL.attrib.get('width')
+                if 'height' in legendURL.attrib.keys():
+                    style['height'] = legendURL.attrib.get('height')
+                if 'format' in legendURL.attrib.keys():
+                    style['format'] = legendURL.attrib.get('format')
+
+            keywords = [f.text for f in s.findall(
+                        _KEYWORDS_TAG+'/'+_KEYWORD_TAG)]
+            if keywords:  # keywords is a list []
+                style['keywords'] = keywords
+
             self.styles[identifier.text] = style
 
         self.formats = [f.text for f in elem.findall(_FORMAT_TAG)]
diff --git a/owslib/wps.py b/owslib/wps.py
index 849d340..c16e288 100644
--- a/owslib/wps.py
+++ b/owslib/wps.py
@@ -89,7 +89,7 @@ from __future__ import (absolute_import, division, print_function)
 from owslib.etree import etree
 from owslib.ows import DEFAULT_OWS_NAMESPACE, ServiceIdentification, ServiceProvider, OperationsMetadata, BoundingBox
 from time import sleep
-from owslib.util import (testXMLValue, build_get_url, dump, getTypedValue,
+from owslib.util import (testXMLValue, build_get_url, clean_ows_url, dump, getTypedValue,
                          getNamespace, element_to_string, nspath, openURL, nspath_eval, log)
 from xml.dom.minidom import parseString
 from owslib.namespaces import Namespaces
@@ -151,11 +151,18 @@ def is_literaldata(val):
     return is_str
 
 
+def is_boundingboxdata(val):
+    """
+    Checks if the provided value is an implementation of ``BoundingBoxDataInput``.
+    """
+    return isinstance(val, BoundingBoxDataInput)
+
+
 def is_complexdata(val):
     """
-    Checks if the provided value is an implementation of IComplexData.
+    Checks if the provided value is an implementation of ``IComplexDataInput``.
     """
-    return hasattr(val, 'getXml')
+    return isinstance(val, IComplexDataInput)
 
 
 class IComplexDataInput(object):
@@ -188,7 +195,7 @@ class WebProcessingService(object):
         """
 
         # fields passed in from object initializer
-        self.url = url
+        self.url = clean_ows_url(url)
         self.username = username
         self.password = password
         self.version = version
@@ -584,6 +591,8 @@ class WPSExecution():
             elif is_complexdata(val):
                 log.debug("complexdata %s", key)
                 inputElement.append(val.getXml())
+            elif is_boundingboxdata(val):
+                inputElement.append(val.get_xml())
             else:
                 raise Exception(
                     'input type of "%s" parameter is unknown' % key)
@@ -688,14 +697,14 @@ class WPSExecution():
         """
 
         if self.isSucceded():
-            content = ''
+            content = b''
             for output in self.processOutputs:
 
                 output_content = output.retrieveData(
                     self.username, self.password)
 
                 # ExecuteResponse contains reference to server-side output
-                if output_content is not "":
+                if output_content is not b'':
                     content = content + output_content
                     if filepath is None:
                         filepath = output.fileName
@@ -925,8 +934,9 @@ class InputOutput(object):
             for sub_element in literal_data_element:
                 subns = getNamespace(sub_element)
                 if sub_element.tag.endswith('DataType'):
-                    self.dataType = sub_element.get(
-                        nspath("reference", ns=subns)).split(':')[-1]
+                    reference = sub_element.get(nspath("reference", ns=subns)) or sub_element.text
+                    if reference and ':' in reference:
+                        self.dataType = reference.split(':')[-1]
 
             for sub_element in literal_data_element:
 
@@ -1122,7 +1132,7 @@ class Output(InputOutput):
         # <ComplexData> or <ComplexOutput>
         self._parseComplexData(outputElement, 'ComplexOutput')
 
-        # <BoundingBoxData>
+        # <BoundingBoxOutput>
         self._parseBoundingBoxData(outputElement, 'BoundingBoxOutput')
 
         # <Data>
@@ -1162,10 +1172,10 @@ class Output(InputOutput):
         # OWS BoundingBox:
         #
         # <wps:Data>
-        #   <wps:BoundingBoxData crs="EPSG:4326" dimensions="2">
+        #   <ows:BoundingBox crs="EPSG:4326" dimensions="2">
         #     <ows:LowerCorner>0.0 -90.0</ows:LowerCorner>
         #     <ows:UpperCorner>180.0 90.0</ows:UpperCorner>
-        #   </wps:BoundingBoxData>
+        #   </ows:BoundingBox>
         # </wps:Data>
         #
         dataElement = outputElement.find(nspath('Data', ns=wpsns))
@@ -1185,19 +1195,15 @@ class Output(InputOutput):
                 self.dataType = literalDataElement.get('dataType')
                 if literalDataElement.text is not None and literalDataElement.text.strip() is not '':
                     self.data.append(literalDataElement.text.strip())
-            bboxDataElement = dataElement.find(
-                nspath('BoundingBoxData', ns=wpsns))
+            bboxDataElement = dataElement.find(nspath('BoundingBox', ns=namespaces['ows']))
+            if not bboxDataElement:
+                # TODO: just a workaround for data-inputs in lineage
+                bboxDataElement = dataElement.find(nspath('BoundingBoxData', ns=namespaces['wps']))
             if bboxDataElement is not None:
                 self.dataType = "BoundingBoxData"
                 bbox = BoundingBox(bboxDataElement)
-                if bbox is not None and bbox.minx is not None:
-                    bbox_value = None
-                    if bbox.crs is not None and bbox.crs.axisorder == 'yx':
-                        bbox_value = "{0},{1},{2},{3}".format(bbox.miny, bbox.minx, bbox.maxy, bbox.maxx)
-                    else:
-                        bbox_value = "{0},{1},{2},{3}".format(bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)
-                    log.debug("bbox=%s", bbox_value)
-                    self.data.append(bbox_value)
+                if bbox:
+                    self.data.append(bbox)
 
     def retrieveData(self, username=None, password=None):
         """
@@ -1333,6 +1339,55 @@ class Process(object):
                 dump(self.processOutputs[-1],  prefix='\tOutput: ')
 
 
+class BoundingBoxDataInput(object):
+    """
+    Data input class for ``wps:BoundingBoxData``.
+
+    :param list data: Coordinates of lower and upper corner. Example [10, 50, 20, 60]
+    with lower corner=[10, 50] and upper corner=[20, 60].
+    :param string crs: Name of coordinate reference system. Default: "epsg:4326".
+    """
+    def __init__(self, data, crs=None, dimensions=2):
+        if isinstance(data, list):
+            self.data = data
+        else:
+            # convenience method for string input
+            self.data = [float(number) for number in data.split(',')]
+        self.lower_corner = (self.data[0], self.data[1])
+        self.upper_corner = (self.data[2], self.data[3])
+        self.dimensions = dimensions
+        self.crs = crs or 'epsg:4326'
+
+    def get_xml(self):
+        """
+        Method that returns the object data as an XML snippet,
+        to be inserted into the WPS request document sent to the server.
+        """
+        '''
+        <wps:Data>
+            <wps:BoundingBoxData crs="EPSG:4326" dimenstions="2">
+                <ows:LowerCorner>51.9 7.0</ows:LowerCorner>
+                <ows:UpperCorner>53.0 8.0</ows:UpperCorner>
+            </wps:BoundingBoxData>
+        </wps:Data>
+        '''
+        data_el = etree.Element(nspath_eval('wps:Data', namespaces))
+        attrib = dict()
+        if self.crs:
+            attrib['crs'] = self.crs
+        if self.dimensions:
+            attrib['dimensions'] = str(self.dimensions)
+        bbox_el = etree.SubElement(
+            data_el, nspath_eval('wps:BoundingBoxData', namespaces), attrib=attrib)
+        lc_el = etree.SubElement(
+            bbox_el, nspath_eval('ows:LowerCorner', namespaces))
+        lc_el.text = "{0[0]} {0[1]}".format(self.lower_corner)
+        uc_el = etree.SubElement(
+            bbox_el, nspath_eval('ows:UpperCorner', namespaces))
+        uc_el.text = "{0[0]} {0[1]}".format(self.upper_corner)
+        return data_el
+
+
 class ComplexDataInput(IComplexDataInput, ComplexData):
 
     def __init__(self, value, mimeType=None, encoding=None, schema=None):
diff --git a/tests/doctests/csw_linz.txt b/tests/doctests/csw_linz.txt
index 4f54da4..23ef532 100644
--- a/tests/doctests/csw_linz.txt
+++ b/tests/doctests/csw_linz.txt
@@ -34,13 +34,13 @@ Imports
     >>> c.getrecords2([prop], outputschema='http://www.isotc211.org/2005/gmd', maxrecords=2)
     >>> c.results['returned']
     2
-    >>> c.records['a60f479b-f0b0-b728-8ba3-d7f4187c126d'].identification.title
-    'Land elevation points (Hydro, 1:22k - 1:90k)'
-    >>> c.records['a60f479b-f0b0-b728-8ba3-d7f4187c126d'].identifier
-    'a60f479b-f0b0-b728-8ba3-d7f4187c126d'
-    >>> c.records['a60f479b-f0b0-b728-8ba3-d7f4187c126d'].stdname
+    >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identification.title
+    'Unsurveyed area polygon (Hydro, 1:1.5mil and smaller)'
+    >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].identifier
+    'e4625e24-899e-4aed-c9d0-e4e341bf9d4b'
+    >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdname
     'ISO19115'
-    >>> c.records['a60f479b-f0b0-b728-8ba3-d7f4187c126d'].stdver
+    >>> c.records['e4625e24-899e-4aed-c9d0-e4e341bf9d4b'].stdver
     '2003/Cor.1:2006'
     >>> c.harvest('somefile','someuri')     #doctest: +IGNORE_EXCEPTION_DETAIL
     Traceback (most recent call last):
diff --git a/tests/doctests/iso_che.txt b/tests/doctests/iso_che.txt
new file mode 100644
index 0000000..c18db22
--- /dev/null
+++ b/tests/doctests/iso_che.txt
@@ -0,0 +1,26 @@
+    >>> from owslib.etree import etree
+    >>> from owslib.iso_che import CHE_MD_Metadata
+    >>> from tests.utils import resource_file
+
+    >>> m = CHE_MD_Metadata(etree.parse(resource_file('iso_che.xml')))
+
+    >>> m.language
+    'ger'
+    >>> [loc.id for loc in m.locales]
+    ['DE', 'FR', 'IT', 'EN']
+    >>> m.get_default_locale().id
+    'DE'
+    >>> m.identification.title
+    u'Gew\xe4sserschutzkarte'
+    >>> m.identification.contact[0].organization
+    u'Amt f\xfcr Umweltschutz'
+    >>> m.contact[0].organization
+    'Grundbuch- und Vermessungsamt'
+    >>> m.contact[0].streetname
+    'Aabachstrasse'
+    >>> m.contact[0].streetnumber
+    '5'
+    >>> m.contact[0].postbox
+    '857'
+    >>> [link.url for link in m.distribution.online]
+    ['http://www.zugmap.ch/?link=gewaesserschutzkarte']
diff --git a/tests/doctests/tms.txt b/tests/doctests/tms.txt
index 3804e72..7b026e1 100644
--- a/tests/doctests/tms.txt
+++ b/tests/doctests/tms.txt
@@ -8,7 +8,7 @@ http://svn.osgeo.org/gdal/trunk/gdal/frmts/wms/WMSServerList.txt
 
 Find out what a TMS has to offer. Service metadata:
 
-    >>> service = tms.TileMapService('http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0', timeout=120)
+    >>> service = tms.TileMapService('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0', timeout=120)
     >>> service.identification.title
     'Tile Map Service'
     >>> service.identification.abstract
@@ -18,32 +18,32 @@ Find out what a TMS has to offer. Service metadata:
     >>> service.identification.version
     '1.0.0'
     >>> service.identification.url
-    'http://demo.opengeo.org/geoserver/gwc/'
+    'http://odims.ospar.org/geoserver/gwc/'
     >>> len(service.contents) > 0
     True
-    >>> tm = service.contents['http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/nasa%3Abluemarble@EPSG%3A4326@png']
+    >>> tm = service.contents['http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3Aospar_offshore_renewables_2010_01@EPSG%3A4326@png']
     >>> tm.title
-    'bluemarble'
+    'ospar_offshore_renewables_2010_01'
 
 you can filter the contents by profile and srs:
     >>> len(service.items())
-    57
+    664
     >>> len(service.items('EPSG:900913'))
-    27
+    332
     >>> len(service.items(profile='global-mercator'))
-    27
+    332
     >>> len(service.items('EPSG:900913', profile='global-mercator'))
-    27
+    332
     >>> len(service.items('EPSG:4326', profile='global-mercator'))
     0
     >>> sorted(service.items('EPSG:4326'))[0]  # doctest: +ELLIPSIS
-    ('http://demo.opengeo.org/geoserver/gwc/service/tms/1.0.0/maps%3Adark@EPSG%3A4326@jpeg', <owslib.tms.ContentMetadata object at ...>)
+    ('http://odims.ospar.org/geoserver/gwc/service/tms/1.0.0/geonode%3AMarine_protected_area__OSPAR____Global_view__polygon_@EPSG%3A4326@gif', <owslib.tms.ContentMetadata object at ...>)
 
 The details of the TileMap are fetched on demand
     >>> tm._tile_map == None
     True
     >>> tm.title
-    'bluemarble'
+    'ospar_offshore_renewables_2010_01'
     >>> tm.abstract
     >>> tm._tile_map == None
     False
diff --git a/tests/doctests/util.txt b/tests/doctests/util.txt
new file mode 100644
index 0000000..636086a
--- /dev/null
+++ b/tests/doctests/util.txt
@@ -0,0 +1,24 @@
+
+Imports
+
+    >>> from __future__ import (absolute_import, division, print_function)
+    >>> from owslib.util import clean_ows_url
+
+Tests
+
+    >>> clean_ows_url('http//example.org/wms')
+    'http//example.org/wms'
+    >>> clean_ows_url('http//example.org/wms?service=WMS')
+    'http//example.org/wms'
+    >>> clean_ows_url('http//example.org/wms?SERVICE=WMS')
+    'http//example.org/wms'
+    >>> clean_ows_url('http//example.org/wms?SeRvIcE=WMS')
+    'http//example.org/wms'
+    >>> clean_ows_url('http//example.org/wms?SeRvIcE=WMS&version=1.3.0&request=GetCapabilities')
+    'http//example.org/wms'
+    >>> clean_ows_url('http//example.org/wms?foo=bar&SeRvIcE=WMS&version=1.3.0&request=GetCapabilities')
+    'http//example.org/wms?foo=bar'
+    >>> clean_ows_url('http://example.org/wms?map=/path/to/foo.map&SERVICE=WMS&version=1.3.0&request=GetCapabilities')
+    'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map'
+    >>> clean_ows_url('http://example.org/wms?map=/path/to/foo.map&foo=bar&&SERVICE=WMS&version=1.3.0&request=GetCapabilities')
+    'http://example.org/wms?map=%2Fpath%2Fto%2Ffoo.map&foo=bar'
diff --git a/tests/doctests/wcs_thredds.txt b/tests/doctests/wcs_thredds.txt
index 3ab518e..f1ff9fe 100644
--- a/tests/doctests/wcs_thredds.txt
+++ b/tests/doctests/wcs_thredds.txt
@@ -49,7 +49,7 @@ Print the ids of all layers (actually just the first 3):
     >>> cvg=wcs['Temperature_tropopause']
 
     >>> cvg.boundingBoxWGS84
-    (-153.58891112103777, 11.747698396806157, -48.598408556239576, 57.484319872365305)
+    (-153.58889168336785, 11.747698754311253, -48.59839139638086, 57.48431804715324)
 
     >>> len(cvg.timepositions)>1 #The old test kept failing as the response timepositions kept changign on the server
     True
@@ -73,11 +73,10 @@ Print the ids of all layers (actually just the first 3):
     ['92', '64']
 
     >>> cvg.grid.origin
-    ['-4223.61279296875', '-832.2073364257812']
+    ['-4223.61181640625', '-832.2075805664062']
 
     >>> cvg.grid.offsetvectors
-    [['81.27100405485734', '0.0'], ['0.0', '81.27100086212158']]
-
+    [['81.27100140115489', '0.0'], ['0.0', '81.27100467681885']]
 
 #Now we have enough information to build a getCoverage request:
     >>> covID='Temperature_tropopause'
diff --git a/tests/doctests/wms_getmap.txt b/tests/doctests/wms_getmap.txt
index 8a9a563..4110604 100644
--- a/tests/doctests/wms_getmap.txt
+++ b/tests/doctests/wms_getmap.txt
@@ -40,10 +40,10 @@ GetMap 1.3.0 ServiceException for an invalid CRS
     ...     assert "msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers." in str(e)
 
 National Map
-    >>> url = 'http://services.nationalmap.gov/arcgis/services/SmallScale100Meter/SmallScaleTreeCanopyWMS/MapServer/WMSServer'
+    >>> url = 'https://services.nationalmap.gov/ArcGIS/services/geonames/MapServer/WMSServer'
     >>> wms = WebMapService(url, version='1.3.0')
     >>> rsp = wms.getmap(layers=['3'], styles=['default'], srs='CRS:84', bbox=(-176.646, 17.7016, -64.8017, 71.2854), size=(500, 300), format='image/png', transparent=True)
     >>> type(rsp)
     <class '...ResponseWrapper'>
     >>> wms.request
-    'http://services.nationalmap.gov/arcgis/services/SmallScale100Meter/SmallScaleTreeCanopyWMS/MapServer/WmsServer?layers=3&styles=default&service=WMS&crs=CRS%3A84&format=image%2Fpng&request=GetMap&bgcolor=0xFFFFFF&height=300&width=500&version=1.3.0&bbox=-176.646%2C17.7016%2C-64.8017%2C71.2854&exceptions=XML&transparent=TRUE'
+    'https://services.nationalmap.gov/arcgis/services/geonames/MapServer/WmsServer?layers=3&styles=default&service=WMS&crs=CRS%3A84&format=image%2Fpng&request=GetMap&bgcolor=0xFFFFFF&height=300&width=500&version=1.3.0&bbox=-176.646%2C17.7016%2C-64.8017%2C71.2854&exceptions=XML&transparent=TRUE'
diff --git a/tests/doctests/wmts.txt b/tests/doctests/wmts.txt
index 961efd3..cae291b 100644
--- a/tests/doctests/wmts.txt
+++ b/tests/doctests/wmts.txt
@@ -15,7 +15,7 @@ Find out what a WMTS has to offer. Service metadata:
     >>> wmts.identification.title
     'NASA Global Imagery Browse Services for EOSDIS'
     >>> bytearray(wmts.identification.abstract, 'utf-8')
-    bytearray(b'The Global Imagery Browse Services (GIBS) system is a core EOSDIS component which provides a scalable, responsive, highly available, and community standards based set of imagery services.  These services are designed with the goal of advancing user interactions with EOSDIS\xe2\x80\x99 inter-disciplinary data through enhanced visual representation and discovery.')
+    bytearray(b'Near real time imagery from multiple NASA instruments')
     >>> wmts.identification.keywords
     ['World', 'Global']
 
@@ -25,7 +25,7 @@ Service Provider:
     'National Aeronautics and Space Administration'
 
     >>> wmts.provider.url
-    'http://earthdata.nasa.gov/'
+    'https://earthdata.nasa.gov/'
     
 Available Layers:
 
@@ -41,6 +41,13 @@ Fetch a tile (using some defaults):
     >>> bytes_written = out.write(tile.read())
     >>> out.close()
 
-Test a WMTS without a ServiceProvider tag in Capababilities XML
+Test styles for several layers
+    >>> wmts.contents['MLS_SO2_147hPa_Night'].styles
+    {'default': {'isDefault': True, 'title': 'default'}}
+    >>> wmts.contents['MLS_SO2_147hPa_Night'].styles
+    {'default': {'isDefault': True, 'title': 'default'}}
+
+ Test a WMTS without a ServiceProvider tag in Capababilities XML
 
     >>> wmts = WebMapTileService('http://data.geus.dk/arcgis/rest/services/OneGeologyGlobal/S071_G2500_OneGeology/MapServer/WMTS/1.0.0/WMTSCapabilities.xml')
+
diff --git a/tests/doctests/wmts_geoserver21.txt b/tests/doctests/wmts_geoserver21.txt
index 63f3396..2bd294f 100644
--- a/tests/doctests/wmts_geoserver21.txt
+++ b/tests/doctests/wmts_geoserver21.txt
@@ -147,6 +147,16 @@ Test single item accessor
     >>> wmts['geonode:GH_Areas_Protegidas4326'].resourceURLs
     []
 
+Test several layers styles
+    >>> wmts.contents['geonode:MANGROVES'].styles
+    {'MANGROVES': {'isDefault': True}}
+    >>> wmts.contents['geonode:asfalto'].styles
+    {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}}
+    >>> wmts.contents['geonode:hotspots_revisited_2004_polygons'].styles
+    {'hotspots_revisited_2004_polygons': {'title': 'TEST Title: hotspots revisited 2004 polygons', 'abstract': 'TEST Abstract: hotspots revisited 2004 polygons', 'format': 'image/png', 'height': '100', 'width': '100', 'keywords': ['testkeywords1', 'test keywords 2', 'test keywords 3'], 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True}}
+    >>> wmts.contents['geonode:asfalto'].styles
+    {'asfalto': {'format': 'image/png', 'legend': 'http://www.maps.bob/etopo2/legend.png', 'isDefault': True, 'title': 'TEST Title: hotspots revisited 2004 polygons'}}
+
 Test operations
     # TODO
 
diff --git a/tests/doctests/wps_request11_bbox.txt b/tests/doctests/wps_request11_bbox.txt
new file mode 100644
index 0000000..ec50232
--- /dev/null
+++ b/tests/doctests/wps_request11_bbox.txt
@@ -0,0 +1,28 @@
+Python doctest file to test generation of a WPS request from input arguments.
+The specific request involves a "bbox" process submitted to the Emu WPS service
+(https://github.com/bird-house/emu).
+
+Imports
+
+    >>> from __future__ import (absolute_import, division, print_function)
+    >>> from tests.utils import resource_file, compare_xml
+    >>> from owslib.wps import WebProcessingService, WPSExecution, BoundingBoxDataInput
+    >>> from owslib.etree import etree
+
+Process input/output arguments
+
+    >>> processid = "bbox"
+    >>> bbox = BoundingBoxDataInput([51.9, 7.0, 53.0, 8.0])
+    >>> inputs = [ ("bbox", bbox)]
+
+Build XML request for WPS process execution
+
+    >>> execution = WPSExecution()
+    >>> requestElement = execution.buildRequest(processid, inputs)
+    >>> request = etree.tostring( requestElement )
+
+Compare to cached XML request
+
+    >>> _request = open(resource_file('wps_EmuExecuteRequest11.xml'), 'rb').read()
+    >>> compare_xml(request, _request)
+    True
diff --git a/tests/resources/geoserver21-wmts-cap.xml b/tests/resources/geoserver21-wmts-cap.xml
index b3d6178..ddd3a60 100644
--- a/tests/resources/geoserver21-wmts-cap.xml
+++ b/tests/resources/geoserver21-wmts-cap.xml
@@ -470,6 +470,19 @@ http://www.lme.noaa.gov/index.php?option=com_content&view=article&id=177
     <ows:Identifier>geonode:hotspots_revisited_2004_polygons</ows:Identifier>
     <Style isDefault="true">
       <ows:Identifier>hotspots_revisited_2004_polygons</ows:Identifier>
+      <!--
+        NOTE: tags has been copied here to test the styles LegendURL.
+        LegendURL copied and modified from 07-057r7_Web_Map_Tile_Service_Standard.pdf, page 33
+      -->
+      <ows:Title>TEST Title: hotspots revisited 2004 polygons</ows:Title>
+      <ows:Abstract>TEST Abstract: hotspots revisited 2004 polygons</ows:Abstract>
+      <ows:Keywords>
+        <ows:Keyword>testkeywords1</ows:Keyword>
+        <ows:Keyword>test keywords 2</ows:Keyword>
+        <ows:Keyword>test keywords 3</ows:Keyword>
+      </ows:Keywords>
+      <LegendURL format="image/png" width="100" height="100" xlink:href="http://www.maps.bob/etopo2/legend.png" />
+      <!-- END customization -->
     </Style>
     <Format>image/png</Format>
     <Format>image/jpeg</Format>
@@ -864,6 +877,13 @@ http://www.lme.noaa.gov/index.php?option=com_content&view=article&id=177
     <ows:Identifier>geonode:asfalto</ows:Identifier>
     <Style isDefault="true">
       <ows:Identifier>asfalto</ows:Identifier>
+      <!--
+        NOTE: tags has been copied here to test the styles LegendURL.
+        LegendURL copied and modified from 07-057r7_Web_Map_Tile_Service_Standard.pdf, page 33
+      -->
+      <ows:Title>TEST Title: hotspots revisited 2004 polygons</ows:Title>
+      <LegendURL format="image/png" xlink:href="http://www.maps.bob/etopo2/legend.png" />
+      <!-- END customization -->
     </Style>
     <Format>image/png</Format>
     <Format>image/jpeg</Format>
diff --git a/tests/resources/iso_che.xml b/tests/resources/iso_che.xml
new file mode 100644
index 0000000..1fc2e2d
--- /dev/null
+++ b/tests/resources/iso_che.xml
@@ -0,0 +1,926 @@
+<?xml version="1.0" encoding="UTF-8"?>
+  <che:CHE_MD_Metadata xmlns:che="http://www.geocat.ch/2008/che" xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:geonet="http://www.fao.org/geonetwork" gco:isoType="gmd:MD_Metadata">
+    <gmd:fileIdentifier>
+      <gco:CharacterString>3d2981af-d5db-4122-8db6-1ea41ed44b3f</gco:CharacterString>
+    </gmd:fileIdentifier>
+    <gmd:language xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gco:CharacterString>ger</gco:CharacterString>
+    </gmd:language>
+    <gmd:characterSet xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+    </gmd:characterSet>
+    <gmd:hierarchyLevel xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" />
+    </gmd:hierarchyLevel>
+    <gmd:contact xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:show="embed">
+      <che:CHE_CI_ResponsibleParty gco:isoType="gmd:CI_ResponsibleParty">
+        <gmd:organisationName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+          <gco:CharacterString>Grundbuch- und Vermessungsamt</gco:CharacterString>
+          <gmd:PT_FreeText>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#EN">Grundbuch- und Vermessungsamt</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#DE">Grundbuch- und Vermessungsamt</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#FR">Grundbuch- und Vermessungsamt</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#IT">Grundbuch- und Vermessungsamt</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#RM">Grundbuch- und Vermessungsamt</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+          </gmd:PT_FreeText>
+        </gmd:organisationName>
+        <gmd:contactInfo>
+          <gmd:CI_Contact>
+            <gmd:phone>
+              <che:CHE_CI_Telephone gco:isoType="gmd:CI_Telephone">
+                <gmd:voice>
+                  <gco:CharacterString>041 728 56 00</gco:CharacterString>
+                </gmd:voice>
+                <gmd:facsimile>
+                  <gco:CharacterString>041 728 56 09</gco:CharacterString>
+                </gmd:facsimile>
+              </che:CHE_CI_Telephone>
+            </gmd:phone>
+            <gmd:address>
+              <che:CHE_CI_Address gco:isoType="gmd:CI_Address">
+                <gmd:city>
+                  <gco:CharacterString>Zug</gco:CharacterString>
+                </gmd:city>
+                <gmd:administrativeArea>
+                  <gco:CharacterString>Zug</gco:CharacterString>
+                </gmd:administrativeArea>
+                <gmd:postalCode>
+                  <gco:CharacterString>6301</gco:CharacterString>
+                </gmd:postalCode>
+                <gmd:country>
+                  <gco:CharacterString>CH</gco:CharacterString>
+                </gmd:country>
+                <gmd:electronicMailAddress>
+                  <gco:CharacterString>info.gva at zg.ch</gco:CharacterString>
+                </gmd:electronicMailAddress>
+                <che:streetName>
+                  <gco:CharacterString>Aabachstrasse</gco:CharacterString>
+                </che:streetName>
+                <che:streetNumber>
+                  <gco:CharacterString>5</gco:CharacterString>
+                </che:streetNumber>
+                <che:postBox>
+                  <gco:CharacterString>857</gco:CharacterString>
+                </che:postBox>
+              </che:CHE_CI_Address>
+            </gmd:address>
+            <gmd:onlineResource>
+              <gmd:CI_OnlineResource>
+                <gmd:linkage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="che:PT_FreeURL_PropertyType">
+                  <che:PT_FreeURL>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#EN">http://www.zg.ch/gva</che:LocalisedURL>
+                    </che:URLGroup>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#DE">http://www.zg.ch/gva</che:LocalisedURL>
+                    </che:URLGroup>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#FR">http://www.zg.ch/gva</che:LocalisedURL>
+                    </che:URLGroup>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#IT">http://www.zg.ch/gva</che:LocalisedURL>
+                    </che:URLGroup>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#RM">http://www.zg.ch/gva</che:LocalisedURL>
+                    </che:URLGroup>
+                  </che:PT_FreeURL>
+                </gmd:linkage>
+                <gmd:protocol>
+                  <gco:CharacterString>text/html</gco:CharacterString>
+                </gmd:protocol>
+              </gmd:CI_OnlineResource>
+            </gmd:onlineResource>
+            <gmd:hoursOfService>
+              <gco:CharacterString>08.00-11.45, 14.00-17.00, montags bis 18.00</gco:CharacterString>
+            </gmd:hoursOfService>
+          </gmd:CI_Contact>
+        </gmd:contactInfo>
+        <gmd:role>
+          <gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="distributor" />
+        </gmd:role>
+        <che:organisationAcronym xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+          <gco:CharacterString>GVA</gco:CharacterString>
+          <gmd:PT_FreeText>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#EN">GVA</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#DE">GVA</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#FR">GVA</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#IT">GVA</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#RM">GVA</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+          </gmd:PT_FreeText>
+        </che:organisationAcronym>
+      </che:CHE_CI_ResponsibleParty>
+    </gmd:contact>
+    <gmd:dateStamp xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gco:DateTime>2017-01-24T12:15:29</gco:DateTime>
+    </gmd:dateStamp>
+    <gmd:metadataStandardName xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gco:CharacterString>GM03 2+</gco:CharacterString>
+    </gmd:metadataStandardName>
+    <gmd:metadataStandardVersion xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gco:CharacterString>1.0</gco:CharacterString>
+    </gmd:metadataStandardVersion>
+    <gmd:locale xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:PT_Locale id="DE">
+        <gmd:languageCode>
+          <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="ger" />
+        </gmd:languageCode>
+        <gmd:characterEncoding>
+          <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+        </gmd:characterEncoding>
+      </gmd:PT_Locale>
+    </gmd:locale>
+    <gmd:locale xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:PT_Locale id="FR">
+        <gmd:languageCode>
+          <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="fre" />
+        </gmd:languageCode>
+        <gmd:characterEncoding>
+          <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+        </gmd:characterEncoding>
+      </gmd:PT_Locale>
+    </gmd:locale>
+    <gmd:locale xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:PT_Locale id="IT">
+        <gmd:languageCode>
+          <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="ita" />
+        </gmd:languageCode>
+        <gmd:characterEncoding>
+          <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+        </gmd:characterEncoding>
+      </gmd:PT_Locale>
+    </gmd:locale>
+    <gmd:locale xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:PT_Locale id="EN">
+        <gmd:languageCode>
+          <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng" />
+        </gmd:languageCode>
+        <gmd:characterEncoding>
+          <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+        </gmd:characterEncoding>
+      </gmd:PT_Locale>
+    </gmd:locale>
+    <gmd:referenceSystemInfo xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <gmd:MD_ReferenceSystem>
+        <gmd:referenceSystemIdentifier>
+          <gmd:RS_Identifier>
+            <gmd:code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>CH-Landeskoordinaten</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">CH-Landeskoordinaten</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:code>
+          </gmd:RS_Identifier>
+        </gmd:referenceSystemIdentifier>
+      </gmd:MD_ReferenceSystem>
+    </gmd:referenceSystemInfo>
+    <gmd:identificationInfo xmlns:comp="http://www.geocat.ch/2003/05/gateway/GM03Comprehensive" xmlns:xalan="http://xml.apache.org/xalan">
+      <che:CHE_MD_DataIdentification gco:isoType="gmd:MD_DataIdentification">
+        <gmd:citation>
+          <gmd:CI_Citation>
+            <gmd:title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Gewässerschutzkarte</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Gewässerschutzkarte</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:title>
+            <gmd:date>
+              <gmd:CI_Date>
+                <gmd:date>
+                  <gco:Date>2017-01-24</gco:Date>
+                </gmd:date>
+                <gmd:dateType>
+                  <gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="revision" />
+                </gmd:dateType>
+              </gmd:CI_Date>
+            </gmd:date>
+            <gmd:date>
+              <gmd:CI_Date>
+                <gmd:date>
+                  <gco:Date>2005-06-14</gco:Date>
+                </gmd:date>
+                <gmd:dateType>
+                  <gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" />
+                </gmd:dateType>
+              </gmd:CI_Date>
+            </gmd:date>
+          </gmd:CI_Citation>
+        </gmd:citation>
+        <gmd:abstract xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+          <gco:CharacterString>Die Gewässerschutzkarte mit den darin aufgeführten besonders gefährdeten Gewässerschutzbereichen, Grundwasserschutzzonen und -arealen dient der nachhaltigen Bewirtschaftung der natürlichen Wasserressourcen. Sie ist damit das entscheidende planerische Instrument für den planerischen Gewässerschutz und wird von den Kantonen erstellt.</gco:CharacterString>
+          <gmd:PT_FreeText>
+            <gmd:textGroup>
+              <gmd:LocalisedCharacterString locale="#DE">Die Gewässerschutzkarte mit den darin aufgeführten besonders gefährdeten Gewässerschutzbereichen, Grundwasserschutzzonen und -arealen dient der nachhaltigen Bewirtschaftung der natürlichen Wasserressourcen. Sie ist damit das entscheidende planerische Instrument für den planerischen Gewässerschutz und wird von den Kantonen erstellt.</gmd:LocalisedCharacterString>
+            </gmd:textGroup>
+          </gmd:PT_FreeText>
+        </gmd:abstract>
+        <gmd:status>
+          <gmd:MD_ProgressCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_ProgressCode" codeListValue="onGoing" />
+        </gmd:status>
+        <gmd:pointOfContact xmlns:xlink="http://www.w3.org/1999/xlink" xlink:show="embed">
+          <che:CHE_CI_ResponsibleParty gco:isoType="gmd:CI_ResponsibleParty">
+            <gmd:organisationName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Amt für Umweltschutz</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">Amt für Umweltschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Amt für Umweltschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">Amt für Umweltschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">Amt für Umweltschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM">Amt für Umweltschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:organisationName>
+            <gmd:contactInfo>
+              <gmd:CI_Contact>
+                <gmd:phone>
+                  <che:CHE_CI_Telephone gco:isoType="gmd:CI_Telephone">
+                    <gmd:voice>
+                      <gco:CharacterString>041 728 53 70</gco:CharacterString>
+                    </gmd:voice>
+                    <gmd:facsimile>
+                      <gco:CharacterString>041 728 53 79</gco:CharacterString>
+                    </gmd:facsimile>
+                  </che:CHE_CI_Telephone>
+                </gmd:phone>
+                <gmd:address>
+                  <che:CHE_CI_Address gco:isoType="gmd:CI_Address">
+                    <gmd:city>
+                      <gco:CharacterString>Zug</gco:CharacterString>
+                    </gmd:city>
+                    <gmd:administrativeArea>
+                      <gco:CharacterString>Zug</gco:CharacterString>
+                    </gmd:administrativeArea>
+                    <gmd:postalCode>
+                      <gco:CharacterString>6301</gco:CharacterString>
+                    </gmd:postalCode>
+                    <gmd:country>
+                      <gco:CharacterString>CH</gco:CharacterString>
+                    </gmd:country>
+                    <gmd:electronicMailAddress>
+                      <gco:CharacterString>info.afu at zg.ch</gco:CharacterString>
+                    </gmd:electronicMailAddress>
+                    <che:streetName>
+                      <gco:CharacterString>Aabachstrasse</gco:CharacterString>
+                    </che:streetName>
+                    <che:streetNumber>
+                      <gco:CharacterString>5</gco:CharacterString>
+                    </che:streetNumber>
+                  </che:CHE_CI_Address>
+                </gmd:address>
+                <gmd:onlineResource>
+                  <gmd:CI_OnlineResource>
+                    <gmd:linkage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="che:PT_FreeURL_PropertyType">
+                      <che:PT_FreeURL>
+                        <che:URLGroup>
+                          <che:LocalisedURL locale="#EN">http://www.zg.ch/afu/</che:LocalisedURL>
+                        </che:URLGroup>
+                        <che:URLGroup>
+                          <che:LocalisedURL locale="#DE">http://www.zg.ch/afu/</che:LocalisedURL>
+                        </che:URLGroup>
+                        <che:URLGroup>
+                          <che:LocalisedURL locale="#FR">http://www.zg.ch/afu/</che:LocalisedURL>
+                        </che:URLGroup>
+                        <che:URLGroup>
+                          <che:LocalisedURL locale="#IT">http://www.zg.ch/afu/</che:LocalisedURL>
+                        </che:URLGroup>
+                        <che:URLGroup>
+                          <che:LocalisedURL locale="#RM">http://www.zg.ch/afu/</che:LocalisedURL>
+                        </che:URLGroup>
+                      </che:PT_FreeURL>
+                    </gmd:linkage>
+                    <gmd:protocol>
+                      <gco:CharacterString>text/html</gco:CharacterString>
+                    </gmd:protocol>
+                  </gmd:CI_OnlineResource>
+                </gmd:onlineResource>
+              </gmd:CI_Contact>
+            </gmd:contactInfo>
+            <gmd:role>
+              <gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="owner" />
+            </gmd:role>
+            <che:organisationAcronym xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>AFU</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">AFU</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">AFU</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">AFU</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">AFU</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM">AFU</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </che:organisationAcronym>
+          </che:CHE_CI_ResponsibleParty>
+        </gmd:pointOfContact>
+        <gmd:graphicOverview>
+          <gmd:MD_BrowseGraphic>
+            <gmd:fileName>
+              <gco:CharacterString>http://www.geocat.ch/geonetwork/srv/ger//resources.get?uuid=3d2981af-d5db-4122-8db6-1ea41ed44b3f&fname=GSK_Geocat.bmp</gco:CharacterString>
+            </gmd:fileName>
+            <gmd:fileDescription xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>large_thumbnail</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">large_thumbnail</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:fileDescription>
+            <gmd:fileType>
+              <gco:CharacterString>bmp</gco:CharacterString>
+            </gmd:fileType>
+          </gmd:MD_BrowseGraphic>
+        </gmd:graphicOverview>
+        <gmd:resourceFormat xmlns:xlink="http://www.w3.org/1999/xlink" xlink:show="embed">
+          <gmd:MD_Format>
+            <gmd:name>
+              <gco:CharacterString>INTERLIS</gco:CharacterString>
+            </gmd:name>
+            <gmd:version>
+              <gco:CharacterString>1</gco:CharacterString>
+            </gmd:version>
+          </gmd:MD_Format>
+        </gmd:resourceFormat>
+        <gmd:descriptiveKeywords xmlns:xlink="http://www.w3.org/1999/xlink">
+          <gmd:MD_Keywords>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Grundwasser</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">groundwater</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Grundwasser</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">acqua sotterranea</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">eaux souterraines</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Gewässer</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">water (geographic)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Gewässer</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">acque (geografia)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">eaux (géographie)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Grundwasserschutz</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">groundwater protection</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Grundwasserschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">protezione delle acque sotterranee</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">protection des réserves d'eau souterraines</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Gewässerschutz</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">water pollution prevention</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Gewässerschutz</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">protezione delle acque</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">prévention de la pollution de l'eau</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Population</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">population (ecological)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Population</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">popolazione (ecologia)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">population (écologique)</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Ressourcennutzung</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">resource utilisation</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Ressourcennutzung</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">utilizzazione di risorse</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">utilisation des ressources</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:type>
+              <gmd:MD_KeywordTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_KeywordTypeCode" codeListValue="_none_" />
+            </gmd:type>
+            <gmd:thesaurusName>
+              <gmd:CI_Citation>
+                <gmd:title>
+                  <gco:CharacterString>GEMET concepts</gco:CharacterString>
+                </gmd:title>
+                <gmd:date>
+                  <gmd:CI_Date>
+                    <gmd:date>
+                      <gco:Date>2015-11-16</gco:Date>
+                    </gmd:date>
+                    <gmd:dateType>
+                      <gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" />
+                    </gmd:dateType>
+                  </gmd:CI_Date>
+                </gmd:date>
+                <gmd:identifier>
+                  <gmd:MD_Identifier>
+                    <gmd:code>
+                      <gmx:Anchor xmlns:gmx="http://www.isotc211.org/2005/gmx" xlink:href="https://www.geocat.ch:443/geonetwork/srv/eng/thesaurus.download?ref=external._none_.gemet">geonetwork.thesaurus.external._none_.gemet</gmx:Anchor>
+                    </gmd:code>
+                  </gmd:MD_Identifier>
+                </gmd:identifier>
+              </gmd:CI_Citation>
+            </gmd:thesaurusName>
+          </gmd:MD_Keywords>
+        </gmd:descriptiveKeywords>
+        <gmd:descriptiveKeywords xmlns:xlink="http://www.w3.org/1999/xlink">
+          <gmd:MD_Keywords>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Bauzone</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">Construction zone</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Bauzone</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">zona edificabile</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">Zone à bâtir</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Nutzungsplanung</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">Land use planning</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Nutzungsplanung</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">Pianificazione dell'utilizzazione</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">Planification de l'utilisation du sol</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Grundwasserschutzzone</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">groundwater protection zone</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Grundwasserschutzzone</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">zona di protezione delle acque sotterranee</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">zone de protection des eaux souterraines</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Richtplanung</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">Structural planning</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Richtplanung</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">Pianificazione direttrice</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">Planification directrice</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Gewässerschutzbereich</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">water protection sector</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Gewässerschutzbereich</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">settore di protezione delle acque</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">secteur de protection des eaux</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:keyword xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Grundwasserschutzareal</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">groundwater protection area</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Grundwasserschutzareal</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">area di protezione delle acque sotterranee</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">périmètre de protection des eaux souterraines</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM" />
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:keyword>
+            <gmd:type>
+              <gmd:MD_KeywordTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_KeywordTypeCode" codeListValue="_none_" />
+            </gmd:type>
+            <gmd:thesaurusName>
+              <gmd:CI_Citation>
+                <gmd:title>
+                  <gco:CharacterString>geocat.ch Thesaurus</gco:CharacterString>
+                </gmd:title>
+                <gmd:date>
+                  <gmd:CI_Date>
+                    <gmd:date>
+                      <gco:Date>2017-03-22</gco:Date>
+                    </gmd:date>
+                    <gmd:dateType>
+                      <gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" />
+                    </gmd:dateType>
+                  </gmd:CI_Date>
+                </gmd:date>
+                <gmd:identifier>
+                  <gmd:MD_Identifier>
+                    <gmd:code>
+                      <gmx:Anchor xmlns:gmx="http://www.isotc211.org/2005/gmx" xlink:href="https://www.geocat.ch:443/geonetwork/srv/eng/thesaurus.download?ref=local._none_.geocat.ch">geonetwork.thesaurus.local._none_.geocat.ch</gmx:Anchor>
+                    </gmd:code>
+                  </gmd:MD_Identifier>
+                </gmd:identifier>
+              </gmd:CI_Citation>
+            </gmd:thesaurusName>
+          </gmd:MD_Keywords>
+        </gmd:descriptiveKeywords>
+        <gmd:spatialRepresentationType>
+          <gmd:MD_SpatialRepresentationTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_SpatialRepresentationTypeCode" codeListValue="paperMap" />
+        </gmd:spatialRepresentationType>
+        <gmd:language>
+          <gco:CharacterString>ger</gco:CharacterString>
+        </gmd:language>
+        <gmd:characterSet>
+          <gmd:MD_CharacterSetCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" />
+        </gmd:characterSet>
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory />
+        <gmd:topicCategory>
+          <gmd:MD_TopicCategoryCode>environment</gmd:MD_TopicCategoryCode>
+        </gmd:topicCategory>
+        <gmd:topicCategory>
+          <gmd:MD_TopicCategoryCode>environment_EnvironmentalProtection</gmd:MD_TopicCategoryCode>
+        </gmd:topicCategory>
+        <gmd:topicCategory>
+          <gmd:MD_TopicCategoryCode>economy</gmd:MD_TopicCategoryCode>
+        </gmd:topicCategory>
+        <gmd:topicCategory>
+          <gmd:MD_TopicCategoryCode>planningCadastre</gmd:MD_TopicCategoryCode>
+        </gmd:topicCategory>
+        <gmd:topicCategory>
+          <gmd:MD_TopicCategoryCode>planningCadastre_Planning</gmd:MD_TopicCategoryCode>
+        </gmd:topicCategory>
+        <gmd:extent xmlns:xlink="http://www.w3.org/1999/xlink" xlink:show="embed">
+          <gmd:EX_Extent>
+            <gmd:description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+              <gco:CharacterString>Zug</gco:CharacterString>
+              <gmd:PT_FreeText>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#EN">Zug</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#DE">Zug</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#FR">Zug</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#IT">Zug</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+                <gmd:textGroup>
+                  <gmd:LocalisedCharacterString locale="#RM">Zug</gmd:LocalisedCharacterString>
+                </gmd:textGroup>
+              </gmd:PT_FreeText>
+            </gmd:description>
+            <gmd:geographicElement>
+              <gmd:EX_GeographicDescription>
+                <gmd:geographicIdentifier>
+                  <gmd:MD_Identifier>
+                    <gmd:code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="gmd:PT_FreeText_PropertyType">
+                      <gco:CharacterString>ZG</gco:CharacterString>
+                      <gmd:PT_FreeText>
+                        <gmd:textGroup>
+                          <gmd:LocalisedCharacterString locale="#EN">ZG</gmd:LocalisedCharacterString>
+                        </gmd:textGroup>
+                        <gmd:textGroup>
+                          <gmd:LocalisedCharacterString locale="#DE">ZG</gmd:LocalisedCharacterString>
+                        </gmd:textGroup>
+                        <gmd:textGroup>
+                          <gmd:LocalisedCharacterString locale="#FR">ZG</gmd:LocalisedCharacterString>
+                        </gmd:textGroup>
+                        <gmd:textGroup>
+                          <gmd:LocalisedCharacterString locale="#IT">ZG</gmd:LocalisedCharacterString>
+                        </gmd:textGroup>
+                        <gmd:textGroup>
+                          <gmd:LocalisedCharacterString locale="#RM">ZG</gmd:LocalisedCharacterString>
+                        </gmd:textGroup>
+                      </gmd:PT_FreeText>
+                    </gmd:code>
+                  </gmd:MD_Identifier>
+                </gmd:geographicIdentifier>
+              </gmd:EX_GeographicDescription>
+            </gmd:geographicElement>
+            <gmd:geographicElement>
+              <gmd:EX_BoundingPolygon>
+                <gmd:extentTypeCode>
+                  <gco:Boolean>1</gco:Boolean>
+                </gmd:extentTypeCode>
+                <gmd:polygon>
+                  <gml:MultiSurface gml:id="N5b6930ec90a846568ac26eaa0aeb0069">
+                    <gml:surfaceMember>
+                      <gml:Polygon gml:id="N5b6930ec90a846568ac26eaa0aeb0069.1">
+                        <gml:exterior>
+                          <gml:LinearRing>
+                            <gml:posList>8.522 47.09 8.493 47.1 8.494 47.114 8.48 47.126 8.467 47.119 8.468 47.119 8.454 47.114 8.449 47.131 8.43 47.123 8.42 47.123 8.415 47.124 8.412 47.141 8.414 47.157 8.412 47.173 8.402 47.177 8.4 47.184 8.405 47.195 8.396 47.22 8.396 47.229 8.408 47.242 8.41 47.248 8.414 47.244 8.417 47.234 8.422 47.223 8.447 47.223 8.448 47.22 8.48 47.209 8.489 47.211 8.498 47.212 8.512 47.216 8.513 47.219 8.529 47.219 8.539 47.223 8.543 47.222 8.574 47.217 8.577 47 [...]
+                          </gml:LinearRing>
+                        </gml:exterior>
+                      </gml:Polygon>
+                    </gml:surfaceMember>
+                  </gml:MultiSurface>
+                </gmd:polygon>
+              </gmd:EX_BoundingPolygon>
+            </gmd:geographicElement>
+            <gmd:geographicElement>
+              <gmd:EX_GeographicBoundingBox>
+                <gmd:extentTypeCode>
+                  <gco:Boolean>1</gco:Boolean>
+                </gmd:extentTypeCode>
+                <!--native coords: 672510.0,215128.0,695748.0,233506.0-->
+                <gmd:westBoundLongitude>
+                  <gco:Decimal>8.396</gco:Decimal>
+                </gmd:westBoundLongitude>
+                <gmd:eastBoundLongitude>
+                  <gco:Decimal>8.701</gco:Decimal>
+                </gmd:eastBoundLongitude>
+                <gmd:southBoundLatitude>
+                  <gco:Decimal>47.082</gco:Decimal>
+                </gmd:southBoundLatitude>
+                <gmd:northBoundLatitude>
+                  <gco:Decimal>47.248</gco:Decimal>
+                </gmd:northBoundLatitude>
+              </gmd:EX_GeographicBoundingBox>
+            </gmd:geographicElement>
+          </gmd:EX_Extent>
+        </gmd:extent>
+      </che:CHE_MD_DataIdentification>
+    </gmd:identificationInfo>
+    <gmd:distributionInfo>
+      <gmd:MD_Distribution>
+        <gmd:distributionFormat xmlns:xlink="http://www.w3.org/1999/xlink" xlink:show="embed">
+          <gmd:MD_Format>
+            <gmd:name>
+              <gco:CharacterString>N/A</gco:CharacterString>
+            </gmd:name>
+            <gmd:version>
+              <gco:CharacterString>N/A</gco:CharacterString>
+            </gmd:version>
+          </gmd:MD_Format>
+        </gmd:distributionFormat>
+        <gmd:transferOptions>
+          <gmd:MD_DigitalTransferOptions>
+            <gmd:onLine>
+              <gmd:CI_OnlineResource>
+                <gmd:linkage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="che:PT_FreeURL_PropertyType">
+                  <che:PT_FreeURL>
+                    <che:URLGroup>
+                      <che:LocalisedURL locale="#DE">http://www.zugmap.ch/?link=gewaesserschutzkarte</che:LocalisedURL>
+                    </che:URLGroup>
+                  </che:PT_FreeURL>
+                </gmd:linkage>
+                <gmd:protocol>
+                  <gco:CharacterString>WWW:LINK-1.0-http--link</gco:CharacterString>
+                </gmd:protocol>
+              </gmd:CI_OnlineResource>
+            </gmd:onLine>
+          </gmd:MD_DigitalTransferOptions>
+        </gmd:transferOptions>
+      </gmd:MD_Distribution>
+    </gmd:distributionInfo>
+    <geonet:info>
+      <id>788</id>
+      <schema>iso19139.che</schema>
+      <createDate>2009-05-28T12:00:00</createDate>
+      <changeDate>2017-01-24T12:15:29</changeDate>
+      <isTemplate>n</isTemplate>
+      <title />
+      <source>7ea582d4-9ddf-422e-b28f-29760a4c0147</source>
+      <uuid>3d2981af-d5db-4122-8db6-1ea41ed44b3f</uuid>
+      <isHarvested>n</isHarvested>
+      <popularity>693</popularity>
+      <rating>0</rating>
+      <displayOrder>null</displayOrder>
+      <isPublishedToAll>true</isPublishedToAll>
+      <view>true</view>
+      <notify>true</notify>
+      <download>true</download>
+      <dynamic>true</dynamic>
+      <featured>true</featured>
+      <groupOwner>5</groupOwner>
+      <groupLogoUuid>b3302e3c-b6a7-4b71-aa10-1be70ddf742b</groupLogoUuid>
+      <groupWebsite>http://www.zugis.ch</groupWebsite>
+      <ownername>zug</ownername>
+      <valid_details>
+        <type>xsd</type>
+        <status>
+          1
+          <ratio />
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-inspire-strict</type>
+        <status>
+          0
+          <ratio>2/2</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-aap</type>
+        <status>
+          1
+          <ratio>0/0</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-iso</type>
+        <status>
+          1
+          <ratio>0/51</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-iso-che</type>
+        <status>
+          1
+          <ratio>0/40</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-inspire</type>
+        <status>
+          0
+          <ratio>5/10</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-geonetwork</type>
+        <status>
+          1
+          <ratio>0/28</ratio>
+        </status>
+      </valid_details>
+      <valid_details>
+        <type>schematron-rules-url-check</type>
+        <status>
+          1
+          <ratio>0/11</ratio>
+        </status>
+      </valid_details>
+      <valid>0</valid>
+      <baseUrl>https://www.geocat.ch:443null</baseUrl>
+      <locService>/srv/en</locService>
+    </geonet:info>
+  </che:CHE_MD_Metadata>
+
diff --git a/tests/resources/wps_EmuExecuteRequest11.xml b/tests/resources/wps_EmuExecuteRequest11.xml
new file mode 100644
index 0000000..44ef437
--- /dev/null
+++ b/tests/resources/wps_EmuExecuteRequest11.xml
@@ -0,0 +1 @@
+<wps100:Execute xmlns:wps100="http://www.opengis.net/wps/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WPS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_request.xsd"><ows110:Identifier xmlns:ows110="http://www.opengis.net/ows/1.1">bbox</ows110:Identifier><wps100:DataInputs><wps100:Input><ows110:Identifier xmlns:ows110="http://www.opengis.net/ows/1.1">bbox</ows110:Identifier><wps100:Data><wps10 [...]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/owslib.git



More information about the Pkg-grass-devel mailing list