Обновление файлов: удаление ненужных строк и добавление проверки длины полей в XSLT, создание файла .python-version

This commit is contained in:
Dmitry
2026-03-18 22:35:19 +03:00
parent 9ccf498933
commit 74b1f387e5
4 changed files with 231 additions and 221 deletions
+1
View File
@@ -0,0 +1 @@
3.12
+8 -1
View File
@@ -13,7 +13,6 @@
</head> </head>
<body> <body>
<h1>Анализ данных файла specialities.xml (specialities.xml)</h1> <h1>Анализ данных файла specialities.xml (specialities.xml)</h1>
<h2>Выполнено студентами С22-712: Антипенко Д.А, Гаранян А.Э, Епифанов В.С, Ускова Е.А.</h2>
<div class="block"> <div class="block">
<div class="field-title">Анализ поля id</div> <div class="field-title">Анализ поля id</div>
<div>Тип данных: integer</div> <div>Тип данных: integer</div>
@@ -106,13 +105,21 @@ CREATE SEQUENCE specialities_id_seq
CREATE TABLE specialities ( CREATE TABLE specialities (
id INTEGER NOT NULL, id INTEGER NOT NULL,
name VARCHAR(102) NOT NULL, name VARCHAR(102) NOT NULL,
code VARCHAR(8) NOT NULL, code VARCHAR(8) NOT NULL,
level VARCHAR(12) NOT NULL CHECK (level IN ('Специалитет', 'Магистратура', 'Бакалавриат', 'Аспирантура')), level VARCHAR(12) NOT NULL CHECK (level IN ('Специалитет', 'Магистратура', 'Бакалавриат', 'Аспирантура')),
level_id INTEGER NOT NULL CHECK (level_id IN (1, 2, 0, 3)), level_id INTEGER NOT NULL CHECK (level_id IN (1, 2, 0, 3)),
generation VARCHAR(6) NOT NULL CHECK (generation IN ('ФГОС3+', 'ГОС2')), generation VARCHAR(6) NOT NULL CHECK (generation IN ('ФГОС3+', 'ГОС2')),
generation_id INTEGER NOT NULL CHECK (generation_id IN (1, 0)), generation_id INTEGER NOT NULL CHECK (generation_id IN (1, 0)),
type VARCHAR(13) NOT NULL CHECK (type IN ('специальность', 'направление')), type VARCHAR(13) NOT NULL CHECK (type IN ('специальность', 'направление')),
type_id INTEGER NOT NULL CHECK (type_id IN (1, 0)), type_id INTEGER NOT NULL CHECK (type_id IN (1, 0)),
CONSTRAINT pk_specialities PRIMARY KEY (id) CONSTRAINT pk_specialities PRIMARY KEY (id)
);</div> );</div>
+221 -219
View File
@@ -2,7 +2,6 @@
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/> <xsl:output method="html" encoding="UTF-8" indent="yes"/>
<!-- Ключи для поиска уникальных значений -->
<xsl:key name="k-level" match="object/level" use="."/> <xsl:key name="k-level" match="object/level" use="."/>
<xsl:key name="k-level-id" match="object/level-id" use="."/> <xsl:key name="k-level-id" match="object/level-id" use="."/>
<xsl:key name="k-generation" match="object/generation" use="."/> <xsl:key name="k-generation" match="object/generation" use="."/>
@@ -10,26 +9,7 @@
<xsl:key name="k-type" match="object/type" use="."/> <xsl:key name="k-type" match="object/type" use="."/>
<xsl:key name="k-type-id" match="object/type-id" use="."/> <xsl:key name="k-type-id" match="object/type-id" use="."/>
<!-- Экранирование одинарных кавычек для SQL --> <xsl:template name="show-not-null">
<xsl:template name="escape-sql">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text, &quot;'&quot;)">
<xsl:value-of select="substring-before($text, &quot;'&quot;)"/>
<xsl:text>''</xsl:text>
<xsl:call-template name="escape-sql">
<xsl:with-param name="text" select="substring-after($text, &quot;'&quot;)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Вывод NOT NULL только если пустых значений нет -->
<xsl:template name="show-not-null-text">
<xsl:param name="empty-count"/> <xsl:param name="empty-count"/>
<xsl:if test="$empty-count = 0"> <xsl:if test="$empty-count = 0">
<div>Нужен: NOT NULL</div> <div>Нужен: NOT NULL</div>
@@ -43,6 +23,200 @@
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="sql-check-text">
<xsl:param name="field-name"/>
<xsl:param name="items"/>
<xsl:param name="count"/>
<xsl:if test="$count &gt;= 2 and $count &lt;= 5">
<xsl:text> CHECK (</xsl:text>
<xsl:value-of select="$field-name"/>
<xsl:text> IN (</xsl:text>
<xsl:for-each select="$items">
<xsl:text>'</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>))</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="sql-check-int">
<xsl:param name="field-name"/>
<xsl:param name="items"/>
<xsl:param name="count"/>
<xsl:if test="$count &gt;= 2 and $count &lt;= 5">
<xsl:text> CHECK (</xsl:text>
<xsl:value-of select="$field-name"/>
<xsl:text> IN (</xsl:text>
<xsl:for-each select="$items">
<xsl:value-of select="normalize-space(.)"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>))</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="field-id">
<xsl:variable name="empty-count" select="count(objects/object/id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-name">
<xsl:variable name="empty-count" select="count(objects/object/name[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля name</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/name">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-code">
<xsl:variable name="empty-count" select="count(objects/object/code[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля code</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/code">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-level">
<xsl:variable name="empty-count" select="count(objects/object/level[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля level</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/level">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (level IN(
<xsl:for-each select="objects/object/level[generate-id() = generate-id(key('k-level', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-level-id">
<xsl:variable name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля level-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (level_id IN(
<xsl:for-each select="objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-generation">
<xsl:variable name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля generation</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/generation">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (generation IN(
<xsl:for-each select="objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-generation-id">
<xsl:variable name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля generation-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (generation_id IN(
<xsl:for-each select="objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-type">
<xsl:variable name="empty-count" select="count(objects/object/type[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля type</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/type">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1"><xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/></xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (type IN(
<xsl:for-each select="objects/object/type[generate-id() = generate-id(key('k-type', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-type-id">
<xsl:variable name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля type-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null"><xsl:with-param name="empty-count" select="$empty-count"/></xsl:call-template>
<div>Нужен: CHECK (type_id IN(
<xsl:for-each select="objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template match="/"> <xsl:template match="/">
<html> <html>
<head> <head>
@@ -59,7 +233,6 @@
</head> </head>
<body> <body>
<h1>Анализ данных файла specialities.xml (specialities.xml)</h1> <h1>Анализ данных файла specialities.xml (specialities.xml)</h1>
<h2>Выполнено студентами С22-712: Антипенко Д.А, Гаранян А.Э, Епифанов В.С, Ускова Е.А.</h2>
<xsl:call-template name="field-id"/> <xsl:call-template name="field-id"/>
<xsl:call-template name="field-name"/> <xsl:call-template name="field-name"/>
@@ -81,14 +254,27 @@ CREATE SEQUENCE specialities_id_seq
CREATE TABLE specialities ( CREATE TABLE specialities (
id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/id[not(normalize-space())])"/></xsl:call-template><xsl:text>, id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/id[not(normalize-space())])"/></xsl:call-template><xsl:text>,
name VARCHAR(102)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/name[not(normalize-space())])"/></xsl:call-template><xsl:text>,
code VARCHAR(8)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/code[not(normalize-space())])"/></xsl:call-template><xsl:text>, name VARCHAR(</xsl:text><xsl:for-each select="objects/object/name"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
level VARCHAR(12)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (level IN ('Специалитет', 'Магистратура', 'Бакалавриат', 'Аспирантура')), <xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/name[not(normalize-space())])"/></xsl:call-template><xsl:text>,
level_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (level_id IN (1, 2, 0, 3)),
generation VARCHAR(6)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (generation IN ('ФГОС3+', 'ГОС2')), code VARCHAR(</xsl:text><xsl:for-each select="objects/object/code"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
generation_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (generation_id IN (1, 0)), <xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/code[not(normalize-space())])"/></xsl:call-template><xsl:text>,
type VARCHAR(13)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (type IN ('специальность', 'направление')),
type_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/></xsl:call-template><xsl:text> CHECK (type_id IN (1, 0)), level VARCHAR(</xsl:text><xsl:for-each select="objects/object/level"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'level'"/><xsl:with-param name="items" select="objects/object/level[generate-id() = generate-id(key('k-level', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/level[generate-id() = generate-id(key('k-level', .)[1])])"/></xsl:call-template><xsl:text>,
level_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'level_id'"/><xsl:with-param name="items" select="objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])])"/></xsl:call-template><xsl:text>,
generation VARCHAR(</xsl:text><xsl:for-each select="objects/object/generation"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'generation'"/><xsl:with-param name="items" select="objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])])"/></xsl:call-template><xsl:text>,
generation_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'generation_id'"/><xsl:with-param name="items" select="objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])])"/></xsl:call-template><xsl:text>,
type VARCHAR(</xsl:text><xsl:for-each select="objects/object/type"><xsl:sort select="string-length(.)" data-type="number" order="descending"/><xsl:if test="position() = 1"><xsl:value-of select="string-length(.)"/></xsl:if></xsl:for-each>
<xsl:text>)</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-text"><xsl:with-param name="field-name" select="'type'"/><xsl:with-param name="items" select="objects/object/type[generate-id() = generate-id(key('k-type', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/type[generate-id() = generate-id(key('k-type', .)[1])])"/></xsl:call-template><xsl:text>,
type_id INTEGER</xsl:text><xsl:call-template name="sql-not-null"><xsl:with-param name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/></xsl:call-template><xsl:call-template name="sql-check-int"><xsl:with-param name="field-name" select="'type_id'"/><xsl:with-param name="items" select="objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])]"/><xsl:with-param name="count" select="count(objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])])"/></xsl:call-template><xsl:text>,
CONSTRAINT pk_specialities PRIMARY KEY (id) CONSTRAINT pk_specialities PRIMARY KEY (id)
);</xsl:text></div> );</xsl:text></div>
@@ -97,201 +283,17 @@ CREATE TABLE specialities (
<div class="sql"><xsl:text>INSERT INTO specialities (id, name, code, level, level_id, generation, generation_id, type, type_id) <div class="sql"><xsl:text>INSERT INTO specialities (id, name, code, level, level_id, generation, generation_id, type, type_id)
VALUES ( VALUES (
nextval('specialities_id_seq'), nextval('specialities_id_seq'),
'</xsl:text><xsl:call-template name="escape-sql"><xsl:with-param name="text" select="name"/></xsl:call-template><xsl:text>', '</xsl:text><xsl:value-of select="name"/><xsl:text>',
'</xsl:text><xsl:call-template name="escape-sql"><xsl:with-param name="text" select="code"/></xsl:call-template><xsl:text>', '</xsl:text><xsl:value-of select="code"/><xsl:text>',
'</xsl:text><xsl:call-template name="escape-sql"><xsl:with-param name="text" select="level"/></xsl:call-template><xsl:text>', '</xsl:text><xsl:value-of select="level"/><xsl:text>',
</xsl:text><xsl:value-of select="level-id"/><xsl:text>, </xsl:text><xsl:value-of select="level-id"/><xsl:text>,
'</xsl:text><xsl:call-template name="escape-sql"><xsl:with-param name="text" select="generation"/></xsl:call-template><xsl:text>', '</xsl:text><xsl:value-of select="generation"/><xsl:text>',
</xsl:text><xsl:value-of select="generation-id"/><xsl:text>, </xsl:text><xsl:value-of select="generation-id"/><xsl:text>,
'</xsl:text><xsl:call-template name="escape-sql"><xsl:with-param name="text" select="type"/></xsl:call-template><xsl:text>', '</xsl:text><xsl:value-of select="type"/><xsl:text>',
</xsl:text><xsl:value-of select="type-id"/><xsl:text> </xsl:text><xsl:value-of select="type-id"/><xsl:text>
);</xsl:text></div> );</xsl:text></div>
</xsl:for-each> </xsl:for-each>
</body> </body>
</html> </html>
</xsl:template> </xsl:template>
<xsl:template name="field-id">
<xsl:variable name="empty-count" select="count(objects/object/id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-name">
<xsl:variable name="empty-count" select="count(objects/object/name[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля name</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/name">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-code">
<xsl:variable name="empty-count" select="count(objects/object/code[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля code</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/code">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template name="field-level">
<xsl:variable name="empty-count" select="count(objects/object/level[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля level</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/level">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (level IN(
<xsl:for-each select="objects/object/level[generate-id() = generate-id(key('k-level', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-level-id">
<xsl:variable name="empty-count" select="count(objects/object/level-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля level-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (level_id IN(
<xsl:for-each select="objects/object/level-id[generate-id() = generate-id(key('k-level-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-generation">
<xsl:variable name="empty-count" select="count(objects/object/generation[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля generation</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/generation">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (generation IN(
<xsl:for-each select="objects/object/generation[generate-id() = generate-id(key('k-generation', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-generation-id">
<xsl:variable name="empty-count" select="count(objects/object/generation-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля generation-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (generation_id IN(
<xsl:for-each select="objects/object/generation-id[generate-id() = generate-id(key('k-generation-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-type">
<xsl:variable name="empty-count" select="count(objects/object/type[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля type</div>
<div>Тип данных: Текст</div>
<div>Самый длинный элемент:
<xsl:for-each select="objects/object/type">
<xsl:sort select="string-length(.)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/><xsl:text> , длина: </xsl:text><xsl:value-of select="string-length(.)"/>
</xsl:if>
</xsl:for-each>
</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (type IN(
<xsl:for-each select="objects/object/type[generate-id() = generate-id(key('k-type', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
<xsl:template name="field-type-id">
<xsl:variable name="empty-count" select="count(objects/object/type-id[not(normalize-space())])"/>
<div class="block">
<div class="field-title">Анализ поля type-id</div>
<div>Тип данных: integer</div>
<div>Число пустых: <xsl:value-of select="$empty-count"/></div>
<xsl:call-template name="show-not-null-text">
<xsl:with-param name="empty-count" select="$empty-count"/>
</xsl:call-template>
<div>Нужен: CHECK (type_id IN(
<xsl:for-each select="objects/object/type-id[generate-id() = generate-id(key('k-type-id', .)[1])]">
<xsl:text> '</xsl:text><xsl:value-of select="."/><xsl:text>' </xsl:text>
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
))</div>
</div>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>