<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:cc="http://creativecommons.org/ns#" xmlns:skosxl="http://www.w3.org/2008/05/skos-xl#" xmlns:exslt="http://exslt.org/common" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:isothes="http://purl.org/iso25964/skos-thes#" xmlns:wdt="https://www.wikidata.org/wiki/Property:" xmlns:lexinfo="http://www.lexinfo.net/ontology/2.0/lexinfo#" xmlns:obo="http://purl.obolibrary.org/obo/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:gn="https://www.geonames.org/ontology#" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:gvp="http://vocab.getty.edu/ontology#" xmlns:inist="http://www.inist.fr/Ontology#" exclude-result-prefixes="exslt "> <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/> <!-- ================================================================= Recalcul des relations internes (broader, narrower, related, member) pour un fichier SKOS dont les concpets ont reçu un identifiant ark généré à l'aide d'un webservice ad hoc. Les concepts cumulent un attribut" rdf:about" contenant l'uri d'origine et un attribut "xml:lid" contenant l'identifiant ark. Si l'ancien identifiant est déjà un ark, il est gardé tel quel.--> <!--ancien uri de la ressource--> <xsl:variable name="ancienPrefixe"> <xsl:choose> <xsl:when test="//skos:ConceptScheme"> <xsl:value-of select="//skos:ConceptScheme/@rdf:about"/> </xsl:when> <xsl:when test="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]"> <xsl:value-of select="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]/@rdf:about"/> </xsl:when> <xsl:when test="//owl:Ontology[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]"> <xsl:value-of select="//owl:Ontology[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]/@rdf:about"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="//skos:Concept[1]/skos:inScheme/@rdf:resource"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="uriArkLoterre" select="'[A-Z0-9]{{3}}-[A-Z0-9]{{8}}-[A-Z0-9]'" /> <!-- partie fixe de l'identifiant des concepts : si la ressource est une ressource Loterre, on garde l'uri actuel ; dna le cas contraire, on génère un préfixe à modifier ultérieurement par l'utilisateur--> <xsl:variable name="nouveauPrefixe"> <xsl:choose> <xsl:when test="matches(//skos:ConceptScheme/@rdf:about, 'http://data.loterre.fr/ark:/67375/[A-Z0-9]{3}')"><!--syntaxe de l'identifiant ark Loterre--> <xsl:value-of select="//skos:ConceptScheme/@rdf:about"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="'http://mon_site.fr/ark:/NAAN/ABC'"/> <!-- <xsl:value-of select="'http://data.loterre.fr/ark:/67375/8HQ'"/>--> </xsl:otherwise> </xsl:choose> </xsl:variable> <!--================================================================ rdf:RDF =================================================================--> <xsl:template match="rdf:RDF"> <!-- variable pour stocker le résultat du traitement qui sera réutilisé pour calculer les relations TA, TG--> <xsl:variable name="ARK"> <ark> <xsl:copy-of select="namespace::*"/> <rdf:RDF> <cc:License rdf:about="http://creativecommons.org/licenses/by/4.0/"> <cc:requires rdf:resource="http://creativecommons.org/ns#Notice"/> <cc:requires rdf:resource="http://creativecommons.org/ns#Attribution"/> <dc:title xml:lang="en">Attribution 4.0 International</dc:title> <cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/> <cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/> <cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/> </cc:License> <xsl:choose> <xsl:when test="skos:ConceptScheme"> <skos:ConceptScheme> <xsl:attribute name="rdf:about"> <xsl:value-of select="$nouveauPrefixe"/> </xsl:attribute> <!-- <xsl:copy-of select="skos:ConceptScheme/*"/>--> <xsl:for-each select="skos:ConceptScheme/*"> <xsl:element name="{name()}"> <xsl:copy-of select="@*"/> <xsl:value-of select="normalize-space(.)"/> </xsl:element> </xsl:for-each> <!-- ancien identifiant --> <dc:identifier> <xsl:value-of select="$ancienPrefixe"/> </dc:identifier> </skos:ConceptScheme> </xsl:when> <xsl:when test="rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]"> <rdf:Description> <xsl:attribute name="rdf:about"> <xsl:value-of select="$nouveauPrefixe"/> </xsl:attribute> <xsl:for-each select="rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]/*"> <xsl:element name="{name()}"> <xsl:copy-of select="@*"/> <xsl:value-of select="normalize-space(.)"/> </xsl:element> </xsl:for-each> <!-- ancien identifiant --> <dc:identifier> <xsl:value-of select="$ancienPrefixe"/> </dc:identifier> </rdf:Description> </xsl:when> </xsl:choose> <xsl:apply-templates select="skos:Concept |rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']] "/> <xsl:apply-templates select="skos:Collection | isothes:ConceptGroup |rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Collection' or @rdf:resource='http://purl.org/iso25964/skos-thes#ConceptGroup']]"/> <xsl:apply-templates select="skosxl:Label |rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2008/05/skos-xl#Label']] "/> </rdf:RDF> </ark> </xsl:variable> <!-- on reparcourt tout le fichier résultat de la première transformation pour recalculer les TA, TG, TS, skos:member --> <xsl:apply-templates select="exslt:node-set($ARK)/ark"/> </xsl:template> <!--================================================================= skos:Concept ===================================================================--> <xsl:template match="skos:Concept | rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']]"> <xsl:element name="{name()}"> <xsl:attribute name="rdf:about"> <xsl:value-of select="@uri"/> </xsl:attribute> <xsl:copy-of select="rdf:type"/> <!--on recopie tout sauf inScheme et les skosxl--> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test="name(.)='skos:inScheme' or name(.)='skosxl:prefLabel' or name(.)='skosxl:altLabel' or name(.)='skosxl:hiddenLabel' "> </xsl:when> <xsl:otherwise> <!-- <xsl:copy-of select="."/>--> <xsl:element name="{name()}"> <xsl:copy-of select="@*"/> <xsl:value-of select="normalize-space(.)"/> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:for-each> <skos:inScheme> <xsl:attribute name="rdf:resource"> <xsl:value-of select="$nouveauPrefixe"/> </xsl:attribute> </skos:inScheme> <xsl:for-each select="skosxl:prefLabel"> <skosxl:prefLabel> <xsl:attribute name="rdf:resource"> <xsl:choose> <xsl:when test="contains(@rdf:resource, $ancienPrefixe)"> <xsl:call-template name="replace"> <xsl:with-param name="uri" select="@rdf:resource"/> <xsl:with-param name="replace" select="$ancienPrefixe"/> <xsl:with-param name="by" select="$nouveauPrefixe"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="@rdf:resource"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> </skosxl:prefLabel> </xsl:for-each> <xsl:for-each select="skosxl:altLabel"> <skosxl:altLabel> <xsl:attribute name="rdf:resource"> <xsl:choose> <xsl:when test="contains(@rdf:resource, $ancienPrefixe)"> <xsl:call-template name="replace"> <xsl:with-param name="uri" select="@rdf:resource"/> <xsl:with-param name="replace" select="$ancienPrefixe"/> <xsl:with-param name="by" select="$nouveauPrefixe"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="@rdf:resource"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> </skosxl:altLabel> </xsl:for-each> <xsl:for-each select="skosxl:hiddenLabel"> <skosxl:hiddenLabel> <xsl:attribute name="rdf:resource"> <xsl:choose> <xsl:when test="contains(@rdf:resource, $ancienPrefixe)"> <xsl:call-template name="replace"> <xsl:with-param name="uri" select="@rdf:resource"/> <xsl:with-param name="replace" select="$ancienPrefixe"/> <xsl:with-param name="by" select="$nouveauPrefixe"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="@rdf:resource"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> </skosxl:hiddenLabel> </xsl:for-each> <!--ancien uri--> <dc:identifier> <xsl:value-of select="@rdf:about"/> </dc:identifier> </xsl:element> </xsl:template> <!--================================================================= skos:Collection ===================================================================--> <xsl:template match="skos:Collection | isothes:ConceptGroup | rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Collection' or @rdf:resource='http://purl.org/iso25964/skos-thes#ConceptGroup']] "> <xsl:element name="{name()}"> <xsl:attribute name="rdf:about"> <xsl:value-of select="concat($nouveauPrefixe,'-',substring-after(@rdf:about, concat($ancienPrefixe,'/')))"/> <!--xsl:value-of select="@rdf:about"/--> </xsl:attribute> <xsl:copy-of select="rdf:type"/> <skos:inScheme> <xsl:attribute name="rdf:resource"> <xsl:value-of select="$nouveauPrefixe"/> </xsl:attribute> </skos:inScheme> <xsl:copy-of select="skos:prefLabel"/> <xsl:copy-of select="skos:altLabel"/> <xsl:for-each select="isothes:superGroup"> <isothes:superGroup> <xsl:attribute name="rdf:resource"> <!--xsl:value-of select="substring-after(@rdf:resource, '/vocabs/')"/--> <xsl:value-of select="concat($nouveauPrefixe,'-',substring-after(@rdf:resource, concat($ancienPrefixe,'/')))"/> </xsl:attribute> </isothes:superGroup> </xsl:for-each> <xsl:for-each select="isothes:subGroup"> <isothes:subGroup> <xsl:attribute name="rdf:resource"> <!--xsl:value-of select="substring-after(@rdf:resource, '/vocabs/')"/--> <xsl:value-of select="concat($nouveauPrefixe,'-',substring-after(@rdf:resource, concat($ancienPrefixe,'/')))"/> </xsl:attribute> </isothes:subGroup> </xsl:for-each> <xsl:copy-of select="skos:member"/> <xsl:copy-of select="rdfs:comment"/> </xsl:element> </xsl:template> <!-- ================================================================== recalcul TA-TG ================================================================== --> <xsl:template match="ark"> <rdf:RDF> <!-- récupérer les name spaces du document traité dans la racine du fichier résultat --> <xsl:copy-of select="namespace::*"/> <cc:License> <xsl:copy-of select="rdf:RDF/cc:License/@*"/> <xsl:copy-of select="rdf:RDF/cc:License/*"/> </cc:License> <xsl:apply-templates select="rdf:RDF/skos:ConceptScheme | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]"/> <!--contrôle d'unicité de l'identifiant ark--> <xsl:choose> <xsl:when test="not(rdf:RDF/skos:Concept[@rdf:about=preceding::rdf:RDF/skos:Concept/@rdf:about] or rdf:RDF/skos:Concept[@rdf:about=following::rdf:RDF/skos:Concept/@rdf:about] or rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and @rdf:about=preceding::rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']]/@rdf:about] or rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and @rdf:about=following::rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']]/@rdf:about]) "> <xsl:apply-templates select="rdf:RDF/skos:Concept | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']]" mode="recalcul"/> <xsl:copy-of select="rdf:RDF/skosxl:Label | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2008/05/skos-xl#Label']]"/> <xsl:apply-templates select="rdf:RDF/skos:Collection | rdf:RDF/isothes:ConceptGroup | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Collection' or @rdf:resource='http://purl.org/iso25964/skos-thes#ConceptGroup']]" mode ="recalcul"/> </xsl:when> <xsl:otherwise> <alerte>Doublon au niveau des arks</alerte> </xsl:otherwise> </xsl:choose> </rdf:RDF> </xsl:template> <!-- ================================================================= skos:ConceptScheme ===================================================================== --> <xsl:template match="skos:ConceptScheme | rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#ConceptScheme']]"> <xsl:element name="{name()}"> <xsl:copy-of select="@rdf:about"/> <!--on recopie tout sauf la relation hasTopConcept--> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test="name(.)='skos:hasTopConcept'"> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:for-each select="skos:hasTopConcept"> <skos:hasTopConcept> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </skos:hasTopConcept> </xsl:for-each> </xsl:element> </xsl:template> <!-- ================================================================= skos:Concept ===================================================================== --> <xsl:template match="rdf:RDF/skos:Concept | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept']]" mode ="recalcul"> <xsl:element name="{name()}"> <xsl:copy-of select="@rdf:about"/> <!--on recopie tout sauf les relations--> <xsl:for-each select="./*[not(name(.)=('dc:identifier','skos:broader','skos:related','skos:narrower', 'isothes:broaderPartitive', 'isothes:narrowerPartitive', 'isothes:broaderInstantial', 'isothes:narrowerInstantial'))]"> <xsl:copy-of select="."/> </xsl:for-each> <xsl:for-each select="skos:broader"> <xsl:variable name="verbalisation" select="."/> <skos:broader> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> <!-- <xsl:copy-of select="$verbalisation"/>--> </skos:broader> </xsl:for-each> <xsl:for-each select="skos:narrower"> <skos:narrower> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </skos:narrower> </xsl:for-each> <xsl:for-each select="isothes:broaderPartitive"> <xsl:variable name="verbalisation" select="."/> <isothes:broaderPartitive> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> <!-- <xsl:copy-of select="$verbalisation"/>--> </isothes:broaderPartitive> </xsl:for-each> <xsl:for-each select="isothes:narrowerPartitive"> <isothes:narrowerPartitive> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </isothes:narrowerPartitive> </xsl:for-each> <xsl:for-each select="isothes:broaderInstantial"> <xsl:variable name="verbalisation" select="."/> <isothes:broaderInstantial> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> <!-- <xsl:copy-of select="$verbalisation"/>--> </isothes:broaderInstantial> </xsl:for-each> <xsl:for-each select="isothes:narrowerInstantial"> <isothes:narrowerInstantial> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </isothes:narrowerInstantial> </xsl:for-each> <xsl:for-each select="skos:related"> <skos:related> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </skos:related> </xsl:for-each> <xsl:copy-of select="comment()"/> </xsl:element> </xsl:template> <!-- ======================================================== Remplacement uri par ark ========================================================== --> <xsl:template name="ark"> <xsl:param name="resource"/> <xsl:choose> <xsl:when test="//skos:Concept[dc:identifier=$resource]"> <xsl:value-of select="//skos:Concept[dc:identifier=$resource]/@rdf:about"/> </xsl:when> <xsl:when test="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and dc:identifier=$resource]"> <xsl:value-of select="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and dc:identifier=$resource]/@rdf:about"/> </xsl:when> </xsl:choose> </xsl:template> <!-- ================================================================= skos:Collection ===================================================================== --> <xsl:template match="rdf:RDF/skos:Collection | rdf:RDF/isothes:ConceptGroup | rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Collection' or @rdf:resource='http://purl.org/iso25964/skos-thes#ConceptGroup' ]]" mode ="recalcul"> <xsl:element name="{name()}"> <xsl:copy-of select="@rdf:about"/> <!--on recopie tout sauf les relations--> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test="name(.)='skos:member'"> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:for-each select="skos:member"> <skos:member> <xsl:attribute name="rdf:resource"> <xsl:call-template name="ark2"> <xsl:with-param name="resource"> <xsl:value-of select="@rdf:resource"/> </xsl:with-param> </xsl:call-template> </xsl:attribute> </skos:member> </xsl:for-each> </xsl:element> </xsl:template> <!-- ============================================================= Remplacement uri skos:member par ark si existant ==============================================================--> <xsl:template name="ark2"> <xsl:param name="resource"/> <xsl:choose> <xsl:when test="//skos:Concept[dc:identifier=$resource]"> <xsl:value-of select="//skos:Concept[dc:identifier=$resource]/@rdf:about"/> </xsl:when> <xsl:when test="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and dc:identifier=$resource]"> <xsl:value-of select="//rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2004/02/skos/core#Concept'] and dc:identifier=$resource]/@rdf:about"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$resource"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- ============================================================= Remplacement uri skosxl ==============================================================--> <xsl:template name="replace"> <xsl:param name="uri"/> <xsl:param name="replace"/> <xsl:param name="by"/> <xsl:choose> <xsl:when test="contains($uri, $replace)"> <xsl:value-of select="substring-before($uri,$replace)"/> <xsl:value-of select="$by"/> <xsl:value-of select="substring-after($uri,$replace)"/> </xsl:when> </xsl:choose> </xsl:template> <!-- ============================================================= skosxl:Label ==============================================================--> <xsl:template match="skosxl:Label | rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2008/05/skos-xl#Label']]"> <xsl:element name="{name()}"> <xsl:attribute name="rdf:about"> <xsl:choose> <xsl:when test="contains(@rdf:about, $ancienPrefixe)"> <xsl:call-template name="replace"> <xsl:with-param name="uri" select="@rdf:about"/> <xsl:with-param name="replace" select="$ancienPrefixe"/> <xsl:with-param name="by" select="$nouveauPrefixe"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="@rdf:about"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:copy-of select="./*"/> </xsl:element> </xsl:template> </xsl:stylesheet>