source: metadata/trunk/toolkit/upgrade/cmd-record-1_1-to-1_2.xsl @ 5632

Last change on this file since 5632 was 5632, checked in by Menzo Windhouwer, 10 years ago

M toolkit/upgrade/cmd-record-1_1-to-1_2.xsl

  • now works for the Adelheid CMDI 1.1 record
File size: 6.1 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4    xmlns:xs="http://www.w3.org/2001/XMLSchema"
5    xmlns:cmd="http://www.clarin.eu/cmd/"
6    exclude-result-prefixes="xs"
7    version="2.0">
8   
9    <xsl:param name="cmd-envelop-xsd" select="'../../xsd/cmd-envelop.xsd'"/>
10    <xsl:param name="cmd-profile-xsd" select="'../components/ToolService-1_2.xsd'"/>
11   
12
13    <!-- identity copy -->
14    <xsl:template match="@*|node()">
15        <xsl:copy>
16            <xsl:apply-templates select="@*|node()"/>
17        </xsl:copy>
18    </xsl:template>
19   
20    <!-- try to determine the profile -->
21    <xsl:variable name="profile">
22        <xsl:variable name="header" select="/cmd:CMD/cmd:Header/cmd:MdProfile/replace(.,'.*(clarin.eu:cr1:p_[0-9]).*','$1')"/>
23        <xsl:variable name="schema" select="/cmd:CMD/(@xsi:schemaLocation|@xsi:noNamespaceSchemaLocation)/replace(.,'.*(clarin.eu:cr1:p_[0-9]+).*','$1')"/>
24        <xsl:if test="count($header) gt 1">
25            <xsl:message>WRN: found more then one profile ID (<xsl:value-of select="string-join($header,',')"/>) in a cmd:MdProfile, will use the first one! </xsl:message>
26        </xsl:if>
27        <xsl:if test="count($schema) gt 1">
28            <xsl:message>WRN: found more then one profile ID (<xsl:value-of select="string-join($schema,',')"/>) in a xsi:schemaLocation, will use the first one! </xsl:message>
29        </xsl:if>
30        <xsl:choose>
31            <xsl:when test="exists($header) and exists($schema)">
32                <xsl:if test="($header)[1] ne ($schema)[1]">
33                    <xsl:message>WRN: the profile IDs found in cmd:MdProfile (<xsl:value-of select="($header)[1]"/>) and xsi:schemaLocation (<xsl:value-of select="($schema)[1]"/>), don't agree, will use the xsi:schemaLocation!</xsl:message>
34                </xsl:if>
35                <xsl:value-of select="($schema)[1]"/>
36            </xsl:when>
37            <xsl:when test="exists($header) and empty($schema)">
38                <xsl:value-of select="($header)[1]"/>
39            </xsl:when>
40            <xsl:when test="empty($header) and exists($schema)">
41                <xsl:value-of select="($schema)[1]"/>
42            </xsl:when>
43            <xsl:otherwise>
44                <xsl:message terminate="yes">ERR: the profile ID can't be determined!</xsl:message>
45            </xsl:otherwise>
46        </xsl:choose>
47    </xsl:variable>
48   
49    <!-- CMD version becomes 1.2 -->
50    <xsl:template match="/cmd:CMD/@CMDVersion">
51        <xsl:attribute name="CMDVersion" select="'1.2'"/>
52    </xsl:template>
53   
54    <!-- Create our own xsi:schemaLocation -->
55    <xsl:template match="@xsi:schemaLocation"/>
56   
57    <xsl:template match="@xsi:noNamespaceSchemaLocation"/>
58   
59    <xsl:template match="cmd:CMD">
60        <cmd:CMD>
61            <xsl:namespace name="cmd" select="'http://www.clarin.eu/cmd/'"/>
62            <xsl:namespace name="cmdp" select="$profile"/>
63            <xsl:apply-templates select="@* except (@xsi:schemaLocation|@xsi:noNamespaceSchemaLocation)"/>
64            <xsl:attribute name="xsi:schemaLocation">
65                <xsl:text>http://www.clarin.eu/cmd/ </xsl:text>
66                <xsl:value-of select="$cmd-envelop-xsd"/>
67                <xsl:text> </xsl:text>
68                <xsl:value-of select="$profile"/>
69                <xsl:text> </xsl:text>
70                <xsl:value-of select="$cmd-profile-xsd"/>
71            </xsl:attribute>
72            <xsl:apply-templates select="cmd:Header"/>
73            <xsl:apply-templates select="cmd:Resources"/>
74            <xsl:apply-templates select="cmd:Resources/cmd:IsPartOfList"/>
75            <xsl:apply-templates select="cmd:Components"/>
76        </cmd:CMD>
77    </xsl:template>
78   
79    <!-- Make sure cmd:Header contains cmd:MdProfile -->
80    <xsl:template match="cmd:Header">
81        <cmd:Header>
82            <xsl:apply-templates select="cmd:MdCreator"/>
83            <xsl:apply-templates select="cmd:MdCreationDate"/>
84            <xsl:apply-templates select="cmd:MdSelfLink"/>
85            <cmd:MdProfile>
86                <xsl:value-of select="$profile"/>
87            </cmd:MdProfile>
88            <xsl:apply-templates select="cmd:MdCollectionDisplayName"/>
89        </cmd:Header>
90    </xsl:template>
91   
92    <!-- Skip cmd:Resources/cmd:IsPartOfList -->
93    <xsl:template match="cmd:Resources">
94        <cmd:Resources>
95            <xsl:apply-templates select="cmd:ResourceProxyList"/>
96            <xsl:apply-templates select="cmd:JournalFileProxyList"/>
97            <xsl:apply-templates select="cmd:ResourceRelationList"/>
98        </cmd:Resources>
99    </xsl:template>
100   
101    <!-- Reshape ResourceRelationList -->
102    <xsl:template match="cmd:ResourceRelation/cmd:RelationType">
103        <cmd:RelationType>
104            <!-- take the string value, ignore deeper structure -->
105            <xsl:value-of select="."/>
106        </cmd:RelationType>
107    </xsl:template>
108   
109    <xsl:template match="cmd:ResourceRelation/cmd:res1">
110        <cmd:Resource>
111            <xsl:apply-templates select="@*"/>
112        </cmd:Resource>
113    </xsl:template>
114   
115    <xsl:template match="cmd:ResourceRelation/cmd:res2">
116        <cmd:Resource>
117            <xsl:apply-templates select="@*"/>
118        </cmd:Resource>
119    </xsl:template>
120   
121    <!-- put envelop in the envelop namespace (it already is, but add the namespace) -->
122    <xsl:template match="/cmd:CMD//*" priority="1">
123        <xsl:element name="cmd:{local-name()}">
124            <xsl:apply-templates select="@*|node()"/>
125        </xsl:element>
126    </xsl:template>
127   
128    <!-- put payload in the profile namespace -->
129    <xsl:template match="cmd:Components//*" priority="2">
130        <xsl:element namespace="{$profile}" name="cmdp:{local-name()}">
131            <xsl:apply-templates select="@*|node()"/>
132        </xsl:element>
133    </xsl:template>
134   
135    <!-- move CMD attributes to the CMD namespace -->
136    <xsl:template match="cmd:Components//@ref">
137        <xsl:attribute name="cmd:ref" select="."/>
138    </xsl:template>
139   
140    <xsl:template match="cmd:Components//@ComponentId">
141        <xsl:attribute name="cmd:ComponentId" select="."/>
142    </xsl:template>
143   
144   
145</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.