source: ISOcat/trunk/mod-ISOcat-interface-rest/representations/dcs2/xsd.xsl @ 2029

Last change on this file since 2029 was 2029, checked in by mwindhouwer, 12 years ago

Initial import of all the *cats, i.e., ISOcat, RELcat and SCHEMAcat.

File size: 7.6 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
3    xmlns:dcif="http://www.isocat.org/ns/dcif" xmlns:dcr="http://www.isocat.org/ns/dcr"
4    xmlns:isocat="http://www.isocat.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
5    xmlns:sch="http://purl.oclc.org/dsdl/schematron" exclude-result-prefixes="dcif isocat">
6    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
7    <xsl:param name="props"/>
8    <xsl:variable name="NL" select="system-property('line.separator')"/>
9    <xsl:variable name="indent" select="'&#160;&#160;&#160;&#160;'"/>
10    <xsl:template match="text()"/>
11
12    <xsl:template match="dcif:dataCategorySelection">
13        <xs:schema>
14            <xsl:comment>
15                <xsl:value-of select="$indent"/>
16                <xsl:text>This XML Schema document is mainly a template to be further developed in a full</xsl:text>
17                <xsl:value-of select="$NL"/>
18                <xsl:value-of select="$indent"/>
19                <xsl:text>schema. It's main purpose is to provide dcr:datcat annotation attributes to</xsl:text>
20                <xsl:value-of select="$NL"/>
21                <xsl:value-of select="$indent"/>
22                <xsl:text>maintain the link between the generated elements and values and the used Data</xsl:text>
23                <xsl:value-of select="$NL"/>
24                <xsl:value-of select="$indent"/>
25                <xsl:text>Categories.</xsl:text>
26                <xsl:value-of select="$NL"/>
27            </xsl:comment>
28            <xsl:apply-templates select="dcif:dataCategory"/>
29        </xs:schema>
30    </xsl:template>
31
32    <xsl:template match="dcif:dataCategory[@type='container']">
33        <xsl:variable name="name" select="./@isocat:identifier"/>
34        <xsl:variable name="datcatref" select="./@pid"/>
35        <xs:element name="{$name}" dcr:datcat="{$datcatref}">
36            <xs:complexType>
37                <xsl:comment>
38                    <xsl:value-of select="$indent"/>
39                    <xsl:text>Embed (references to) other elements related to container or complex</xsl:text>
40                    <xsl:value-of select="$NL"/>
41                    <xsl:value-of select="$indent"/>
42                    <xsl:text>Data Categories here.</xsl:text>
43                    <xsl:value-of select="$NL"/>
44                </xsl:comment>
45            </xs:complexType>
46        </xs:element>
47    </xsl:template>
48   
49    <xsl:template match="dcif:dataCategory[@type='complex']">
50        <xsl:variable name="name" select="./@isocat:identifier"/>
51        <xsl:variable name="datcatref" select="./@pid"/>
52        <xsl:variable name="datatype" select="./dcif:conceptualDomain[1]/dcif:dataType"/>
53        <xs:element name="{$name}" dcr:datcat="{$datcatref}">
54            <xsl:choose>
55                <xsl:when test="./@isocat:type eq 'open'">
56                    <xsl:attribute name="type" select="concat('xs:',$datatype)"/>
57                </xsl:when>
58                <xsl:when test="./@isocat:type eq 'constrained'">
59                    <xsl:call-template name="conceptualDomainTemplate"/>
60                </xsl:when>
61                <xsl:when test="./@isocat:type eq 'closed'">
62                    <xs:simpleType>
63                        <xs:restriction base="xs:{$datatype}">
64                            <xsl:for-each-group select="dcif:conceptualDomain/dcif:value[empty(@isocat:suppress) or (@isocat:suppress!='true')]" group-by="@isocat:name">
65                                <xsl:for-each select="current-group()">
66                                    <xsl:variable name="datcat" select="./@pid"/>
67                                    <xsl:variable name="groupname"
68                                        select="current-grouping-key()"/>
69                                    <xsl:choose>
70                                        <xsl:when test="position() eq 1">
71                                            <xs:enumeration value="{$groupname}"
72                                              dcr:datcat="{$datcat}"/>
73                                        </xsl:when>
74                                        <xsl:otherwise>
75                                            <xsl:value-of select="$NL"/>
76                                            <xsl:comment>
77                                              <xsl:text>&lt;xs:enumeration value="</xsl:text>
78                                              <xsl:value-of select="$groupname"/>
79                                              <xsl:text>" dcr:datcat="</xsl:text>
80                                              <xsl:value-of select="$datcat"/>
81                                              <xsl:text>"/></xsl:text>
82                                            </xsl:comment>
83                                            <xsl:value-of select="$NL"/>
84                                        </xsl:otherwise>
85                                    </xsl:choose>
86                                </xsl:for-each>
87                            </xsl:for-each-group>
88                        </xs:restriction>
89                    </xs:simpleType>
90                </xsl:when>
91            </xsl:choose>
92        </xs:element>
93    </xsl:template>
94   
95    <!-- skip simple DCs as they are handled through the value domain of a closed DC -->
96    <xsl:template match="dcif:dataCategory[@type='simple']"/>
97
98    <xsl:template match="*" mode="nonscopy">
99        <xsl:element name="{local-name(.)}" namespace="{namespace-uri()}">
100            <xsl:copy-of select="@*"/>
101            <xsl:apply-templates mode="nonscopy"/>
102        </xsl:element>
103    </xsl:template>
104
105    <xsl:template name="conceptualDomainTemplate">
106        <xsl:choose>
107            <xsl:when test="dcif:conceptualDomain[dcif:ruleType='XML Schema facet']">
108                <xsl:variable name="datatype" select="(dcif:conceptualDomain/dcif:dataType)[1]"/>
109                <xs:simpleType>
110                    <xs:restriction base="xs:{$datatype}">
111                        <xsl:apply-templates
112                            select="(dcif:conceptualDomain[dcif:ruleType='XML Schema facet']/dcif:rule/*)[1]"
113                            mode="nonscopy"/>
114                    </xs:restriction>
115                </xs:simpleType>
116            </xsl:when>
117            <xsl:when test="dcif:conceptualDomain[dcif:ruleType='XML Schema regular expression']">
118                <xsl:variable name="datatype" select="(dcif:conceptualDomain/dcif:dataType)[1]"/>
119                <xs:simpleType>
120                    <xs:restriction base="xs:{$datatype}">
121                        <xsl:variable name="pattern"
122                            select="(dcif:conceptualDomain[dcif:ruleType='XML Schema regular expression']/dcif:rule)[1]"/>
123                        <xs:pattern value="{$pattern}"/>
124                    </xs:restriction>
125                </xs:simpleType>
126            </xsl:when>
127            <xsl:when test="dcif:conceptualDomain[dcif:ruleType='Schematron rule']">
128                <xsl:variable name="datatype" select="(dcif:conceptualDomain/dcif:dataType)[1]"/>
129                <xsl:attribute name="type" select="concat('xs:',$datatype)"/>
130                <xsl:apply-templates
131                    select="(dcif:conceptualDomain[dcif:ruleType='Schematron rule']/dcif:rule/*)[1]"
132                    mode="nonscopy"/>
133            </xsl:when>
134            <xsl:otherwise>
135                <xsl:variable name="datatype" select="(dcif:conceptualDomain/dcif:dataType)[1]"/>
136                <xsl:attribute name="type" select="concat('xs:',$datatype)"/>
137            </xsl:otherwise>
138        </xsl:choose>
139    </xsl:template>
140</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.