From 865a6e168d96010f69565c9b1ab67ecabf3ec6a1 Mon Sep 17 00:00:00 2001 From: Philip Trembath Date: Wed, 6 Nov 2024 12:18:32 +0000 Subject: [PATCH 1/4] tweak solr index for obs Propertis --- .../uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndex.java | 3 ++- .../indexing/solr/SolrIndexGeminiDocumentGenerator.java | 3 ++- .../java/uk/ac/ceh/gateway/catalogue/search/SearchQuery.java | 2 +- solr/documents/conf/managed-schema | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndex.java b/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndex.java index 2f7407fc4..9ff91ef16 100644 --- a/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndex.java +++ b/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndex.java @@ -46,7 +46,8 @@ public class SolrIndex { private @Field List keywordsProject; private @Field List keywordsTheme; private @Field List keywordsOther; - private @Field List observedProperties; + private @Field List observedPropertyValue; + private @Field List observedPropertyTitle; private @Field String licence; private @Field String lineage; private @Field String dataLevel; diff --git a/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndexGeminiDocumentGenerator.java b/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndexGeminiDocumentGenerator.java index 964e4e027..884cee08b 100644 --- a/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndexGeminiDocumentGenerator.java +++ b/java/src/main/java/uk/ac/ceh/gateway/catalogue/indexing/solr/SolrIndexGeminiDocumentGenerator.java @@ -54,7 +54,8 @@ public SolrIndex generateIndex(GeminiDocument document) { .setAuthorOrcid(grab(document.getAuthors(), ResponsibleParty::getNameIdentifier)) .setAuthorRor(grab(document.getAuthors(), ResponsibleParty::getOrganisationIdentifier)) .setKeywordsInstrument(grab(document.getKeywordsInstrument(), Keyword::getValue)) - .setObservedProperties(grab(document.getObservedProperty(), ObservedProperty::getValue)) + .setObservedPropertyValue(grab(document.getObservedProperty(), ObservedProperty::getValue)) + .setObservedPropertyTitle(grab(document.getObservedProperty(), ObservedProperty::getTitle)) .setKeywordsPlace(grab(document.getKeywordsPlace(), Keyword::getValue)) .setKeywordsProject(grab(document.getKeywordsProject(), Keyword::getValue)) .setKeywordsTheme(grab(document.getKeywordsTheme(), Keyword::getValue)) diff --git a/java/src/main/java/uk/ac/ceh/gateway/catalogue/search/SearchQuery.java b/java/src/main/java/uk/ac/ceh/gateway/catalogue/search/SearchQuery.java index 11f90029c..d9a7b151f 100644 --- a/java/src/main/java/uk/ac/ceh/gateway/catalogue/search/SearchQuery.java +++ b/java/src/main/java/uk/ac/ceh/gateway/catalogue/search/SearchQuery.java @@ -85,7 +85,7 @@ public SolrQuery build(){ SolrQuery query = new SolrQuery() .setQuery(term) .setParam("defType", "edismax") - .setParam("qf", "title^50 description^25 keyword^5 lineage organisation individual surname altTitle resourceIdentifier identifier supplementalDescription supplementalName infrastructureCapabilities^2 keywordsParameters^5 observedProperties^10 operatingPeriod objectives^25 responsibleParties") + .setParam("qf", "title^50 description^25 keyword^5 lineage organisation individual surname altTitle resourceIdentifier identifier supplementalDescription supplementalName infrastructureCapabilities^2 keywordsParameters^5 observedPropertyTitle^10 observedPropertyValue^5 operatingPeriod objectives^25 responsibleParties") .setParam("bq", "resourceStatus:Available^100, resourceStatus:Controlled^100, resourceStatus:Embargoed^80, resourceStatus:Restricted^80, resourceStatus:Superseded^1") .setParam("bf", "version") .setParam("ps", "5") diff --git a/solr/documents/conf/managed-schema b/solr/documents/conf/managed-schema index f9b92fefe..210c0777d 100644 --- a/solr/documents/conf/managed-schema +++ b/solr/documents/conf/managed-schema @@ -107,7 +107,8 @@ - + + From 6fa25ffc5305c1865522cb507a2c0c7ec8a236f9 Mon Sep 17 00:00:00 2001 From: Philip Trembath Date: Wed, 6 Nov 2024 12:18:57 +0000 Subject: [PATCH 2/4] update html, schema.org and ttl templates for ObsProperties --- templates/html/document/_tags.ftlh | 23 ++++++++++++++--- templates/rdf/_body.ftl | 13 +++++----- templates/rdf/_macros.ftl | 38 ++++++++++++++++++++++++---- templates/rdf/monitoring/_common.ftl | 4 +-- templates/rdf/turtle/_rights.ftl | 2 +- templates/schema.org/schema.org.ftlh | 29 +++++++++++++++------ 6 files changed, 84 insertions(+), 25 deletions(-) diff --git a/templates/html/document/_tags.ftlh b/templates/html/document/_tags.ftlh index 7b18358ab..83c39a096 100644 --- a/templates/html/document/_tags.ftlh +++ b/templates/html/document/_tags.ftlh @@ -17,7 +17,24 @@ <#if observedProperty?has_content> - <@keywordList observedProperty "Observed properties" true/> +
Observed properties
+
+ <#list observedProperty?sort_by("value") as item> + <#assign opLabel="unknown"> + <#if item.title?has_content> + <#assign opLabel=item.title?trim> + <#elseif item.value?has_content> + <#assign opLabel=item.value?trim> + + + <#if item.uri?has_content> + ${opLabel} + + <#else> + ${opLabel} + + <#sep>
+ <#macro keywordList list listTitle="Keywords" commaseparated=false> @@ -31,9 +48,9 @@ <#macro displayLinkedKeyword value="" uri=""> <#if uri?has_content> - ${value?trim} + ${value?trim} <#else> - ${value?trim} + ${value?trim} diff --git a/templates/rdf/_body.ftl b/templates/rdf/_body.ftl index 4137c591c..31810cdb9 100644 --- a/templates/rdf/_body.ftl +++ b/templates/rdf/_body.ftl @@ -1,21 +1,22 @@ :${id} - dct:title "<@displayLiteral title />" ; + dct:title <@displayLiteral title /> ; <@identifiers resourceIdentifiers /> <#if datacitable?string=='true' && citation?has_content> - dct:bibliographicCitation "${citation.authors?join(', ')} (${citation.year?string("0")}). <@displayLiteral citation.title />. ${citation.publisher}. ${citation.url?trim}" ; + <#assign citationString = citation.authors?join(', ') + " (" + citation.year?string("0") +"}. " + citation.title + ". " + citation.publisher + ". " + citation.url?trim> + dct:bibliographicCitation <@displayLiteral citationString/> <#if resourceStatus != "Deleted"> <#if description?has_content> - dct:description "<@displayLiteral description />" ; + dct:description <@displayLiteral description /> ; <#if lineage?has_content> dct:provenance [ a dct:ProvenanceStatement ; - rdfs:label "<@displayLiteral lineage />" + rdfs:label <@displayLiteral lineage /> ] ; @@ -70,7 +71,7 @@ <#if observedProperty?has_content> - sdo:variableMeasured <@keywordList observedProperty/> ; + sdo:variableMeasured <@opList /> ; <#if funding?has_content> @@ -110,7 +111,7 @@ <#if observedProperty?has_content> - <@keywordDetail observedProperty /> + <@opDetail /> <@fundingDetail /> diff --git a/templates/rdf/_macros.ftl b/templates/rdf/_macros.ftl index 4165184ff..666a73fb0 100644 --- a/templates/rdf/_macros.ftl +++ b/templates/rdf/_macros.ftl @@ -5,8 +5,8 @@ <#macro displayLiteral string> - <#--Ensure literals do not contain " characters--> - <#t>${string?replace("\"","'")?replace("\n"," ")} + <#--Ensure literals do not contain " characters or line breaks--> + <#t>"${string?trim?replace("\"","'")?replace("\n"," ")}" <#macro contactList contacts prefix="c"> @@ -85,7 +85,7 @@ <#assign fundIdentifier ="\l" + fund.awardURI?trim+ "\g"> - ${fundIdentifier?trim} a prov:Activity ; <#if fund.awardTitle?has_content>rdfs:label "<@displayLiteral fund.awardTitle />" . + ${fundIdentifier?trim} a prov:Activity ; <#if fund.awardTitle?has_content>rdfs:label <@displayLiteral fund.awardTitle /> . @@ -104,7 +104,35 @@ <#macro keywordDetail keywords> <#list keywords as kw> <#if kw.uri?has_content> - <${kw.uri?trim}> a skos:Concept; skos:prefLabel "<@displayLiteral kw.value />"; rdfs:label "<@displayLiteral kw.value />". + <${kw.uri?trim}> a skos:Concept; skos:prefLabel <@displayLiteral kw.value />; rdfs:label <@displayLiteral kw.value />. + + + + +<#macro opList > + <#list observedProperty as op> + <#if op.uri?has_content> + <#assign keyword ="\l" + op.uri?trim+ "\g"> + <#elseif op.title?has_content> + <#assign keyword ='"' + op.title?replace("\"", "") + '"'> + <#else> + <#assign keyword ='"' + op.value?replace("\"", "") + '"'> + + ${keyword}<#sep>,<#t> + + + +<#macro opDetail> + <#list observedProperty as op> + <#assign opLabel = "unknown"> + <#if op.title?has_content> + <#assign opLabel = op.title> + <#elseif op.value?has_content> + <#assign opLabel = op.value> + + + <#if op.uri?has_content> + <${op.uri?trim}> a skos:Concept;skos:prefLabel <@displayLiteral opLabel />; rdfs:label <@displayLiteral opLabel />. @@ -132,7 +160,7 @@ ${citationIdentifier?trim} a ; - <#if citation.description?has_content>rdfs:label "<@displayLiteral citation.description />"; + <#if citation.description?has_content>rdfs:label <@displayLiteral citation.description />; . diff --git a/templates/rdf/monitoring/_common.ftl b/templates/rdf/monitoring/_common.ftl index b95913d9e..cade38444 100644 --- a/templates/rdf/monitoring/_common.ftl +++ b/templates/rdf/monitoring/_common.ftl @@ -3,7 +3,7 @@ <#macro displayLiteral string> <#--Ensure literals do not contain " characters--> - <#t>${string?replace("\"","'")?replace("\n"," ")} + <#t>"${string?trim?replace("\"","'")?replace("\n"," ")}" <#macro common rdftype="" other="" prefixed=true> @@ -20,7 +20,7 @@ a ${rdftype} ; dct:title "${title}" ; <#if description?has_content> - dct:description "<@displayLiteral description />" ; + dct:description <@displayLiteral description /> ; <#if boundingBox?has_content> ef:boundingBox "POLYGON${boundingBox.coordinates?replace('[[[','((')?replace(']]]','))')?replace('[^]], ',' ','r')?replace(']', '')?replace('[', '')}"^^geo:wktLiteral ; diff --git a/templates/rdf/turtle/_rights.ftl b/templates/rdf/turtle/_rights.ftl index 35940f67c..6d3b370e7 100644 --- a/templates/rdf/turtle/_rights.ftl +++ b/templates/rdf/turtle/_rights.ftl @@ -14,7 +14,7 @@ <#if accessLimitation?has_content> dct:accessRights [ a dct:RightsStatement ; - odrs:attributionText "<@displayLiteral accessLimitation.value />" ; + odrs:attributionText <@displayLiteral accessLimitation.value /> ; <#if accessLimitation.uri?has_content>odrs:attributionUrl <${accessLimitation.uri?trim}> ] ; diff --git a/templates/schema.org/schema.org.ftlh b/templates/schema.org/schema.org.ftlh index 2f35695ed..faf23de28 100644 --- a/templates/schema.org/schema.org.ftlh +++ b/templates/schema.org/schema.org.ftlh @@ -51,8 +51,8 @@ <#if docType?has_content> { - "@type":"${docType}", - "name":"${title}", + "@type":<@displayLiteral docType/>, + "name":<@displayLiteral title/>, <#if docType == "Dataset"> <#if isAttached!false> @@ -77,12 +77,12 @@ <#if resourceStatus != "Deleted"> - <#if description?has_content>"description":"${description?replace("\n", " ")}", + <#if description?has_content>"description":<@displayLiteral description/>, <#if alternateTitles?has_content> "alternateName":[ <#list alternateTitles as altTitle> - "${altTitle}"<#sep>, + <@displayLiteral altTitle/><#sep>, ], @@ -160,7 +160,7 @@ <#list incomingCitations as citation> { "@type": "CreativeWork" - <#if citation.description?has_content>,"creditText": "${citation.description?replace("\n", " ")?trim}" + <#if citation.description?has_content>,"creditText": <@displayLiteral citation.description/> <#if citation.url?has_content>,"url": "${citation.url?trim}" }<#sep>, @@ -278,7 +278,7 @@ <#t>{ <#t>"@type": "DefinedTerm", <#t>"@id": "${keyword.uri?trim}", - <#t>"name": "${keyword.value?trim}" + <#t>"name": <@displayLiteral keyword.value/> <#t><#if subjectScheme?has_content>,"inDefinedTermSet": "${schemeURI}" } <#else> @@ -290,16 +290,23 @@ <#macro displayObservedProperties props> <#list props as op> + <#assign opLabel ="unknown"> + <#if op.title?has_content> + <#assign opLabel = op.title?trim> + <#elseif op.value?has_content> + <#assign opLabel = op.value?trim> + + <#if op.uri?has_content> { "@type": "StatisticalVariable", "@id": "${op.uri?trim}", - "name": "${op.value?trim}" + "name": "${opLabel}" <#if op.unitsUri?has_content>,"unitCode": "${op.unitsUri?trim}" <#if op.units?has_content>,"unitText": "${op.units?trim}" } <#else> - "${op.value?trim}" + <@displayLiteral opLabel/> <#sep>, @@ -325,3 +332,9 @@ ], + +<#macro displayLiteral string> + <#--Ensure literals do not contain " characters or line breaks--> + <#t>"${string?trim?replace("\"","'")?replace("\n"," ")}" + + From f75968a043194badf447d7e69eccc29d0afb978b Mon Sep 17 00:00:00 2001 From: Philip Trembath Date: Wed, 6 Nov 2024 12:19:23 +0000 Subject: [PATCH 3/4] add fixture for ObsProperty testing --- .../399ed9b1-bf59-4d85-9832-ee4d29f49bfb.meta | 17 +++++++++++++++++ .../399ed9b1-bf59-4d85-9832-ee4d29f49bfb.raw | 1 + 2 files changed, 18 insertions(+) create mode 100644 fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.meta create mode 100644 fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.raw diff --git a/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.meta b/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.meta new file mode 100644 index 000000000..1ab06dd3b --- /dev/null +++ b/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.meta @@ -0,0 +1,17 @@ +{ + "rawType": "application/gemini+json", + "state": "published", + "documentType": "GEMINI_DOCUMENT", + "permissions": { + "EDIT": [ + "phtr" + ], + "VIEW": [ + "phtr", "public" + ], + "DELETE": [ + "phtr" + ] + }, + "catalogue": "eidc" +} diff --git a/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.raw b/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.raw new file mode 100644 index 000000000..ed89c3ea6 --- /dev/null +++ b/fixtures/datastore/REV-1/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.raw @@ -0,0 +1 @@ +{"id":"399ed9b1-bf59-4d85-9832-ee4d29f49bfb","uri":"https://catalogue.ceh.ac.uk/id/399ed9b1-bf59-4d85-9832-ee4d29f49bfb","type":"dataset","title":"Daily and sub-daily hydrometeorological and soil data (2013-2023) [COSMOS-UK]","description":"This dataset contains daily and sub-daily hydrometeorological and soil moisture observations from COSMOS-UK (cosmic-ray soil moisture) monitoring network from October 2013 to the end of 2023. These data are from 51 sites across the UK recording a range of hydrometeorological and soil variables.\n\nEach site in the network records the following hydrometeorological and soil data at 30-minute resolution:Radiation (short wave, long wave, and net), precipitation, atmospheric pressure, air temperature, wind speed and direction, humidity, soil heat flux, and soil temperature and volumetric water content (VWC), measured by point sensors at various depths.\n\nEach site hosts a cosmic-ray sensing probe; a novel sensor technology which counts fast neutrons in the surrounding atmosphere. In combination with the recorded hydrometeorological data, neutron counts are used to derive VWC over a field scale (COSMOS VWC), provide at daily resolution.\n\nThe presence of snow leads to erroneously high measurements of COSMOS VWC due to all the extra water in the surrounding area. Included in the daily data are indications of snow days, on which, the COSMOS VWC are adjusted, and the snow water equivalent (SWE) is given.\n\nThe potential evapotranspiration (PE), derived from recorded hydrometeorological and soil are also included at daily resolution.\n\nTwo levels of quality control are carried out, firstly data is run through a series of automated checks, such as range tests and spike tests, and then all data is manually inspected each week where any other faults are picked up, including sensor faults or connection issues. Quality control flags are provided for all recorded (30 minute) data, indicating the reason for any missing data.\n\nThis work was supported by the Natural Environment Research Council award number NE/R016429/1 as part of the UK-SCAPE programme delivering National Capability.\n\n","metadataDate":"2024-08-14T09:34:09","resourceIdentifiers":[{"code":"https://catalogue.ceh.ac.uk/id/399ed9b1-bf59-4d85-9832-ee4d29f49bfb"},{"code":"10.5285/399ed9b1-bf59-4d85-9832-ee4d29f49bfb","codeSpace":"doi:"}],"relationships":[{"relation":"https://vocabs.ceh.ac.uk/eidc#supersedes","target":"5060cc27-0b5b-471b-86eb-71f96da0c80f"}],"lineage":"Hydrometeorological and soil observations are recorded at sites around the UK using an array of sensors. Every hour, the raw data collected is sent to UKCEH in Wallingford, where it is subject to quality control. Soil volumetric water content data are derived from 30-minute hydrometeorological data and data from the cosmic-ray sensing probe by Python scripts run every hour. The data are calculated using the method outlined in Evans et al. 2016. Snow water equivalents are derived by Python scripts at the end of the day from the hydrometeorological data according to Wallbank et al., 2020. Potential evapotranspiration data are derived by Python scripts at the end of the day from the hydrometeorological data according to the Penman-Monteith method, (FAO Crop evapotranspiration - Guidelines for computing crop water requirements - FAO Irrigation and drainage paper 56). All data (including raw, quality controlled and derived) is saved in an Oracle database.","spatialRepresentationTypes":["textTable"],"temporalResolution":["1 day","30 minutes"],"topicCategories":[{"value":"environment","uri":"http://inspire.ec.europa.eu/metadata-codelist/TopicCategory/environment"}],"observedProperty":[{"value":"DATE_TIME","title":"DateTime GMT","type":"datetime","format":"YYYY-MM-DDTHH:MM:SSZ"},{"value":"LWIN","title":"Incoming longwave radiation (Mean over preceding time period)","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA/"},{"value":"LWOUT","title":"Outgoing longwave radiation (Mean over preceding time period)","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA/"},{"value":"SWIN","title":"Incoming shortwave radiation (Mean over preceding time period)","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA/"},{"value":"SWOUT","title":"Outgoing shortwave radiation (Mean over preceding time period)","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA/"},{"value":"RN","title":"Net radiation (Mean over preceding time period)","description":"Derived from:(SWIN – SWOUT) + (LWIN – LWOUT)","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA/"},{"value":"LWIN","title":"Daily total incoming longwave radiation","type":"number","units":"Megajoule per square metre per day (MJ m-2 day-1)"},{"value":"LWOUT","title":"Daily total outgoing longwave radiation","type":"number","units":"Megajoule per square metre per day (MJ m-2 day-1)"},{"value":"SWIN","title":"Daily total incoming shortwave radiation","type":"number","units":"Megajoule per square metre per day (MJ m-2 day-1)"},{"value":"SWOUT","title":"Daily total outgoing shortwave radiation","type":"number","units":"Megajoule per square metre per day (MJ m-2 day-1)"},{"value":"RN","title":"Daily total net radiation","description":"Derived from:(SWIN – SWOUT) + (LWIN – LWOUT)","type":"number","units":"Megajoule per square metre per day (MJ m-2 day-1)"},{"value":"PRECIP","title":"Precipitation from pluvio","type":"number","units":"Millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"PRECIP_TIPPING","title":"Precipitation from tipping bucket","type":"number","units":"Millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"PRECIP_RAINE","title":"Precipitation from rain[e]","type":"number","units":"Millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"PA","title":"Atmospheric pressure","type":"number","units":"HectoPascals (hPa)","unitsUri":"http://qudt.org/vocab/unit/HectoPA"},{"value":"TA","title":"Air temperature","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"WS","title":"Wind speed","description":"Absolute wind speed, not resultant wind speed of WD","type":"number","units":"Metres per second (ms-1)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UVAA"},{"value":"WD","title":"Wind direction","type":"number","units":"Degrees","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UAAA"},{"value":"Q","title":"Absolute humidity","description":"Derived from TA and RH","type":"number","units":"Grams per cubic metre (gm-3)","unitsUri":"http://qudt.org/vocab/unit/GM-PER-M3"},{"value":"RH","title":"Relative humidity","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"G1","title":"Heat flux 1","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA"},{"value":"G2","title":"Heat flux 2","type":"number","units":"Watts per square metre (W m-2)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UFAA"},{"value":"SNOW_DEPTH","title":"Snow depth","description":"Data only given on snow days","type":"number","units":"millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"UX","title":"X component of wind speed (Mean over preceding time period)","type":"number","units":"Metres per second (ms-1)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UVAA"},{"value":"UY","title":"Y component of wind speed (Mean over preceding time period)","type":"number","units":"Metres per second (ms-1)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UVAA"},{"value":"UZ","title":"Z component of wind speed (Mean over preceding time period)","type":"number","units":"Metres per second (ms-1)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UVAA"},{"value":"TDT3_TSOIL","title":"Soil temperature from TDT sensor 3 at 5 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT4_TSOIL","title":"Soil temperature from TDT sensor 4 at 5 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT3_VWC","title":"Soil moisture - volumetric water content from TDT sensor 3 at 5 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT4_VWC","title":"Soil moisture - volumetric water content from TDT sensor 4 at 5 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT5_TSOIL","title":"Soil temperature from TDT sensor 5 at 15 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT6_TSOIL","title":"Soil temperature from TDT sensor 6 at 15 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT5_VWC","title":"Soil moisture - volumetric water content from TDT sensor 5 at 15 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT6_VWC","title":"Soil moisture - volumetric water content from TDT sensor 6 at 15 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT7_TSOIL","title":"Soil temperature from tdt sensor 7 at 25 cm","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT8_TSOIL","title":"Soil temperature from tdt sensor 8 at 25 cm","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT7_VWC","title":"Soil moisture - volumetric water content from tdt sensor 7 at 25 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT8_VWC","title":"Soil moisture - volumetric water content from tdt sensor 8 at 25 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"STP_TSOIL2","title":"Soil temperature at depth 2 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"STP_TSOIL5","title":"Soil temperature at depth 5 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"STP_TSOIL10","title":"Soil temperature at depth 10 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"STP_TSOIL20","title":"Soil temperature at depth 20 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"STP_TSOIL50","title":"Soil temperature at depth 50 cm","type":"number","units":"Degrees C","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT1_TSOIL","title":"Soil temperature from TDT sensor 1 at 10 cm","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT2_TSOIL","title":"Soil temperature from TDT sensor 2 at 10 cm","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT1_VWC","title":"Soil moisture - volumetric water content from tdt sensor 1 at 10 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT2_VWC","title":"Soil moisture - volumetric water content from tdt sensor 2 at 10 cm","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT9_TSOIL","title":"Soil temperature from tdt sensor 10 at 50 cm","description":"(except for heytesbury site where sensors at 5 cm)","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT10_TSOIL","title":"Soil temperature from tdt sensor 9 at 50 cm","description":"(except for heytesbury site where sensors at 5 cm)","type":"number","units":"Degrees Celsius","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPAA"},{"value":"TDT9_VWC","title":"Soil moisture - volumetric water content from tdt sensor 9 at 50 cm","description":"(except for heytesbury site where sensors at 5 cm)","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"TDT10_VWC","title":"Soil moisture - volumetric water content from tdt sensor 10 at 50 cm","description":"(except for heytesbury site where sensors at 5 cm)","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"COSMOS_VWC","title":"Daily mean soil moisture (volumetric water content) from crns","type":"number","units":"Percent (%)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UPCT"},{"value":"CTS_MOD_CORR","title":"Daily total corrected moderated counts from crns","type":"number"},{"value":"D86_75m","title":"Daily mean effective depth of crns (d86 at 75m)","type":"number","units":"Centimetres (cm)","unitsUri":"http://qudt.org/vocab/unit/CentiM"},{"value":"SNOW","title":"Snow days","type":"number"},{"value":"SWE","title":"Snow water equivalent (value at midday 12:00 GMT)","type":"number","units":"Millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"ALBEDO","title":"Albedo (Mean between 10:00 and 14:00 GMT)","description":"Derived from SWOUT/SWIN","type":"number"},{"value":"PE","title":"Daily total potential evapo-transpiration","type":"number","units":"Millimetres (mm)","unitsUri":"http://vocab.nerc.ac.uk/collection/P06/current/UXMM/"},{"value":"GCC","title":"Daily max green colour content. proportion of green from a phenocam image","description":"Derived from green/(green + red + blue)","type":"number"}],"keywordsInstrument":[{"value":"cosmic-ray sensing probe"}],"keywordsPlace":[{"value":"UK"}],"keywordsProject":[{"value":"COSMOS-UK"},{"value":"UK-SCAPE"}],"keywordsTheme":[{"value":"Soil","uri":"http://onto.nerc.ac.uk/CEHMD/topic/17"},{"value":"Hydrology","uri":"http://onto.nerc.ac.uk/CEHMD/topic/9"},{"value":"Environmental survey","uri":"http://onto.nerc.ac.uk/CEHMD/topic/7"}],"distributionFormats":[{"name":"Comma-separated values (CSV)","type":"text/csv","version":"unknown"}],"inspireThemes":[{"theme":"Environmental Monitoring Facilities","uri":"http://inspire.ec.europa.eu/theme/ef"}],"funding":[{"funderName":"Natural Environment Research Council","funderIdentifier":"https://ror.org/02b5d8509","awardNumber":"NE/R016429/1","awardURI":"https://gtr.ukri.org/projects?ref=NE/R016429/1","orcid":false,"ror":true}],"boundingBoxes":[{"westBoundLongitude":-8.648,"eastBoundLongitude":1.768,"southBoundLatitude":49.864,"northBoundLatitude":60.861,"coordinates":"[[[-8.648, 49.864], [-8.648, 60.861], [1.768, 60.861], [1.768, 49.864], [-8.648, 49.864]]]","bounds":"{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8.648, 49.864], [-8.648, 60.861], [1.768, 60.861], [1.768, 49.864], [-8.648, 49.864]]]}}"}],"distributorContacts":[{"organisationName":"NERC EDS Environmental Information Data Centre","organisationIdentifier":"https://ror.org/04xw4m193","role":"distributor","email":"info@eidc.ac.uk"}],"responsibleParties":[{"individualName":"Smith, R.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-6447-6740"},{"individualName":"Antoniou, V.","organisationName":"Agricultural University of Athens","organisationIdentifier":"https://ror.org/03xawq568","role":"author","email":"vantoniou@aua.gr","nameIdentifier":"https://orcid.org/0000-0001-6011-4075"},{"individualName":"Askquith-Ellis, A.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Ball, L.A.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-0203-5958"},{"individualName":"Bennett, E.S.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0001-7398-9268"},{"individualName":"Blake, J.R.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-1033-4712"},{"individualName":"Boorman, D.B.","organisationName":"Unaffiliated","role":"author","email":"dbboorman@gmail.com","nameIdentifier":"https://orcid.org/0000-0002-6436-5266"},{"individualName":"Brooks, M.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-7439-0393"},{"individualName":"Clarke, M.","organisationName":"Unaffiliated","role":"author","email":"MrMAClarke@gmail.com"},{"individualName":"Cooper, H.M.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-1382-3407"},{"individualName":"Cowan, N.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-7473-7916"},{"individualName":"Cumming, A.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0001-5704-9006"},{"individualName":"Evans, J.G.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0003-4194-1416"},{"individualName":"Farrand, P.","organisationName":"Unaffiliated","role":"author","email":"pb.farrand@talktalk.net"},{"individualName":"Fry, M.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0003-1142-4039"},{"individualName":"Harvey, D.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Houghton-Carr, H.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Howson, T.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-9822-316X"},{"individualName":"Jiménez-Arranz, G.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0009-0004-4445-8272"},{"individualName":"Keen, Y.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Khamis, D.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Leeson, S.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Lord, W.D.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0003-2987-488X"},{"individualName":"Morrison, R.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-1847-3127"},{"individualName":"Nash, G.V.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0003-1611-2042"},{"individualName":"O'Callaghan, F.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Rylett, D.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-7426-1153"},{"individualName":"Scarlett, P.M.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"St Quintin, P.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Stanley, S.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-8303-2969"},{"individualName":"Swain, O.D.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Szczykulska, M.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0002-5820-7093"},{"individualName":"Teagle, S.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Thornton, J.L.","organisationName":"UK Met Office","organisationIdentifier":"https://ror.org/01ch2yn61","role":"author","email":"jenna.l.thornton@hotmail.co.uk"},{"individualName":"Trill, E.J.","organisationName":"Thomson Environmental Consultants","role":"author","email":"emilytrill@gmail.com","nameIdentifier":"https://orcid.org/0000-0002-6233-8942"},{"individualName":"Vincent, P.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Ward, H.C.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk","nameIdentifier":"https://orcid.org/0000-0001-8881-185X"},{"individualName":"Warwick, A.C.","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"author","email":"enquiries@ceh.ac.uk"},{"individualName":"Winterbourn, J.B.","organisationName":"Bangor University","organisationIdentifier":"https://ror.org/006jb1a24","role":"author","email":"benwinterbourn@gmail.com","nameIdentifier":"https://orcid.org/0000-0002-1318-5281"},{"individualName":"Richard Smith","organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"pointOfContact","email":"enquiries@ceh.ac.uk","address":{"deliveryPoint":"Maclean Building, Benson Lane, Crowmarsh Gifford","city":"Wallingford","administrativeArea":"Oxfordshire","postalCode":"OX10 8BB","country":"United Kingdom"}},{"organisationName":"UK Centre for Ecology & Hydrology","organisationIdentifier":"https://ror.org/00pggkr55","role":"rightsHolder","email":"enquiries@ceh.ac.uk"},{"organisationName":"NERC EDS Environmental Information Data Centre","organisationIdentifier":"https://ror.org/04xw4m193","role":"custodian","email":"info@eidc.ac.uk"},{"organisationName":"NERC EDS Environmental Information Data Centre","organisationIdentifier":"https://ror.org/04xw4m193","role":"publisher","email":"info@eidc.ac.uk"}],"temporalExtents":[{"begin":"2013-01-01","end":"2023-12-31"}],"onlineResources":[{"url":"https://catalogue.ceh.ac.uk/datastore/eidchub/399ed9b1-bf59-4d85-9832-ee4d29f49bfb","name":"Download the data","description":"Download a copy of this data","function":"download","type":"OTHER"},{"url":"https://data-package.ceh.ac.uk/sd/399ed9b1-bf59-4d85-9832-ee4d29f49bfb.zip","name":"Supporting information","description":"Supporting information available to assist in re-use of this dataset","function":"information","type":"OTHER"},{"url":"https://eidc.ceh.ac.uk/images/browsegraphics/cosmos-uk.png","name":"COSMOS-UK logo","function":"browseGraphic","type":"OTHER"}],"spatialReferenceSystems":[{"code":"http://www.opengis.net/def/crs/EPSG/0/27700","title":"OSGB 1936 / British National Grid"},{"code":"http://www.opengis.net/def/crs/EPSG/0/4326","title":"WGS 84"}],"incomingCitations":[{"description":"Wang, Q., Shan, Y., Morten, C., Hunt, J., Harris, P., & Wu, L. (2024). Spatial and temporal measurement of soil moisture and nitrogen in a pasture field [Dataset]. Rothamsted Research.","url":"https://doi.org/10.23637/ROTHAMSTED.9910X"}],"supplemental":[{"description":"COSMOS-UK website","url":"https://cosmos.ceh.ac.uk/","function":"website"},{"name":"Video data guide","description":"To find out more about the different available datasets, see our video data guide","url":"https://www.youtube.com/watch?v=Hjo8n_nLbrU&list=PLxBmLvubPKVXN8jMehc9VxhW6-gRk6UJ-","function":"website"},{"description":"Evans, J.G., Ward, H.C., Blake, J.R., Hewitt, E.J., Morrison, R., Fry, M., Ball, L. A., Doughty, L.C., Libre, J.W., Hitt, O.E., Rylett, D., Ellis, R.J., Warwick, A.C., Brooks, M., Parkes, M.A., Wright, G.M.H., Singer, A.C., Boorman, D.B., & Jenkins, A. (2016). Soil water content in southern England derived from a cosmic-ray soil moisture observing system - COSMOS-UK. In Hydrological Processes (Vol. 30, Issue 26, pp. 4987–4999). Wiley.","url":"https://doi.org/10.1002/hyp.10929","function":"relatedArticle"},{"description":"Deriving snow water equivalent using cosmic-ray neutron sensors from the COSMOS-UK network for modelling snowmelt floods Wallbank, John R. ; Anderson, Seonaid R. ; Cole, Steven J. ; Moore, Robert J. ; Wells, Steven C., 2020.","url":"https://ui.adsabs.harvard.edu/abs/2019EGUGA..2116420W/abstract","function":"relatedArticle"},{"description":"Penman-Monteith method, Chapter 4 - Determination of ETo in ‘Crop evapotranspiration - Guidelines for computing crop water requirements - FAO Irrigation and drainage paper 56’.","url":"http://www.fao.org/3/X0490E/x0490e00.htm","function":"relatedArticle"}],"datasetReferenceDate":{"publicationDate":"2024-04-08"},"useConstraints":[{"value":"This resource is available under the terms of the Open Government Licence","code":"license","uri":"https://eidc.ceh.ac.uk/licences/OGL/plain"}],"resourceType":{"value":"dataset","uri":"http://inspire.ec.europa.eu/metadata-codelist/ResourceType/dataset"},"accessLimitation":{"value":"no limitations to public access","code":"Available","uri":"http://inspire.ec.europa.eu/metadata-codelist/LimitationsOnPublicAccess/noLimitations"},"notGEMINI":false,"resourceStatus":"Available"}} From 9de22f0bd13a875fbcc6223762a252a61dbe1602 Mon Sep 17 00:00:00 2001 From: Philip Trembath Date: Thu, 7 Nov 2024 12:04:20 +0000 Subject: [PATCH 4/4] changed observedProperties to macro --- templates/html/document/_tags.ftlh | 37 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/templates/html/document/_tags.ftlh b/templates/html/document/_tags.ftlh index 83c39a096..bf54a80d4 100644 --- a/templates/html/document/_tags.ftlh +++ b/templates/html/document/_tags.ftlh @@ -17,25 +17,30 @@ <#if observedProperty?has_content> + <@displayObservedProperties observedProperty /> + + +<#macro displayObservedProperties op>
Observed properties
- <#list observedProperty?sort_by("value") as item> - <#assign opLabel="unknown"> - <#if item.title?has_content> - <#assign opLabel=item.title?trim> - <#elseif item.value?has_content> - <#assign opLabel=item.value?trim> - + <#list op?sort_by("value") as item> + <#local opLabel="unknown"> + <#if item.title?has_content> + <#local opLabel=item.title?trim> + <#elseif item.value?has_content> + <#local opLabel=item.value?trim> + - <#if item.uri?has_content> - ${opLabel} - - <#else> - ${opLabel} - - <#sep>
- - + <#if item.uri?has_content> + ${opLabel} + + <#else> + ${opLabel} + + <#sep>
+ +
+ <#macro keywordList list listTitle="Keywords" commaseparated=false>
${listTitle}