source: ComponentRegistry/trunk/CMDValidate/src/main/resources/schematron/ExtractSchFromXSD-2.xsl @ 1745

Last change on this file since 1745 was 1745, checked in by twagoo, 12 years ago

Adding CMDValidator project to the repository. Somewhat modified version of the one written by Menzo. To be used in the component registry.

  • Property svn:executable set to *
File size: 4.5 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<!--
3        based on an original transform by Eddie Robertsson
4        2001/04/21      fn: added support for included schemas
5        2001/06/27      er: changed XMl Schema prefix from xsd: to xs: and changed to the Rec namespace
6        2010/04/14      rj: Update for ISO Schematron using xslt2
7-->
8<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
9xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns:xs="http://www.w3.org/2001/XMLSchema">
10        <!-- Set the output to be XML with an XML declaration and use indentation -->
11        <xsl:output method="xml" omit-xml-declaration="no" indent="yes" standalone="yes"/>
12        <!-- -->
13        <!-- match schema and call recursive template to extract included schemas -->
14        <!-- -->
15        <xsl:template match="xs:schema">
16                <!-- call the schema definition template ... -->
17                <xsl:call-template name="gatherSchema">
18                        <!-- ... with current current root as the $schemas parameter ... -->
19                        <xsl:with-param name="schemas" select="/"/>
20                        <!-- ... and any includes in the $include parameter -->
21                        <xsl:with-param name="includes" 
22                                                select="document(/xs:schema/xs:*[self::xs:include or self::xs:import or self::xs:redefine]/@schemaLocation)"/>
23                </xsl:call-template>
24        </xsl:template>
25        <!-- -->
26        <!-- gather all included schemas into a single parameter variable -->
27        <!-- -->
28        <xsl:template name="gatherSchema">
29                <xsl:param name="schemas"/>
30                <xsl:param name="includes"/>
31                <xsl:choose>
32                        <xsl:when test="count($schemas) &lt; count($schemas | $includes)">
33                                <!-- when $includes includes something new, recurse ... -->
34                                <xsl:call-template name="gatherSchema">
35                                        <!-- ... with current $includes added to the $schemas parameter ... -->
36                                        <xsl:with-param name="schemas" select="$schemas | $includes"/>
37                                        <!-- ... and any *new* includes in the $include parameter -->
38                                        <xsl:with-param name="includes" 
39                                                                                select="document($includes/xs:schema/xs:*[self::xs:include or self::xs:import or self::xs:redefine]/@schemaLocation)"/>
40                                </xsl:call-template>
41                        </xsl:when>
42                        <xsl:otherwise>
43                                <!-- we have the complete set of included schemas,
44                                                                so now let's output the embedded schematron -->
45                                <xsl:call-template name="output">
46                                        <xsl:with-param name="schemas" select="$schemas"/>
47                                </xsl:call-template>
48                        </xsl:otherwise>
49                </xsl:choose>
50        </xsl:template>
51        <!-- -->
52        <!-- output the schematron information -->
53        <!-- -->
54        <xsl:template name="output">
55                <xsl:param name="schemas"/>
56                <!-- -->
57                <sch:schema queryBinding="xslt2">
58                        <!-- get header-type elements - eg title and especially ns -->
59                        <!-- title (just one) -->
60                        <xsl:copy-of select="$schemas//xs:appinfo/sch:title[1]"/>
61                        <!-- get remaining schematron schema children -->
62                        <!-- get non-blank namespace elements, dropping duplicates -->
63                        <xsl:for-each select="$schemas//xs:appinfo/sch:ns">
64                                <xsl:if test="generate-id(.) =
65                                                                generate-id($schemas//xs:appinfo/sch:ns[@prefix = current()/@prefix][1])">
66                                        <xsl:copy-of select="."/>
67                                </xsl:if>
68                        </xsl:for-each>
69                        <xsl:copy-of select="$schemas//xs:appinfo/sch:phase"/>
70                        <xsl:copy-of select="$schemas//xs:appinfo/sch:pattern"/>
71                        <sch:diagnostics>
72                                <xsl:copy-of select="$schemas//xs:appinfo/sch:diagnostics/*"/>
73                        </sch:diagnostics>
74                </sch:schema>
75        </xsl:template>
76        <!-- -->
77</xsl:transform>
Note: See TracBrowser for help on using the repository browser.