source: cats/ISOcat/trunk/mod-ISOcat-interface-rest/representations/dcs2/rng.xsl @ 2326

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

M mod-ISOcat-access-data/dbms/ISOcat-schema-init.sql

  • add SCHEMAcat reference as a new rule type

M mod-ISOcat-interface-rest/representations/dcs2/xsd.xsl

  • add a SCHEMAcat reference as an appinfo

M mod-ISOcat-interface-rest/representations/dcs2/rng.xsl

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