| XML schema |
http://www.eionet.europa.eu/schemas/ippc-wi/dir20081elvbat_schema.xsd
|
|---|---|
| Output type | SQL |
| Description | MySQL conversion |
| XSL file | dir20081elvbat_sql.xsl (Last modified: 08 Dec 2009 13:34 ) |
<?xml version="1.0" encoding="utf-8"?>
<!-- $Id: dir20081elvbat_sql.xsl 246 2009-08-03 16:35:36Z jeanyr $ -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8" />
<xsl:param name="xml_folder_uri" />
<xsl:variable name="directiveid">20081elvbat</xsl:variable>
<xsl:variable name="directiveidfull" select="concat('Quest', $directiveid, '-')" />
<xsl:variable name="labels" select="document(concat($xml_folder_uri,concat('dir', $directiveid, '_xsl_labels.xml')))/labels/itemset[@xml:lang='en']" />
<xsl:template match="text()" />
<!--
Create tables and top-level response row
-->
<xsl:template match="Questionnaire">
<html>
<body>
<pre>
-- Warning: MySQL oriented SQL
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Table structure for table `response`
--
CREATE TABLE IF NOT EXISTS `response` (
`response_id` int(11) NOT NULL auto_increment,
`directive_id` varchar(50) collate utf8_unicode_ci NOT NULL,
`member_state` text collate utf8_unicode_ci NOT NULL,
`response_lang` varchar(50) collate utf8_unicode_ci NOT NULL,
`date_imported` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`response_id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
CREATE TABLE IF NOT EXISTS `installation` (
`installation_id` int(11) NOT NULL auto_increment,
`response_id` int(11) NOT NULL,
`status` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`installation_id`),
INDEX (`response_id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
--
-- Table structure for table `answer`
--
CREATE TABLE IF NOT EXISTS `answer` (
`answer_id` int(11) NOT NULL auto_increment,
`installation_id` int(11) NOT NULL,
`question_id` varchar(255) collate utf8_unicode_ci NOT NULL,
`answer` longtext collate utf8_unicode_ci NOT NULL,
PRIMARY KEY `id` (`answer_id`),
INDEX (`installation_id`),
INDEX (`question_id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
--
-- Table structure for table `question`
--
CREATE TABLE IF NOT EXISTS `question` (
`question_id` varchar(255) collate utf8_unicode_ci NOT NULL,
`response_id` int(11) NOT NULL,
`question` longtext collate utf8_unicode_ci NOT NULL,
`question_lang` varchar(50) collate utf8_unicode_ci NOT NULL,
`date_imported` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY `question_id` (`question_id`,`question_lang`),
INDEX (`response_id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- Response row
INSERT INTO `response` (`directive_id` , `member_state`, `response_lang`) VALUES ('<xsl:value-of select="$directiveid" />', 'Enter Member State name here', '<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="@xml:lang" />
</xsl:call-template>');
SET @response_id = LAST_INSERT_ID();
<xsl:apply-templates />
</pre>
</body>
</html>
</xsl:template>
<!--
Add Installations rows - for each one, also insert answers
-->
<xsl:template match="installation-combustion-row">
<xsl:for-each select="*">
<!--
is there a better way to test for a change in parent than testing
for the first field in the dataset? current method is risky as field may not be sent?
-->
<xsl:if test="local-name() = 'Quest20081elvbat-q-test-checkbox-page1'">
INSERT INTO `installation` (`response_id`, `status`)
VALUES(@response_id,
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="../@status" />
</xsl:call-template>'
);
SET @installation_id = LAST_INSERT_ID();
</xsl:if>
<xsl:choose>
<xsl:when test="contains(local-name(), '-table')">
<xsl:call-template name="display_table" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="display_standard" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<!-- Called by the match all and deals with standard question types -->
<xsl:template name="display_standard">
--
-- Data for answer/question: <xsl:value-of select="local-name()" />
--
INSERT INTO `answer` (`installation_id` , `question_id` , `answer`)
VALUES (
@installation_id,
<xsl:variable name="questionid" select="substring-after(local-name(),$directiveidfull)" />
<!-- question id -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="local-name()" />
</xsl:call-template>',
<!-- question response -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="text()" />
</xsl:call-template>'
);
INSERT IGNORE INTO `question` (`question_id` , `response_id` , `question`, `question_lang`)
VALUES (
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="local-name()" />
</xsl:call-template>',
@response_id,
<xsl:choose>
<xsl:when test="$labels/item[@id=$questionid] != ''">
<!-- question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$labels/item[@id=$questionid]" />
</xsl:call-template>',
</xsl:when>
<xsl:otherwise>
<!-- use question id as question text when there is no question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="local-name()" />
</xsl:call-template>',
</xsl:otherwise>
</xsl:choose>
<!-- use question id as question text when there is no question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$labels/@xml:lang" />
</xsl:call-template>'
);
</xsl:template>
<!-- Called by the match all and deals with questions within tables/rows -->
<xsl:template name="display_table">
<xsl:variable name="tablename" select="substring-before(local-name(), '-table')" />
--
-- Table structure for table: answer_<xsl:value-of select="$tablename" />
--
CREATE TABLE IF NOT EXISTS `answer_<xsl:value-of select="$tablename" />` (
`answer_id` int(11) NOT NULL auto_increment,
`installation_id` int(11) NOT NULL,
`question_id` varchar(255) collate utf8_unicode_ci NOT NULL,
`row_id` varchar(255) collate utf8_unicode_ci NOT NULL,
`answer` longtext collate utf8_unicode_ci NOT NULL,
PRIMARY KEY `id` (`answer_id`),
INDEX (`installation_id`),
INDEX (`question_id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
--
-- Data for table answer/question: <xsl:value-of select="$tablename" />
--
<xsl:for-each select="*">
<xsl:variable name="rowid" select="concat(local-name(), position())" />
<xsl:for-each select="*">
INSERT INTO `answer_<xsl:value-of select="$tablename" />` (`installation_id` , `question_id` , `row_id` , `answer`)
VALUES (
@installation_id,
<xsl:variable name="questionidfull" select="concat($directiveidfull, local-name())" />
<!-- question id -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$questionidfull" />
</xsl:call-template>',
<!-- row id -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$rowid" />
</xsl:call-template>',
<!-- question response -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="text()" />
</xsl:call-template>'
);
INSERT IGNORE INTO `question` (`question_id` , `response_id` , `question`, `question_lang`)
VALUES (
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$questionidfull" />
</xsl:call-template>',
@response_id,
<xsl:variable name="questionid" select="local-name()" />
<xsl:choose>
<xsl:when test="$labels/item[@id=$questionid] != ''">
<!-- question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$labels/item[@id=$questionid]" />
</xsl:call-template>',
</xsl:when>
<xsl:otherwise>
<!-- use question id as question text when there is no question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="local-name()" />
</xsl:call-template>',
</xsl:otherwise>
</xsl:choose>
<!-- use question id as question text when there is no question text -->
'<xsl:call-template name="display_sql_field">
<xsl:with-param name="field" select="$labels/@xml:lang" />
</xsl:call-template>'
);
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<!-- Returns the question label or if no question label found it will return the question id -->
<xsl:template name="display_label_or_id">
<!-- Remove directive id -->
<xsl:variable name="questionid" select="local-name()" />
<!-- Get question label or id -->
<xsl:choose>
<xsl:when test="$labels/item[@id=$questionid] != ''">
<xsl:value-of select="$labels/item[@id=$questionid]" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="local-name()" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- FUNCTIONS -->
<!-- Handles quote escaping for SQL
Code adapted from: http://www.stylusstudio.com/xsllist/200103/post60790.html
To handle SQL single quote escaping
-->
<xsl:template name="display_sql_field">
<xsl:param name="field" />
<xsl:variable name="apostrophe">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains( $field, $apostrophe )">
<!-- Field contains a quote. We must enclose this field in quotes,
and we must escape each of the quotes in the field value.
-->
<xsl:call-template name="escape_quotes">
<xsl:with-param name="string" select="$field" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- No need to enclose this field in quotes. -->
<xsl:value-of select="$field" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="escape_quotes">
<xsl:param name="string" />
<xsl:variable name="apostrophe">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:value-of select="substring-before( $string, $apostrophe )" />
<xsl:text>\'</xsl:text>
<xsl:variable name="substring_after_first_quote" select="substring-after( $string, $apostrophe )" />
<xsl:choose>
<xsl:when test="not( contains( $substring_after_first_quote, $apostrophe ) )">
<xsl:value-of select="$substring_after_first_quote" />
</xsl:when>
<xsl:otherwise>
<!-- The substring after the first quote contains a quote.
So, we call ourself recursively to escape the quotes
in the substring after the first quote.
-->
<xsl:call-template name="escape_quotes">
<xsl:with-param name="string" select="$substring_after_first_quote" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
European Environment Agency
Kgs. Nytorv 6, DK-1050 Copenhagen K, Denmark