From: crayco <cr...@gm...> - 2007-06-27 19:34:22
|
=20 Geonetwork's Schemas/templates howto Geonetwork shema/template Howto =C2=AB Howto create and add custom shemas to geonetwork using xml, xsl, xsd and xpath =C2=BB Before you even start thinking about creating a new shema/template for geonetwork, I strongly suggest you to read all of the tutorial about XML, Xpath, XSL and XSD on w3schools.com xml : http://www.w3schools.com/xml/default.asp http://www.w3schools.com/xml/default.asp=20 xpath : http://www.w3schools.com/xpath/xpath_syntax.asp http://www.w3schools.com/xpath/xpath_syntax.asp=20 xsl : http://www.w3schools.com/xsl/xsl_languages.asp http://www.w3schools.com/xsl/xsl_languages.asp=20 xsd : http://www.w3schools.com/schema/default.asp http://www.w3schools.com/schema/default.asp =20 Otherwise, you will probably get confused and never be able to fully understand what you=E2=80=99re doing. #S1 section 1 - General structure=20 #S2 section 2 - Language specific tags=20 #S3 section 3 - XSD creation =20 #S4 section 4 - Geonetwork's specific stylesheet files =20 #S5 section 5 - Geonetwork=E2=80=99s searching stylesheet =20 #S6 section 6 - Your own Schema=E2=80=99s Stylesheet =20 #S7 section 7 - Modifying geonetwork=E2=80=99s config files=20 #S8 section 8 - Database integration =20 #S9 section 9 - Testing=20 Geonetwork=E2=80=99s shema=E2=80=99s are the root element of all stored metadata. Based on shema=E2=80=99s, the user can then create his cus= tom templates. Shema=E2=80=99s use a combination of XML technologies to store, = edit and display metadata. This dynamic way to strore and to show metadata makes it very flexible and, most of all, it will be compatible with any new futur devices like blackberries, iphone, cellphones, etc. #top Back to top=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image002.gif=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image003.gif=20 =20 =20 =09 =20 =20 =20 =09 =20 =20 Website Administration =20 =20 =20 =20 =20 =20 =20 =20 =09 =20 =20 =20 =09 =20 =20 Registered Researchers =20 =20 =20 =20 =20 =20 =20 =20 =09 =20 =20 =20 =09 =20 =20 Public access =20 =20 =20 =20 =20 =20 =20 =20 =09 =20 =20 =20 =09 =20 =20 JDBC =20 =20 =20 =20 =20 =20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image005.gif=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image006.gif=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image007.gif=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image008.gif=20 file:///C:%5Ctmp%5Cmsohtml1%5C01%5Cclip_image009.gif 1 =E2=80=93 General structure : organisation_template.xml Create a folder named exacly like your template name =C2=AB organisation =C2=BB in [geonet_root]/web/xml/shemas/&= nbsp; Here you will store various files mandatory to any geonetwork shema. Start by thinking and writing down the XML structure of the metadata you would like to show with your shema. Let say I whant to add a shema that let geonetwork users enter information about any organisation. The basic XML would look like this.=20 *Note that any metadata file that is published in geonetwork MUST have a unique universal id (UUID). The shema you=E2=80=99re creating will need one, since geonetwork considers shema as an other metadata. To get one, you can visit the International Telecommunication Union at : http://www.itu.int/ITU-T/asn1/cgi-bin/uuid_generate http://www.itu.int/ITU-T/asn1/cgi-bin/uuid_generate=20 *Note that according to the w3c stantard, all xml files must start with <?xml version=3D"1.0" encoding=3D"UTF-8"?>. Since this file will be place in the database and rearanged by the geonetwork=E2=80=99s api implementation, there is no n= eed for the xml version declaration. Geonetwork will add the appropricate xml version declaration when needed. <metadata> <orgTitle>New organisation</orgTitle> <orgAcronym/> <orgParentInstitution/> <orgDesc/> <orgSuppInfo/> <orgContactus> <orgAddress/> <orgPOBox/> <orgCity/> <orgPostalcode/> <orgProvince/> <orgCountry/> <orgPhone/> <orgFax/> <orgWebsite/> <orgEmail/> </orgContactus> <orgContactInfo> <orgContactName/> <orgContactRole/> <orgContactEmail/> <orgContactPhone/> </orgContactInfo> <mdFileID>d5750700-1da8-11dc-95c5-0002a5d5c51b</mdFileID> </metadata> Save this file as =E2=80=9Corganisation_template.xml=E2=80=9D=E2=80=A6 you=E2=80= =99ll need it later. Note that what=E2=80=99s written in your template tag <orgTitle> will be displayed in the dropdown list of available templates when user creates new metadata. #top Back to top=20 2 =E2=80=93 Language specific tags : /web/loc/[lang]/xml/organisation.xml Now, create the file =E2=80=9Corganisation.xml=E2=80=9D that will be placed in =E2=80=9C[geonetwork_root_path]/web/loc/en/xml/=E2=80=9D. This fi= le will used to display each metadata header and help information in different languages. So create as many =E2=80=9Corganisation.xml=E2=80=9D in the various localizati= ons your geonetwork interface is available in. Following the example above, it will look like this: *Note that the =E2=80=9Chelp=3D=E2=80=9D attribute is not always present. This is a personal decision, since most of the fields are self explanatory. However, all fields should be explained. <?xml version=3D"1.0" encoding=3D"UTF-8"?> <root> <metadata help=3D"root entity which defines metadata about the organisation">Organisation's Metadata</metadata> <orgTitle help=3D"The organisation's name">Organisation's name</orgTitle> <orgAcronym help=3D"abbreviations that is formed using the initial letters of words or word parts in a name.">Acronym</orgAcronym> <orgParentInstitution help=3D"The institution above this organisation, if applicable">Parent institution</orgParentInstitution> <orgDesc help=3D"Description of the main goal of the organisation">Description</orgDesc> <orgContactus>Contact us</orgContactus> <orgAddress>Address</orgAddress> <orgPOBox>P.O. Box</orgPOBox> <orgCity>City</orgCity> <orgPostalcode>Postal Code / Zip</orgPostalcode> <orgProvince>Province / State</orgProvince> <orgCountry>Country</orgCountry> <orgPhone>Phone</orgPhone> <orgFax>Fax</orgFax> <orgWebsite>Website http://</orgWebsite> <orgEmail>Email</orgEmail> <orgSuppInfo help=3D"any other descriptive information about the dataset">Supplemental Information</orgSuppInfo> <orgContactInfo help=3D"person to contact">Contact name</orgContactInfo> <orgContactName>Name</orgContactName> <orgContactRole>Position</orgContactRole> <orgContactEmail>Email</orgContactEmail> <orgContactPhone>Phone and ext.</orgContactPhone> <mdFileID help=3D"unique identifier for this metadata file">File identifier</mdFileID> </root> ***I strongly suggest to write the =E2=80=9Chelp=3D=E2=80=9D attribute right now. If you don=E2=80=99t, you will most likely never do it. #top Back to top=20 3- XSD creation : /web/xml/shemas/organisation/schema.xsd XSD stands for XML Schema Definition. You will now tell geonetwork how your xml is organized. This is also where you will tell your geonetwork=E2=80=99s api implementation if some element are optional, mandatory, unique or if multiple instance of them car be created. For an exhaustive list of options, visit : http://www.w3schools.com/schema/el_element.asp <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xs:schema xmlns:xs=3D"http://www.w3.org/2001/XMLSchema" elementFormDefault=3D"qualified"> <!-- complex type declaration --> <xs:element name=3D"metadata" type=3D"metadata"/> <xs:complexType name=3D"metadata"> <xs:sequence> <xs:element ref=3D"orgTitle"/> <xs:element ref=3D"orgAcronym"/> <xs:element ref=3D"orgParentInstitution"/> <xs:element ref=3D"orgDesc"/> <xs:element ref=3D"orgSuppInfo"/> <xs:element ref=3D"orgContactus"/> <xs:element minOccurs=3D"0" maxOccurs=3D"unbounded" ref=3D"orgContactInf= o" /> <xs:element ref=3D"mdFileID"/> </xs:sequence> </xs:complexType> <xs:element name=3D"orgContactInfo" type=3D"orgContactInfo" /> <xs:complexType name=3D"orgContactInfo"> <xs:sequence> <xs:element ref=3D"orgContactName"/> <xs:element ref=3D"orgContactRole"/> <xs:element ref=3D"orgContactEmail"/> <xs:element ref=3D"orgContactPhone"/> </xs:sequence> </xs:complexType> =20 <xs:element name=3D"orgContactus" type=3D"orgContactus"/> <xs:complexType name=3D"orgContactus"> <xs:sequence> <xs:element ref=3D"orgAddress"/> <xs:element ref=3D"orgPOBox"/> <xs:element ref=3D"orgCity"/> <xs:element ref=3D"orgPostalcode"/> <xs:element ref=3D"orgProvince"/> <xs:element ref=3D"orgCountry"/> <xs:element ref=3D"orgPhone"/> <xs:element ref=3D"orgFax"/> <xs:element ref=3D"orgWebsite"/> <xs:element ref=3D"orgEmail"/> </xs:sequence> </xs:complexType> =20 <!-- ELEMENT DECLARATIONS --> <xs:element name=3D"orgTitle" type=3D"xs:string"/> <xs:element name=3D"orgAcronym" type=3D"xs:string"/> <xs:element name=3D"orgDesc" type=3D"xs:string"/> <xs:element name=3D"orgParentInstitution" type=3D"xs:string"/> <xs:element name=3D"orgAddress" type=3D"xs:string"/> <xs:element name=3D"orgPOBox" type=3D"xs:string"/> <xs:element name=3D"orgCity" type=3D"xs:string"/> <xs:element name=3D"orgPostalcode" type=3D"xs:string"/> <xs:element name=3D"orgProvince" type=3D"xs:string"/> <xs:element name=3D"orgCountry" type=3D"xs:string"/> <xs:element name=3D"orgPhone" type=3D"xs:string"/> <xs:element name=3D"orgFax" type=3D"xs:string"/> <xs:element name=3D"orgWebsite" type=3D"xs:string"/> <xs:element name=3D"orgEmail" type=3D"xs:string"/> <xs:element name=3D"orgContactName" type=3D"xs:string"/> <xs:element name=3D"orgContactPhone" type=3D"xs:string"/> <xs:element name=3D"orgContactEmail" type=3D"xs:string"/> <xs:element name=3D"orgContactRole" type=3D"xs:string"/> <xs:element name=3D"orgSuppInfo" type=3D"xs:string"/> <xs:element name=3D"mdFileID" type=3D"xs:string"/> =20 </xs:schema> #top Back to top=20 4- Geonetwork specific stylesheet files : /web/xml/schemas/organisation/=E2=80=A6 Geonetwork=E2=80=99s api will need few xsl files in your schema=E2=80=99s folder in order to perform various operations such as getting the uuid or the thumbnail. Here is a very simple version of the each files needed. You can just copy paste them. Perhaps, more complexes operations can be done. I suggest looking at the fgdc-std or iso19115 files for complete examples. extract-thumbnails.xsl <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"> <xsl:template match=3D"metadata"> <thumbnail/> </xsl:template> </xsl:stylesheet> extract-uuid.xsl <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"> <xsl:template match=3D"metadata"> <uuid><xsl:value-of select=3D"mdFileID"/></uuid> </xsl:template> </xsl:stylesheet> schema-suggestions.xml this file seam to be there for informative purposes, leave-it blank <?xml version=3D"1.0" encoding=3D"UTF-8"?> <fields> <!-- <field name=3D""> <suggest name=3D""/> </field> --> </fields> set-thumbnail.xsl <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"> <xsl:template match=3D"/root"> <xsl:apply-templates select=3D"metadata"/> </xsl:template> <xsl:template match=3D"@*|node()"> <xsl:copy> &nb= sp; <xsl:apply-templates select=3D"@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> unset_tumbnail.xsl <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"> <xsl:template match=3D"/root"> <xsl:apply-templates select=3D"metadata"/> </xsl:template> <xsl:template match=3D"@*|node()"> <xsl:copy> &nb= sp; <xsl:apply-templates select=3D"@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> update-fixed-info.xsl <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform"> <xsl:template match=3D"/root"> <xsl:apply-templates select=3D"metadata"/> </xsl:template> <xsl:template match=3D"@*|node()"> <xsl:copy> &nb= sp; <xsl:apply-templates select=3D"@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> #top Back to top=20 5- Geonetwork=E2=80=99s searching stylesheet : /web/xml/search/organisation.xsl By default, Geonetwork=E2=80=99s search engine will search the =E2=80=9Ctitle=E2=80=9D, =E2=80=9Cabstract=E2=80=9D, =E2=80=9Ckeywords=E2= =80=9D and =E2=80=9Cgeographic box=E2=80=9D. So you need to match at least one of those with your metadata schema. In our organisation example, there is no coverage region or keywords, but you can look at the other templates. <?xml version=3D"1.0" encoding=3D"UTF-8" ?> <xsl:stylesheet xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform" version=3D"1.0"> <xsl:template match=3D"/"> <Document> <xsl:apply-templates select=3D"/metadata/orgTitle"> &nb= sp; <xsl:with-param name=3D"name" select=3D"'title'"/> &nb= sp; <xsl:with-param name=3D"token" select=3D"'true'"/> </xsl:apply-templates> <xsl:apply-templates select=3D"/metadata/orgDesc"> &nb= sp; <xsl:with-param name=3D"name" select=3D"'abstract'"/> &nb= sp; <xsl:with-param name=3D"token" select=3D"'true'"/> </xsl:apply-templates> <Field name=3D"any" store=3D"false" index=3D"true" token=3D"true"> &nb= sp; <xsl:attribute name=3D"string"> &nb= sp; <xsl:apply-templates select=3D"/metadata" mode=3D"allText"/> &nb= sp; </xsl:attribute> </Field> <!-- locally searchable fields --> <!-- defaults to true --> <Field name=3D"digital" string=3D"true" store=3D"false" index=3D"true" token=3D"false"/> </Document> </xsl:template> <!-- text element, by default indexed, not stored nor tokenized --> <xsl:template match=3D"*"> <xsl:param name=3D"name" select=3D"name(.)"/> <xsl:param name=3D"store" select=3D"'false'"/> <xsl:param name=3D"index" select=3D"'true'"/> <xsl:param name=3D"token" select=3D"'false'"/> <Field name=3D"{$name}" string=3D"{string(.)}" store=3D"{$store}" index=3D"{$index}" token=3D"{$token}"/> </xsl:template> <!-- codelist element, indexed, not stored nor tokenized --> <xsl:template match=3D"*[./*/@value]"> <xsl:param name=3D"name" select=3D"name(.)"/> <Field name=3D"{$name}" string=3D"{*/@value}" store=3D"false" index=3D"t= rue" token=3D"false"/> </xsl:template> <!--allText --> <xsl:template match=3D"*" mode=3D"allText"> <xsl:for-each select=3D"@*"><xsl:value-of select=3D"concat(string(= .),' ')"/></xsl:for-each> <xsl:choose> <xsl:when test=3D"*"><xsl:apply-templates select=3D"*" mode=3D"allText"/></xsl:when> <xsl:otherwise><xsl:value-of select=3D"concat(string(.),' ')"/></xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> #top Back to top=20 6- Your own Schema=E2=80=99s Stylesheet : /web/xsl/metadata-organisation.xs= l This is the file you can end up playing with for days without knowing what you=E2=80=99re doing=E2=80=A6 and=E2=80=A6 on top of t= hat=E2=80=A6 expecting to have some results. I wish no body will ever go through those days after me, this is why I=E2=80=99m writing this document. This is the stylesheet that will be used by geonetwork to show the content of your metadata according to user=E2=80=99s request fo= r viewing or editing it. In both case, it is possible for the user to choose between the =E2=80=9Csimple=E2=80=9D, =E2=80=9Cadvanced=E2=80=9D or =E2=80=9Cxml=E2=80=9D view. Depending on what the user is doing with the metadata, we need to show it different ways. Note that there is no need for any specification in the =E2=80=9Cxml=E2=80= =9D view, since we simply show the raw metadata in it=E2=80=99s xml form.=20 <?xml version=3D"1.0" encoding=3D"UTF-8"?> <xsl:stylesheet version=3D"1.0" xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform" xmlns:geonet=3D"http://www.fao.org/geonetwork"> <!-- =20 default: in simple mode just a flat list --> <xsl:template mode=3D"organisation" match=3D"*|@*"> <xsl:param name=3D"schema"/> <xsl:param name=3D"edit"/> <xsl:apply-templates mode=3D"element" select=3D"."> &nb= sp; <xsl:with-param name=3D"schema" select=3D"$schema"/> &nb= sp; <xsl:with-param name=3D"edit" select=3D"$edit"/> &nb= sp; <xsl:with-param name=3D"flat" select=3D"$currTab=3D'simple'"/> </xsl:apply-templates> </xsl:template> <!-- =20 these elements should be boxed --> <xsl:template mode=3D"organisation" match=3D"orgContactInfo|orgContactus= "> <xsl:param name=3D"schema"/> <xsl:param name=3D"edit"/> <xsl:apply-templates mode=3D"complexElement" select=3D"."> &nb= sp; <xsl:with-param name=3D"schema" select=3D"$schema"/> &nb= sp; <xsl:with-param name=3D"edit" select=3D"$edit"/> </xsl:apply-templates> </xsl:template> <!-- make the following fields always not editable: mdFileID --> <xsl:template mode=3D"organisation" match=3D"mdFileID"> <xsl:param name=3D"schema"/> <xsl:param name=3D"edit"/> <xsl:apply-templates mode=3D"element" select=3D"."> &nb= sp; <xsl:with-param name=3D"schema" select=3D"$schema"/> &nb= sp; <xsl:with-param name=3D"edit" select=3D"false()"/> </xsl:apply-templates> </xsl:template> <!-- orgDesc, orgSuppInfo --> <xsl:template mode=3D"organisation" match=3D"orgDesc|orgSuppInfo"> <xsl:param name=3D"schema"/> <xsl:param name=3D"edit"/> <xsl:apply-templates mode=3D"simpleElement" select=3D"."> &nb= sp; <xsl:with-param name=3D"schema" select=3D"$schema"/> &nb= sp; <xsl:with-param name=3D"edit" select=3D"$edit"/> &nb= sp; <xsl:with-param name=3D"text"> &nb= sp; <xsl:call-template name=3D"getElementText"> &nb= sp; = <xsl:with-param name=3D"schema" select=3D"$schema"/> &nb= sp; = <xsl:with-param name=3D"edit" select=3D"$edit"/> &nb= sp; = <xsl:with-param name=3D"rows" select=3D"5"/> &nb= sp; </xsl:call-template> &nb= sp; </xsl:with-param> </xsl:apply-templates> </xsl:template> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- organisation brief formatting --> <!-- this formating is used to show search results --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <xsl:template name=3D"organisationBrief"> <metadata> &nb= sp; <title><xsl:value-of select=3D"orgTitle"/></title> &nb= sp; <abstract><xsl:value-of select=3D"orgDesc"/></abstract> &nb= sp; <xsl:copy-of select=3D"geonet:info"/> </metadata> </xsl:template> </xsl:stylesheet> #top Back to top=20 7- Modifying of geonetwork=E2=80=99s config files. /web/WEB-INF/config.xml Add this line into the <gui> section : <xml name=3D"organisation" file=3D"xml/organisation.xml" /> /web/xsl/metadata-edit.xsl if you want your metadata schema to have a thumbnail, add a line like this into the =E2=80=9Cedit button=E2=80=9D template sectio= n (<xsl:template name=3D"editButtons" =E2=80=A6>): <!-- thumbnails --> <xsl:if test=3D"string(geonet:info/schema)=3D'organisation'"> &#160; <button class=3D"content" onclick=3D"doAction('{/root/gui/locService}/metadata.thumbnail.form')"> &nb= sp; <xsl:value-of select=3D"/root/gui/strings/thumbnails"/> </button> </xsl:if> /web/xsl/metadata-utils.xsl Add this line at the top : <xsl:include href=3D"metadata-organisation.xsl"/> and this line into the <!-- brief --> section: <!-- organisation --> <xsl:when test=3D"$schema=3D'organisation'"> <xsl:call-template name=3D"organisationBrief"/> </xsl:when> /web/xsl/metadata.xsl Add these lines into the <!-- main schema switch --> <!-- organisation --> <xsl:when test=3D"$schema=3D'organisation'"> <xsl:apply-templates mode=3D"organisation" select=3D"." > <xsl:with-param name=3D"schema" select=3D"$schema"/> <xsl:with-param name=3D"edit" select=3D"$edit"/> </xsl:apply-templates> </xsl:when> #top Back to top=20 8 =E2=80=93 Database integration (I=E2=80=99m using SQLYog) A) metadata table Add organisation_template.xml to your table. Make sure the id is unique schemaid must be your schema=E2=80=99s name =E2=80=9Corganisation=E2=80=9D isTemplate must be set to =E2=80=9Cy=E2=80=9D data must be an exact copy of organisation_template.xml (see section =E2=80=9C1 =E2=80=93 General structure=E2=80=9C). If you worry about the tabs and carriage returns, just delete them. uuid, you can have your own generated by the International Telecommunication Union at :=20 http://www.itu.int/ITU-T/asn1/cgi-bin/uuid_generate http://www.itu.int/ITU-T/asn1/cgi-bin/uuid_generate=20 SQL statement example: insert into `metadata`=20 (`id`,`schemaId`,`isTemplate`,`createDate`,`lastChangeDate`,`data`,`source`= ,`sourceUri`,`uuid`) values ( '30', 'organisation' ,'y', '2007-06-21T15:21:47', '2007-06-21T15:21:47' ,'<metadata><orgTitle>New organisation</orgTitle><orgAcronym/><orgParentInstitution/&g= t;<orgDesc/><orgSuppInfo/><orgContactus><orgAddress/&g= t;<orgPOBox/><orgCity/><orgPostalcode/><orgProvince/&g= t;<orgCountry/><orgPhone/><orgFax/><orgWebsite/><= ;orgEmail/></orgContactus> <orgContactInfo><orgContactName/><orgContactRole/><org= ContactEmail/><orgContactPhone/> </orgContactInfo> <mdFileID>d5750700-1da8-11dc-95c5-0002a5d5c51b</mdFileID>= </metadata>','myGeoNet',NULL,'d5750700-1da8-11dc-95c5-0002a5d5c51b') B) operationallowed table The default groupId to give access to is =E2=80=9C2=E2=80=9D The metadataId is 30 (see above) The operationId is by default 0,1,2,4,5,6 (Do I need to specify to make one entry per operationId?) #top Back to top=20 9 =E2=80=93 Testing Connect to your geonetwork, choose your new schema, and create a new metadata! --=20 View this message in context: http://www.nabble.com/Howto-Adding---making-a= -new-metadata-schema-tf3990416s18419.html#a11331071 Sent from the geonetwork-devel mailing list archive at Nabble.com. |