<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
				xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
				xmlns:msxsl="urn:schemas-microsoft-com:xslt"
				xmlns:user="http://mycompany.com/mynamespace"
				xmlns:js="urn:the-xml-files:xslt-csharp"
				xmlns:ntd='http://www.ntd.ru/ntd/'
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output method="text" />

  <xsl:template match="text()"/>

  <!-- Cascade delete settings -->
  <xsl:template match="CascadeDeleteSettings">
    <xsl:for-each select="CascadeDeleteSetting">
      delete [VCLib].[T_CASCADE_DELETE_SETTING] where [Entities] = (select e.[EntityID] from [VCLib].[T_ENTITIES] e where e.[Schema] + '.' + e.[EntName] = '<xsl:value-of select="@Entity" />')
      GO
      INSERT INTO [VCLib].[T_CASCADE_DELETE_SETTING]
      ([Entities]
      ,[ValidationLexem]
      <xsl:choose>
        <xsl:when test="Dependencies">,[Dependencies]</xsl:when>
      </xsl:choose>
      <xsl:text>)</xsl:text>
      SELECT
      (select e.[EntityID] from [VCLib].[T_ENTITIES] e where e.[Schema] + '.' + e.[EntName] = '<xsl:value-of select="@Entity" />')
      <xsl:text>,'</xsl:text>
      <xsl:call-template name="serializeNodeToString">
        <xsl:with-param name="node"
								select="ValidationLexem/*"/>
      </xsl:call-template>'
      <xsl:choose>
        <xsl:when test="Dependencies">
          ,'<xsl:value-of select="Dependencies" />'
        </xsl:when>
      </xsl:choose>
      GO
    </xsl:for-each>
  </xsl:template>

  <!-- Load entity xml -->
  <xsl:template match="Entity">
    <xsl:variable name="xmlString">
      <xsl:text>&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&gt;</xsl:text>
      <xsl:call-template name="serializeNodeToString">
        <xsl:with-param name="node"
								select="."/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="xmlForScript">
      <xsl:call-template name="replaceApostrs">
        <xsl:with-param name="text"
								select="$xmlString"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:text>IF NOT EXISTS(SELECT * FROM VCLib.T_ENTITIES WHERE [Schema]='</xsl:text>
    <xsl:value-of select="@Schema" />
    <xsl:text>' and EntName='</xsl:text>
    <xsl:value-of select="@Name" />
    <xsl:text>')&#10;BEGIN&#10;&#09;INSERT INTO VCLib.T_ENTITIES (EntityID, EntName, XML, ServerName, NeedHistory, IsAdditional, [Schema])&#10;&#09;VALUES ((ISNULL((select MIN(e.EntityID) from VCLib.T_ENTITIES e where not exists (select * from VCLib.T_ENTITIES e1 where e1.EntityID = e.EntityID + 1)), 0) + 1),'</xsl:text>
    <xsl:value-of select="@Name" />
    <xsl:text>',NULL,'Primary SQL Server', 0, </xsl:text>
    <xsl:choose>
      <xsl:when test="@Settings='1'">1, '</xsl:when>
      <xsl:otherwise>0, '</xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="@Schema" />
    <xsl:text>')&#10;&#09;UPDATE dbo.T_ENTITY_IDS SET id = ISNULL((select MAX(e.EntityID) from VCLib.T_ENTITIES e), 0) + 1 WHERE EntName = 'VCLib.ENTITIES' AND FieldName = 'PrimaryKey'&#10;END&#10;GO&#10;&#10;UPDATE VCLib.T_ENTITIES&#10;SET XML='</xsl:text>
    <xsl:value-of select="$xmlForScript"/>
    <xsl:text>',&#10;EntDesc = '</xsl:text>
    <xsl:value-of select="@Description" />
    <xsl:text>',&#10;PrimaryKeyName = </xsl:text>
    <xsl:choose>
      <xsl:when test="@PrimaryKey">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="@PrimaryKey"/>
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;[Version] = </xsl:text>
    <xsl:choose>
      <xsl:when test="@version">
        <xsl:value-of select="@version" />
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;BaseEntityName = </xsl:text>
    <xsl:choose>
      <xsl:when test="@Inherits">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="@Inherits" />
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;BaseEntity = </xsl:text>
    <xsl:choose>
      <xsl:when test="@Inherits">
        <xsl:text>(select top 1 EntityID from VCLib.T_ENTITIES where [Schema]='</xsl:text>
        <xsl:value-of select="substring-before(@Inherits, '.')" />
        <xsl:text>' and EntName = '</xsl:text>
        <xsl:value-of select="substring-after(@Inherits, '.')" />
        <xsl:text>')</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;DisplayName = </xsl:text>
    <xsl:choose>
      <xsl:when test="@DisplayName">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="@DisplayName"/>
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;DNAttributes = </xsl:text>
    <xsl:choose>
      <xsl:when test="@DNAttributes">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="@DNAttributes"/>
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;IsTree = </xsl:text>
    <xsl:choose>
      <xsl:when test="@IsTree">
        <xsl:value-of select="@IsTree"/>
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;UnrestrictedAccess = </xsl:text>
    <xsl:choose>
      <xsl:when test="@UnrestrictedAccess">
        <xsl:value-of select="@UnrestrictedAccess"/>
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;Timestamped = </xsl:text>
    <xsl:choose>
      <xsl:when test="@Timestamped">
        <xsl:value-of select="@Timestamped"/>
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;Customs = </xsl:text>
    <xsl:choose>
      <xsl:when test="./Customs/Custom">
        <xsl:text>'&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Customs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;</xsl:text>
        <xsl:for-each select="./Customs/Custom">
          <xsl:call-template name="serializeNodeToString">
            <xsl:with-param name="node"
										select="."/>
          </xsl:call-template>
        </xsl:for-each>
        <xsl:text>&lt;/Customs&gt;'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;Sortings = </xsl:text>
    <xsl:choose>
      <xsl:when test="./Sortings/Sorting">
        <xsl:text>'&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Sortings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;</xsl:text>
        <xsl:for-each select="./Sortings/Sorting">
          <xsl:call-template name="serializeNodeToString">
            <xsl:with-param name="node"
										select="."/>
          </xsl:call-template>
        </xsl:for-each>
        <xsl:text>&lt;/Sortings&gt;'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>,&#10;CanGroupInTreeListBy = </xsl:text>
    <xsl:choose>
      <xsl:when test="./CanGroupInTreeListBy/@Value">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="./CanGroupInTreeListBy/@Value"/>
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    <xsl:text>&#10;WHERE [Schema]='</xsl:text>
    <xsl:value-of select="@Schema" />
    <xsl:text>' and EntName='</xsl:text>
    <xsl:value-of select="@Name" />
    <xsl:choose>
      <xsl:when test="@Settings='1'">
        <xsl:text>' and IsAdditional=1</xsl:text>
      </xsl:when>
      <xsl:otherwise>'</xsl:otherwise>
    </xsl:choose>
    <xsl:text>&#10;GO&#10;&#10;DECLARE @EntId int&#10;SET @EntId = (SELECT TOP 1 EntityId FROM VCLib.T_ENTITIES WHERE [Schema]='</xsl:text>
    <xsl:value-of select="@Schema" />
    <xsl:text>' and EntName='</xsl:text>
    <xsl:value-of select="@Name" />
    <xsl:text>')&#10;&#10;UPDATE VCLib.T_ENTITIES SET BaseEntity = @EntId WHERE BaseEntityName = '</xsl:text>
    <xsl:value-of select="@Schema" />
    <xsl:text>.</xsl:text>
    <xsl:value-of select="@Name" />
    <xsl:text>'&#10;</xsl:text>
    <xsl:choose>
      <xsl:when test="@Settings='1'" />
      <xsl:otherwise>
        <xsl:text>&#10;DELETE FROM VCLib.T_ENTITIES_ATTRIBUTES WHERE IsAdditional = 0 AND EntityId = @EntId AND Name NOT IN ('</xsl:text>
        <xsl:for-each select="Fields/*|CalculatingAttributes/*">
          <xsl:value-of select="@Name"/>
          <xsl:if test="position() != last()">
            <xsl:text>', '</xsl:text>
          </xsl:if>
        </xsl:for-each>
        <xsl:text>')&#10;</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:for-each select="Fields/*|CalculatingAttributes/*">
      <xsl:variable name="field"
						  select="."/>
      <xsl:variable name="map"
						  select="../../DbMapping/node()[not(self::Filter)]/Map[@Name=$field/@Name]" />
      <xsl:variable name="Index">
        <xsl:choose>
          <xsl:when test="@Index">
            <xsl:value-of select="@Index" />
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="AttributeType">
        <xsl:choose>
          <xsl:when test="name(.)='Attribute'">0</xsl:when>
          <xsl:when test="name(.)='Parent'">1</xsl:when>
          <xsl:when test="name(.)='Child'">2</xsl:when>
          <xsl:when test="name(.)='Link'">3</xsl:when>
          <xsl:when test="name(.)='Choice'">4</xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="Description">
        <xsl:call-template name="replaceApostrs">
          <xsl:with-param name="text">
            <xsl:value-of select="@Description" />
          </xsl:with-param>
        </xsl:call-template>
      </xsl:variable>
      <xsl:variable name="MaxLength">
        <xsl:choose>
          <xsl:when test="@CharacterMaximumLength">
            <xsl:value-of select="@CharacterMaximumLength" />
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="Precision">
        <xsl:choose>
          <xsl:when test="@NumericPrecision">
            <xsl:value-of select="@NumericPrecision" />
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="Scale">
        <xsl:choose>
          <xsl:when test="@NumericScale">
            <xsl:value-of select="@NumericScale" />
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="DefaultFormat">
        <xsl:choose>
          <xsl:when test="@DefaultFormat">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@DefaultFormat" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsCalculated">
        <xsl:choose>
          <xsl:when test="name(..)='CalculatingAttributes'">1</xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsFlag">
        <xsl:choose>
          <xsl:when test="@IsFlag">
            <xsl:value-of select="@IsFlag" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsRequired">
        <xsl:choose>
          <xsl:when test="@Required">
            <xsl:value-of select="@Required" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="Save">
        <xsl:choose>
          <xsl:when test="@Save">
            <xsl:value-of select="@Save" />
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="ContentType">
        <xsl:choose>
          <xsl:when test="@ContentType">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@ContentType" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="CharacterSet">
        <xsl:choose>
          <xsl:when test="@CharacterSet">
            <xsl:choose>
              <xsl:when test="name(.)='ANSI'">0</xsl:when>
              <xsl:when test="name(.)='Unicode'">1</xsl:when>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="LinkAttributeName">
        <xsl:choose>
          <xsl:when test="@LinkAttribute">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@LinkAttribute" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:when test="@ChildAttribute">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@ChildAttribute" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="PathsAttributes">
        <xsl:choose>
          <xsl:when test="@PathAttributes">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@PathAttributes" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:when test="../../DbMapping/Lexem/Map[@Name=$field/@Name]/@PathAttributes">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="../../DbMapping/Lexem/Map[@Name=$field/@Name]/@PathAttributes" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="Filter">
        <xsl:choose>
          <xsl:when test="../../DbMapping/Filter/Map[@Name=$field/@Name]/text()">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="../../DbMapping/Filter/Map[@Name=$field/@Name]/text()" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:when test="../../DbMapping/Filter/Map[@Name=$field/@Name]/*">
            <xsl:text>'</xsl:text>
            <xsl:for-each select="../../DbMapping/Filter/Map[@Name=$field/@Name]/*">
              <xsl:call-template name="serializeNodeToString">
                <xsl:with-param name="node"
												select="."/>
              </xsl:call-template>
            </xsl:for-each>
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsCashed">
        <xsl:choose>
          <xsl:when test="@Cashed">
            <xsl:value-of select="@Cashed" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="RequiredAttributes">
        <xsl:choose>
          <xsl:when test="@RequiredAttributes">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@RequiredAttributes" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="SortingAttribute">
        <xsl:choose>
          <xsl:when test="@SortingAttr">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@SortingAttr" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="EnumType">
        <xsl:choose>
          <xsl:when test="@EnumType">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="@EnumType" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsIdentity">
        <xsl:choose>
          <xsl:when test="@IdentityPrimaryKey">
            <xsl:value-of select="@IdentityPrimaryKey" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsCustom">
        <xsl:choose>
          <xsl:when test="@IsCustom">
            <xsl:value-of select="@IsCustom" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="RemoveAction">
        <xsl:choose>
          <xsl:when test="@RemoveAction">
            <xsl:value-of select="@RemoveAction" />
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsPrimaryKey">
        <xsl:choose>
          <xsl:when test="@Name = ../../@PrimaryKey">1</xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="ChoiceAttributeData">
        <xsl:choose>
          <xsl:when test="./Item">
            <xsl:text>'&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;ChoiceItems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;</xsl:text>
            <xsl:for-each select="./Item">
              <xsl:call-template name ="replace">
                <xsl:with-param name="text">
                  <xsl:call-template name ="replace">
                    <xsl:with-param name="text">
                      <xsl:call-template name="serializeNodeToString">
                        <xsl:with-param name="node"
																select="."/>
                      </xsl:call-template>
                    </xsl:with-param>
                    <xsl:with-param name="replace">Item Name</xsl:with-param>
                    <xsl:with-param name="by">ChoiceItem Name</xsl:with-param>
                  </xsl:call-template>
                </xsl:with-param>
                <xsl:with-param name="replace">/Item</xsl:with-param>
                <xsl:with-param name="by">/ChoiceItem</xsl:with-param>
              </xsl:call-template>
            </xsl:for-each>
            <xsl:text>&lt;/ChoiceItems&gt;'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="ParametersData">
        <xsl:choose>
          <xsl:when test="./Parameter">
            <xsl:text>'&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;</xsl:text>
            <xsl:for-each select="./Parameter">
              <xsl:call-template name="serializeNodeToString">
                <xsl:with-param name="node"
												select="."/>
              </xsl:call-template>
            </xsl:for-each>
            <xsl:text>&lt;/Parameters&gt;'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="CustomsData">
        <xsl:choose>
          <xsl:when test="./Custom">
            <xsl:text>'&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Customs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;</xsl:text>
            <xsl:for-each select="./Custom">
              <xsl:call-template name="serializeNodeToString">
                <xsl:with-param name="node"
												select="."/>
              </xsl:call-template>
            </xsl:for-each>
            <xsl:text>&lt;/Customs&gt;'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="MappingType">
        <xsl:choose>
          <xsl:when test="name($map/..)='Spread'">5</xsl:when>
          <xsl:when test="$map/@Column and name($map/..)='Table'">1</xsl:when>
          <xsl:when test="$map/@Column and name($map/..)='View'">6</xsl:when>
          <xsl:when test="$map/@Function">2</xsl:when>
          <xsl:when test="$map/*">4</xsl:when>
          <xsl:when test="$map/text()">4</xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="MappingName">
        <xsl:choose>
          <xsl:when test="$map/@Function">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/@Function" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:when test="$map/@Column">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/@Column" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsStored">
        <xsl:choose>
          <xsl:when test="$map/@IsStored">
            <xsl:value-of select="$map/@IsStored" />
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="MappingTable">
        <xsl:choose>
          <xsl:when test="$map/../@name">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/../@name" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="MappingRefTable">
        <xsl:choose>
          <xsl:when test="$map/@RefTable">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/@RefTable" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="RefTableSearchMode">
        <xsl:choose>
          <xsl:when test="$map/@SearchMode">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/@SearchMode" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="RefTableHashFunc">
        <xsl:choose>
          <xsl:when test="$map/@HashFunc">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/@HashFunc" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="AttrLexem">
        <xsl:choose>
          <xsl:when test="$map/text()">
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$map/text()" />
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:when test="$map/*">
            <xsl:text>'</xsl:text>
            <xsl:for-each select="$map/*">
              <xsl:call-template name="serializeNodeToString">
                <xsl:with-param name="node"
												select="."/>
              </xsl:call-template>
            </xsl:for-each>
            <xsl:text>'</xsl:text>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="IsAdditional">
        <xsl:choose>
          <xsl:when test="../../@Settings='1'">1</xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:text>&#10;UPDATE VCLib.T_ENTITIES_ATTRIBUTES SET [Index] = </xsl:text>
      <xsl:value-of select="$Index" />
      <xsl:text>, [AttributeType] = </xsl:text>
      <xsl:value-of select="$AttributeType" />
      <xsl:text>, [Name] = '</xsl:text>
      <xsl:value-of select="@Name" />
      <xsl:text>', [Description] = '</xsl:text>
      <xsl:value-of select="$Description" />
      <xsl:text>', [SystemType] = '</xsl:text>
      <xsl:value-of select="@Type" />
      <xsl:text>', [MaxLength] = </xsl:text>
      <xsl:value-of select="$MaxLength" />
      <xsl:text>, [Precision] = </xsl:text>
      <xsl:value-of select="$Precision" />
      <xsl:text>, [Scale] = </xsl:text>
      <xsl:value-of select="$Scale" />
      <xsl:text>, [DefaultFormat] = </xsl:text>
      <xsl:value-of select="$DefaultFormat" />
      <xsl:text>, [IsCalculated] = </xsl:text>
      <xsl:value-of select="$IsCalculated" />
      <xsl:text>, [IsFlag] = </xsl:text>
      <xsl:value-of select="$IsFlag" />
      <xsl:text>, [IsRequired] = </xsl:text>
      <xsl:value-of select="$IsRequired" />
      <xsl:text>, [Save] = </xsl:text>
      <xsl:value-of select="$Save" />
      <xsl:text>, [LinkAttributeName] = </xsl:text>
      <xsl:value-of select="$LinkAttributeName" />
      <xsl:text>, [PathsAttributes] = </xsl:text>
      <xsl:value-of select="$PathsAttributes" />
      <xsl:text>, [Filter] = </xsl:text>
      <xsl:value-of select="$Filter" />
      <xsl:text>, [IsCashed] = </xsl:text>
      <xsl:value-of select="$IsCashed" />
      <xsl:text>, [RequiredAttributes] = </xsl:text>
      <xsl:value-of select="$RequiredAttributes" />
      <xsl:text>, [SortingAttribute] = </xsl:text>
      <xsl:value-of select="$SortingAttribute" />
      <xsl:text>, [EnumType] = </xsl:text>
      <xsl:value-of select="$EnumType" />
      <xsl:text>, [IsIdentity] = </xsl:text>
      <xsl:value-of select="$IsIdentity" />
      <xsl:text>, [IsCustom] = </xsl:text>
      <xsl:value-of select="$IsCustom" />
      <xsl:text>, [RemoveAction] = </xsl:text>
      <xsl:value-of select="$RemoveAction" />
      <xsl:text>, [IsPrimaryKey] = </xsl:text>
      <xsl:value-of select="$IsPrimaryKey" />
      <xsl:text>, [ChoiceAttributeData] = </xsl:text>
      <xsl:value-of select="$ChoiceAttributeData" />
      <xsl:text>, [ParametersData] = </xsl:text>
      <xsl:value-of select="$ParametersData" />
      <xsl:text>, [CustomsData] = </xsl:text>
      <xsl:value-of select="$CustomsData" />
      <xsl:text>, [MappingType] = </xsl:text>
      <xsl:value-of select="$MappingType" />
      <xsl:text>, [MappingName] = </xsl:text>
      <xsl:value-of select="$MappingName" />
      <xsl:text>, [IsStored] = </xsl:text>
      <xsl:value-of select="$IsStored" />
      <xsl:text>, [MappingTable] = </xsl:text>
      <xsl:value-of select="$MappingTable" />
      <xsl:text>, [MappingRefTable] = </xsl:text>
      <xsl:value-of select="$MappingRefTable" />
      <xsl:text>, [RefTableSearchMode] = </xsl:text>
      <xsl:value-of select="$RefTableSearchMode" />
      <xsl:text>, [RefTableHashFunc] = </xsl:text>
      <xsl:value-of select="$RefTableHashFunc" />
      <xsl:text>, [AttrLexem] = </xsl:text>
      <xsl:value-of select="$AttrLexem" />
      <xsl:text>, [ContentType] = </xsl:text>
      <xsl:value-of select="$ContentType" />
      <xsl:text>, [CharacterSet] = </xsl:text>
      <xsl:value-of select="$CharacterSet" />
      <xsl:text>&#10;WHERE EntityID = @EntId AND Name = '</xsl:text>
      <xsl:value-of select="@Name" />
      <xsl:text>' AND IsAdditional = </xsl:text>
      <xsl:value-of select="$IsAdditional" />
      <xsl:text>&#10;INSERT INTO VCLib.T_ENTITIES_ATTRIBUTES ([EntitiesAttributesId], [EntityID], [Index], [AttributeType], [Name], [Description], [SystemType], [MaxLength], [Precision], [Scale], [DefaultFormat], [IsCalculated], [IsFlag], [IsRequired], [Save], [LinkAttributeName], [PathsAttributes], [Filter], [IsCashed], [RequiredAttributes], [SortingAttribute], [EnumType], [IsIdentity], [IsCustom], [RemoveAction], [IsPrimaryKey], [ChoiceAttributeData], [ParametersData], [CustomsData], [MappingType], [MappingName], [IsStored], [MappingTable], [MappingRefTable], [RefTableSearchMode], [RefTableHashFunc], [AttrLexem], [IsAdditional], [ContentType], [CharacterSet])&#10;</xsl:text>
      <xsl:text>SELECT newid(), @EntId, </xsl:text>
      <xsl:value-of select="$Index" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$AttributeType" />
      <xsl:text>, '</xsl:text>
      <xsl:value-of select="@Name" />
      <xsl:text>', '</xsl:text>
      <xsl:value-of select="$Description" />
      <xsl:text>', '</xsl:text>
      <xsl:value-of select="@Type" />
      <xsl:text>', </xsl:text>
      <xsl:value-of select="$MaxLength" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$Precision" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$Scale" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$DefaultFormat" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsCalculated" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsFlag" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsRequired" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$Save" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$LinkAttributeName" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$PathsAttributes" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$Filter" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsCashed" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$RequiredAttributes" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$SortingAttribute" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$EnumType" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsIdentity" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsCustom" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$RemoveAction" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsPrimaryKey" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$ChoiceAttributeData" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$ParametersData" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$CustomsData" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$MappingType" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$MappingName" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsStored" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$MappingTable" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$MappingRefTable" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$RefTableSearchMode" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$RefTableHashFunc" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$AttrLexem" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$IsAdditional" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$ContentType" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="$CharacterSet" />
      <xsl:text>&#10;</xsl:text>
      <xsl:text>WHERE NOT EXISTS(SELECT * FROM VCLib.T_ENTITIES_ATTRIBUTES where EntityID = @EntId AND Name = '</xsl:text>
      <xsl:value-of select="@Name" />
      <xsl:text>' AND IsAdditional = </xsl:text>
      <xsl:value-of select="$IsAdditional" />
      <xsl:text>)&#10;</xsl:text>
    </xsl:for-each>
    <xsl:text>GO&#10;&#10;</xsl:text>
  </xsl:template>

  <xsl:template name="client_module_commands">

    <xsl:param name="command"/>

    <xsl:choose>

      <xsl:when test="count($command/*)=0">

        IF NOT EXISTS(select * from VCLib.T_COMMAND cm where cm.ClientModules =  @ID and cm.Name = '<xsl:value-of select="$command/@Name" />')
        INSERT INTO VCLib.T_COMMAND (CommandID, Name, Enabled, IsDefault, CommandAppearance, Icon, Owner, type_, ClientModules)
        SELECT NEWID(), '<xsl:value-of select="$command/@Name" />', '<xsl:value-of select="@Enabled" />', '<xsl:value-of select="@IsDefault" />', '<xsl:value-of select="@CommandAppearance" />', '<xsl:value-of select="@Icon" />', @ownerID , (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>'),  @ID
        ELSE UPDATE  VCLib.T_COMMAND
        SET Enabled = '<xsl:value-of select="@Enabled" />',
        IsDefault = '<xsl:value-of select="@IsDefault" />',
        CommandAppearance = '<xsl:value-of select="@CommandAppearance" />',
        Icon =  '<xsl:value-of select="@Icon" />',
        type_ =  (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>')
        WHERE ClientModules = @ID AND Name = '<xsl:value-of select="$command/@Name" />'

      </xsl:when>

      <xsl:otherwise>

        <xsl:for-each select="$command/command">

          IF NOT EXISTS(select * from VCLib.T_COMMAND cm WHERE cm.ClientModules =  @ID and cm.Name = '<xsl:value-of select="../@Name" />')
          BEGIN
          INSERT INTO VCLib.T_COMMAND (CommandID, Name, Enabled, IsDefault, CommandAppearance, Icon, Owner, type_, ClientModules)
          SELECT NEWID(), '<xsl:value-of select="../@Name" />', '<xsl:value-of select="@Enabled" />', '<xsl:value-of select="@IsDefault" />', '<xsl:value-of select="@CommandAppearance" />', '<xsl:value-of select="@Icon" />', @ownerID , (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>'), @ID
          END
          ELSE UPDATE  VCLib.T_COMMAND
          SET Enabled = '<xsl:value-of select="@Enabled" />',
          IsDefault = '<xsl:value-of select="@IsDefault" />',
          CommandAppearance = '<xsl:value-of select="@CommandAppearance" />',
          Icon =  '<xsl:value-of select="@Icon" />',
          type_ = (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>')
          WHERE ClientModules = @ID AND Name = '<xsl:value-of select="../@Name" />'

          SET @OwnerID = (SELECT TOP 1 CommandID FROM VCLib.T_COMMAND cm WHERE cm.ClientModules =  @ID and cm.Name = '<xsl:value-of select="../@Name" />')

          <xsl:call-template name="client_module_commands">

            <xsl:with-param name="command"
										select="."/>

          </xsl:call-template>

        </xsl:for-each>

      </xsl:otherwise>

    </xsl:choose>

  </xsl:template>


  <xsl:template match="root/Schemas/Schema">

    IF NOT EXISTS(SELECT * FROM [VCLib].[T_SCHEMA] WHERE [SchemaName]='<xsl:value-of select="@Name" />')
    INSERT INTO [VCLib].[T_SCHEMA] ([SchemaName], [Priority]) VALUES ('<xsl:value-of select="@Name"/>', <xsl:value-of select="@Priority"/>)
    GO

    <xsl:for-each select ="client_modules/*">
      DECLARE @ownerID  uniqueidentifier
      DECLARE @type INT
      SET @type = (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>')

      DECLARE @ID uniqueidentifier
      SET @ID = (SELECT TOP 1 ClientModuleID FROM VCLib.T_CLIENT_MODULES WHERE ModuleType = '<xsl:value-of select="@ModuleType" />' and [Schema] = '<xsl:value-of select="../../@Name" />')

      IF @ID is NULL
      BEGIN
      SET @ID = NEWID()
      INSERT INTO VCLib.T_CLIENT_MODULES (ClientModuleID, ModuleType, ModuleDescription, [Schema], type_)

      SELECT @ID, '<xsl:value-of select="@ModuleType" />', '<xsl:value-of select="@ModuleDescription" />', '<xsl:value-of select="../../@Name" />', @type

      --CLIENT_MODULE_FEATURE START
      <xsl:for-each select="client_module_features/client_module_feature">
        INSERT INTO VCLib.T_CLIENT_MODULE_FEATURE (ClientModuleFeatureID, ClientModules, Name, [Description], EntityIndex)
        SELECT NEWID(), @ID, '<xsl:value-of select="@Name" />', '<xsl:value-of select="@Description" />', (SELECT EntityID FROM VCLib.T_ENTITIES WHERE [Schema] + '.' + EntName = '<xsl:choose>
          <xsl:when test="@EntityName">
            <xsl:value-of select="@EntityName" />
          </xsl:when>
          <xsl:otherwise>VCLib.ACTIVE_FEATURE</xsl:otherwise>
        </xsl:choose>')
      </xsl:for-each>
      --CLIENT_MODULE_FEATURE END

      --CLIENT_MODULE_FORM START
      <xsl:for-each select ="client_module_forms/client_module_form">
        <xsl:call-template name="ClientModuleForms"/>
      </xsl:for-each>
      --CLIENT_MODULE_FORM END

      --CLIENT_MODULE_COMMAND START
      <xsl:for-each select="./command">
        SET @OwnerID = NULL
        <xsl:call-template name="client_module_commands">

          <xsl:with-param name="command"
									select="."/>

        </xsl:call-template>
      </xsl:for-each>
      --CLIENT_MODULE_COMMAND END

      --CUSTOM_CLIENT_MODULE START
      <xsl:if test="name(.) = 'custom_client_module'">

        <xsl:for-each select="client_module_handlers/client_module_handlers[@Type = 0]">
          INSERT INTO VCLib.T_CLIENT_MODULE_HANDLER ([ClientModuleHandlerID], [CustomClientModule], [HandlerType], [Entities], [ProcessName], [Prepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="prepare" />'
        </xsl:for-each>

        <xsl:for-each select="client_module_handlers/client_module_handlers[@Type = 1]">
          INSERT INTO VCLib.T_CLIENT_MODULE_HANDLER ([ClientModuleHandlerID], [CustomClientModule], [HandlerType], [Entities], [ProcessName], [Prepare], [PrePrepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="prepare" />', '<xsl:value-of select="preprepare" />'
        </xsl:for-each>
      </xsl:if>
      --CUSTOM_CLIENT_MODULE END
      END
      ELSE
      BEGIN
      UPDATE cm
      SET cm.ModuleDescription = '<xsl:value-of select="@ModuleDescription" />'
      ,cm.[Schema] = '<xsl:value-of select="../../@Name" />'
      ,type_ = @type
      FROM VCLib.T_CLIENT_MODULES cm
      WHERE cm.ClientModuleID = @ID

      --CLIENT_MODULE_FEATURE START
      <xsl:for-each select="client_module_features/client_module_feature">
        IF NOT EXISTS(select * from VCLib.T_CLIENT_MODULE_FEATURE cmf where cmf.ClientModules = @ID and cmf.Name = '<xsl:value-of select="@Name" />')
        INSERT INTO VCLib.T_CLIENT_MODULE_FEATURE (ClientModuleFeatureID, ClientModules, Name, [Description], EntityIndex)
        SELECT NEWID(), @ID, '<xsl:value-of select="@Name" />', '<xsl:value-of select="@Description" />', (SELECT EntityID FROM VCLib.T_ENTITIES WHERE [Schema] + '.' + EntName = '<xsl:choose>
          <xsl:when test="@EntityName">
            <xsl:value-of select="@EntityName" />
          </xsl:when>
          <xsl:otherwise>VCLib.ACTIVE_FEATURE</xsl:otherwise>
        </xsl:choose>')
        ELSE
        UPDATE cmf
        SET cmf.[Description] = '<xsl:value-of select="@Description" />'
        ,cmf.EntityIndex = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE [Schema] + '.' + EntName = '<xsl:choose>
          <xsl:when test="@EntityName">
            <xsl:value-of select="@EntityName" />
          </xsl:when>
          <xsl:otherwise>VCLib.ACTIVE_FEATURE</xsl:otherwise>
        </xsl:choose>')
        FROM VCLib.T_CLIENT_MODULE_FEATURE cmf
        WHERE cmf.ClientModules = @ID and cmf.Name = '<xsl:value-of select="@Name" />'
      </xsl:for-each>
      --CLIENT_MODULE_FEATURE END

      --CLIENT_MODULE_FORM START
      <xsl:for-each select ="client_module_forms/client_module_form">
        <xsl:call-template name="ClientModuleForms"/>
      </xsl:for-each>
      --CLIENT_MODULE_FORM END

      --CLIENT_MODULE_COMMAND START
      <xsl:for-each select="./command">
        SET @OwnerID = NULL
        <xsl:call-template name="client_module_commands">

          <xsl:with-param name="command"
									select="."/>

        </xsl:call-template>
      </xsl:for-each>
      --CLIENT_MODULE_COMMAND END

      --CUSTOM_CLIENT_MODULE START
      <xsl:if test="name(.) = 'custom_client_module'">

        <xsl:for-each select="client_module_handlers/client_module_handler[@Type = 0]">
          IF NOT EXISTS(SELECT * from VCLib.T_CLIENT_MODULE_HANDLER mh where mh.CustomClientModule = @ID and mh.HandlerType = '<xsl:value-of select="@Type" />' and mh.ProcessName = '<xsl:value-of select="@Name" />')
          INSERT INTO VCLib.T_CLIENT_MODULE_HANDLER ([ClientModuleHandlerID], [CustomClientModule], [HandlerType], [Entities], [ProcessName], [Prepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="prepare" />'
          ELSE
          BEGIN
          UPDATE VCLib.T_CLIENT_MODULE_HANDLER
          SET HandlerType = '<xsl:value-of select="@Type" />'
          ,ProcessName = '<xsl:value-of select="@Name" />'
          ,Entities = '<xsl:value-of select="@ObjectType" />'
          ,Prepare = '<xsl:value-of select="prepare" />'
          FROM VCLib.T_CLIENT_MODULE_HANDLER mh
          WHERE mh.CustomClientModule = @ID and  mh.HandlerType = '<xsl:value-of select="@Type" />' and mh.ProcessName = '<xsl:value-of select="@Name" />'
          END
        </xsl:for-each>

        <xsl:for-each select="client_module_handlers/client_module_handler[@Type = 1]">
          IF NOT EXISTS(SELECT * from VCLib.T_CLIENT_MODULE_HANDLER mh where mh.CustomClientModule = @ID and mh.HandlerType = '<xsl:value-of select="@Type" />' and mh.ProcessName = '<xsl:value-of select="@Name" />')
          INSERT INTO VCLib.T_CLIENT_MODULE_HANDLER ([ClientModuleHandlerID], [CustomClientModule], [HandlerType], [Entities], [ProcessName], [PrePrepare], [Prepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="preprepare" />', '<xsl:value-of select="prepare" />'
          ELSE
          BEGIN
          UPDATE VCLib.T_CLIENT_MODULE_HANDLER
          SET HandlerType = '<xsl:value-of select="@Type" />'
          ,ProcessName = '<xsl:value-of select="@Name" />'
          ,Entities = '<xsl:value-of select="@ObjectType" />'
          ,PrePrepare = '<xsl:value-of select="preprepare" />'
          ,Prepare = '<xsl:value-of select="prepare" />'
          FROM VCLib.T_CLIENT_MODULE_HANDLER mh
          WHERE mh.CustomClientModule = @ID and  mh.HandlerType = '<xsl:value-of select="@Type" />' and mh.ProcessName = '<xsl:value-of select="@Name" />'
          END
        </xsl:for-each>
      </xsl:if>
      --CUSTOM_CLIENT_MODULE END
      END
      GO
    </xsl:for-each>

    <xsl:for-each select="holders/*">
      DECLARE @type INT
      SET @type = (SELECT TOP 1 EntityID FROM VCLib.T_ENTITIES WHERE EntName = '<xsl:value-of select ="name(.)"/>')
      DECLARE @ID uniqueidentifier
      SET @ID = (SELECT TOP 1 HolderID FROM VCLib.T_HOLDER WHERE Name = '<xsl:value-of select="@HolderName" />' and [Schema] = '<xsl:value-of select="../../@Name" />' and IsClient=<xsl:choose>
        <xsl:when test="@IsClient">
          '<xsl:value-of select="@IsClient" />'
        </xsl:when>
        <xsl:otherwise>'0'</xsl:otherwise>
      </xsl:choose>)
      IF @ID is NULL
      BEGIN
      SET @ID = NEWID()
      INSERT INTO VCLib.T_HOLDER ([HolderID], [Schema], [Name], [Description], [IsClient], [type_])
      SELECT @ID, '<xsl:value-of select="../../@Name" />', '<xsl:value-of select="@HolderName" />', '<xsl:value-of select="@Description" />', <xsl:choose>
        <xsl:when test="@IsClient">
          '<xsl:value-of select="@IsClient" />'
        </xsl:when>
        <xsl:otherwise>'0'</xsl:otherwise>
      </xsl:choose>, @type



      <xsl:for-each select="holder_parameters/holder_parameter">
        INSERT INTO VCLib.T_HOLDER_PARAMETER ([HolderParameterID], [Holder], [ParameterName], [Description], [ParameterValue])
        SELECT NEWID(), @ID, '<xsl:value-of select="@Name" />', '<xsl:value-of select="@Description" />', <xsl:choose>
          <xsl:when test="@Value">
            '<xsl:value-of select="@Value" />'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>


      <xsl:if test="name(.) = 'custom_holder'">
        INSERT INTO VCLib.T_CUSTOM_HOLDER ([HolderID], [On_Load], [On_Start], [On_Stop], [On_Unload], [IsCachedDataHolder])
        SELECT @ID, '<xsl:value-of select="on_load" />', '<xsl:value-of select="on_start" />', '<xsl:value-of select="on_stop" />', '<xsl:value-of select="on_unload" />', '<xsl:value-of select="@IsCachedDataHolder" />'


        <xsl:for-each select="holder_references/holder_reference">
          INSERT INTO VCLib.T_HOLDER_REFERENCE ([HolderReferenceID], [CustomHolder], [Holder])
          SELECT NEWID(), @ID, '<xsl:value-of select="@RefHolder" />'
        </xsl:for-each>


        <xsl:for-each select="holder_handlers/handler[@Type = 0]">
          INSERT INTO VCLib.T_HOLDER_HANDLER ([HolderHandlerID], [CustomHolder], [HandlerType], [Entities], [ProcessName], [Execute], [Postexecute], [Prepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="execute" />', '<xsl:value-of select="postexecute" />', '<xsl:value-of select="prepare" />'
        </xsl:for-each>

        <xsl:for-each select="holder_handlers/handler[@Type = 1]">
          INSERT INTO VCLib.T_HOLDER_HANDLER ([HolderHandlerID], [CustomHolder], [HandlerType], [Entities], [ProcessName], [Execute], [Postexecute], [PreExecute], [Prepare], [PrePostexecute], [PrePrepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="execute" />', '<xsl:value-of select="postexecute" />', '<xsl:value-of select="preexecute" />','<xsl:value-of select="prepare" />','<xsl:value-of select="prepostexecute" />','<xsl:value-of select="preprepare" />'
        </xsl:for-each>

        <xsl:for-each select="safe_loop_threads/safe_loop_thread">
          INSERT INTO VCLib.T_SAFE_LOOP_THREAD ([SafeLoopThreadID], [CustomHolder], [ThreadName], [Interval], [ThreadLexem])
          SELECT NEWID(), @ID, '<xsl:value-of select="@ThreadName" />', '<xsl:value-of select="@Interval" />', '<xsl:value-of select="threadLexem" />'
        </xsl:for-each>

      </xsl:if>
      END
      ELSE
      BEGIN
      UPDATE VCLib.T_HOLDER
      SET Description = '<xsl:value-of select="@Description" />'
      ,type_ = @type
      FROM VCLib.T_HOLDER h
      WHERE h.HolderID = @ID

      <xsl:for-each select="holder_parameters/holder_parameter">
        IF NOT EXISTS(select * from VCLib.T_HOLDER_PARAMETER hp where hp.Holder = @ID and hp.ParameterName = '<xsl:value-of select="@Name" />')
        INSERT INTO VCLib.T_HOLDER_PARAMETER ([HolderParameterID], [Holder], [ParameterName], [Description], [ParameterValue])
        SELECT NEWID(), @ID, '<xsl:value-of select="@Name" />', '<xsl:value-of select="@Description" />', <xsl:choose>
          <xsl:when test="@Value">
            '<xsl:value-of select="@Value" />'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
        ELSE
        UPDATE VCLib.T_HOLDER_PARAMETER
        SET Description = '<xsl:value-of select="@Description" />'
        <xsl:choose>
          <xsl:when test="@Value">
            ,ParameterValue = '<xsl:value-of select="@Value" />'
          </xsl:when>
        </xsl:choose>
        FROM VCLib.T_HOLDER_PARAMETER hp
        WHERE hp.Holder = @ID and hp.ParameterName = '<xsl:value-of select="@Name" />'
      </xsl:for-each>

      <xsl:if test="name(.) = 'custom_holder'">
        UPDATE VCLib.T_CUSTOM_HOLDER
        SET On_Load = '<xsl:value-of select="on_load" />'
        ,On_Start = '<xsl:value-of select="on_start" />'
        ,On_Stop = '<xsl:value-of select="on_stop" />'
        ,On_Unload = '<xsl:value-of select="on_unload" />'
        ,IsCachedDataHolder = '<xsl:value-of select="@IsCachedDataHolder" />'
        FROM VCLib.T_CUSTOM_HOLDER ch
        WHERE ch.HolderID = @ID


        <xsl:for-each select="holder_references/holder_reference">
          IF NOT EXISTS(SELECT * from VCLib.T_HOLDER_REFERENCE hr WHERE hr.CustomHolder = @ID and hr.Holder = '<xsl:value-of select="@RefHolder" />')
          INSERT INTO VCLib.T_HOLDER_REFERENCE ([HolderReferenceID], [CustomHolder], [Holder])
          SELECT NEWID(), @ID, '<xsl:value-of select="@RefHolder" />'
        </xsl:for-each>


        <xsl:for-each select="holder_handlers/handler[@Type = 0]">
          IF NOT EXISTS(SELECT * from VCLib.T_HOLDER_HANDLER hh where hh.CustomHolder = @ID and hh.HandlerType = '<xsl:value-of select="@Type" />' and hh.ProcessName = '<xsl:value-of select="@Name" />')
          INSERT INTO VCLib.T_HOLDER_HANDLER ([HolderHandlerID], [CustomHolder], [HandlerType], [Entities], [ProcessName], [Execute], [Postexecute], [Prepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="execute" />', '<xsl:value-of select="postexecute" />', '<xsl:value-of select="prepare" />'
          ELSE
          BEGIN
          UPDATE VCLib.T_HOLDER_HANDLER
          SET HandlerType = '<xsl:value-of select="@Type" />'
          ,ProcessName = '<xsl:value-of select="@Name" />'
          ,Entities = '<xsl:value-of select="@ObjectType" />'
          ,Prepare = '<xsl:value-of select="prepare" />'
          ,"Execute" = '<xsl:value-of select="execute" />'
          ,Postexecute = '<xsl:value-of select="postexecute" />'
          FROM VCLib.T_HOLDER_HANDLER hh
          WHERE hh.CustomHolder = @ID and  hh.HandlerType = '<xsl:value-of select="@Type" />' and hh.ProcessName = '<xsl:value-of select="@Name" />'
          END
        </xsl:for-each>

        <xsl:for-each select="holder_handlers/handler[@Type = 1]">
          IF NOT EXISTS(SELECT * from VCLib.T_HOLDER_HANDLER hh where hh.CustomHolder = @ID and hh.HandlerType = '<xsl:value-of select="@Type" />' and hh.ProcessName = '<xsl:value-of select="@Name" />')
          INSERT INTO VCLib.T_HOLDER_HANDLER ([HolderHandlerID], [CustomHolder], [HandlerType], [Entities], [ProcessName], [Execute], [Postexecute], [PreExecute], [Prepare], [PrePostexecute], [PrePrepare])
          SELECT NEWID(), @ID, '<xsl:value-of select="@Type" />', '<xsl:value-of select="@ObjectType" />', '<xsl:value-of select="@Name" />', '<xsl:value-of select="execute" />', '<xsl:value-of select="postexecute" />', '<xsl:value-of select="preexecute" />','<xsl:value-of select="prepare" />','<xsl:value-of select="prepostexecute" />','<xsl:value-of select="preprepare" />'
          ELSE
          BEGIN
          UPDATE VCLib.T_HOLDER_HANDLER
          SET HandlerType = '<xsl:value-of select="@Type" />'
          ,ProcessName = '<xsl:value-of select="@Name" />'
          ,Entities = '<xsl:value-of select="@ObjectType" />'
          ,PrePrepare = '<xsl:value-of select="preprepare" />'
          ,Prepare = '<xsl:value-of select="prepare" />'
          ,PreExecute = '<xsl:value-of select="preexecute" />'
          ,"Execute" = '<xsl:value-of select="execute" />'
          ,PrePostexecute = '<xsl:value-of select="prepostexecute" />'
          ,Postexecute = '<xsl:value-of select="postexecute" />'
          FROM VCLib.T_HOLDER_HANDLER hh
          WHERE hh.CustomHolder = @ID and  hh.HandlerType = '<xsl:value-of select="@Type" />' and hh.ProcessName = '<xsl:value-of select="@Name" />'
          END
        </xsl:for-each>

        <xsl:for-each select="safe_loop_threads/safe_loop_thread">
          IF NOT EXISTS(SELECT * from VCLib.T_SAFE_LOOP_THREAD slt where slt.CustomHolder = @ID and slt.ThreadName = '<xsl:value-of select="@ThreadName" />')
          INSERT INTO VCLib.T_SAFE_LOOP_THREAD ([SafeLoopThreadID], [CustomHolder], [ThreadName], [Interval], [ThreadLexem])
          SELECT NEWID(), @ID, '<xsl:value-of select="@ThreadName" />', '<xsl:value-of select="@Interval" />', '<xsl:value-of select="threadLexem" />'
          ELSE
          BEGIN
          UPDATE VCLib.T_SAFE_LOOP_THREAD
          SET Interval = '<xsl:value-of select="@Interval" />'
          ,ThreadLexem = '<xsl:value-of select="threadLexem" />'
          FROM VCLib.T_SAFE_LOOP_THREAD slt
          WHERE slt.CustomHolder = @ID and slt.ThreadName = '<xsl:value-of select="@ThreadName" />'
          END
        </xsl:for-each>
      </xsl:if>
      END
      GO
    </xsl:for-each>

    <xsl:for-each select ="users/user">
      -- USER
      DECLARE @EntityID INT
      DECLARE @IdentityId uniqueidentifier
      DECLARE @LoginId uniqueidentifier
      DECLARE @userId uniqueidentifier
      DECLARE @type INT
      declare @rc as uniqueidentifier
      DECLARE @contId INT
      declare @DivisionID uniqueidentifier
      declare @salt uniqueidentifier

      if exists(select * from VCLib.T_DIVISIONS)
      set @DivisionID = (select top 1 DivisionID from VCLib.T_DIVISIONS order by TreeLevel)
      else
      begin
      set @DivisionID = newid()
      insert into VCLib.T_DIVISIONS ( DivisionID, Name, FullName )
      values ( @DivisionID, 'Main', 'Main')
      end

			select @type = case when '<xsl:value-of select="../../../Schema/@Name" />' != ''
			then (SELECT EntityID FROM VCLib.T_ENTITIES e WHERE e.[EntName] = 'USERS' and e.[schema] = '<xsl:value-of select="../../../Schema/@Name" />')
			else (SELECT EntityID FROM VCLib.T_ENTITIES e WHERE e.[EntName] = 'USERS')
			end
      
      set @salt = NEWID()

      select top 1 @IdentityId = i.IdentityID, @LoginId = l.LoginID from VCLib.T_IDENTITY i join VCLib.T_LOGIN l on l.[Identity] = i.IdentityID where l.[Login] = '<xsl:value-of select="@Login" />'

      if (@IdentityId is NULL)
      begin

      set @IdentityId = newid()
      set @LoginId = newid()

      insert into VCLib.T_IDENTITY (IdentityID, IdentityName)
      values (@IdentityId, '<xsl:value-of select="@UserName" />')

      <!--<xsl:variable name="salt" select="user:createSalt()" />-->
      insert into VCLib.T_LOGIN (LoginID, [Login], AuthenticationType, Password, Salt, Flags, [Identity], Divisions, IsBlocked)
      values (@LoginId, '<xsl:value-of select="@Login" />', 0, (SELECT HASHBYTES('SHA2_512', '<xsl:value-of select="@Password" />'+cast(@salt as varchar(36))) FOR XML PATH(''), BINARY BASE64), @salt, 0, @IdentityId, @DivisionID, 0)

      end
      else
      begin

      update VCLib.T_IDENTITY
      set IdentityName = '<xsl:value-of select="@UserName" />'
      where IdentityID = @IdentityId

      end

      select top 1 @userId = UserID from VCLib.T_USERS where [Identity] = @IdentityId

      if (@userId is null)
      begin

      set @userId = newid()
      insert into VCLib.T_USERS (UserID, Flags, DivisionID, [Identity], type_)
      values (@userId, 1, @DivisionID, @IdentityId, @type)

      insert into <xsl:value-of select="../../@Name" />.T_USERS (UserID)
      values (@userId)

      end

      update VCLib.T_users
      set Flags = case when <xsl:value-of select="@Active" /> = 1 then Flags | 1 else Flags &amp; ~1 end
      where userId = @userId

      <xsl:if test="@Remote">
        update VCLib.T_users
        set Flags = case when <xsl:value-of select="@Remote" /> = 1 then Flags | 4 else Flags &amp; ~4 end
        where userId = @userId
      </xsl:if>

      <xsl:for-each select="UserSearches">
        -- user searches
        <xsl:for-each select="UserSearch">
          set @rc = newid()
          SELECT @EntityID = EntityID from VCLib.T_ENTITIES WHERE EntName='<xsl:value-of select="@Entity" />'
          INSERT INTO VCLib.T_USER_SEARCHES(SearchID,EntityID, UserID, SearchName, FilterValue, SimpleFilter)
          VALUES(@rc, @EntityID, @userId, '<xsl:value-of select="@SearchName" />', '<xsl:value-of select="." />', <xsl:value-of select="@SimpleFilter" />)
        </xsl:for-each>

      </xsl:for-each>
      GO
    </xsl:for-each>

    <xsl:for-each select ="roles/role">
      -- ROLE
      DECLARE @rc uniqueidentifier

      IF NOT EXISTS (SELECT * from VCLib.T_ROLES WHERE RoleName = '<xsl:value-of select="@RoleName" />' )
      BEGIN
      DECLARE @EnumTypeID int
      DECLARE @EnumID int
      SELECT @EnumTypeID = (SELECT EnumTypeID FROM VCLib.T_ENUM_TYPES WHERE Name = 'Departament')
      SELECT @EnumID = (SELECT min(EnumID) FROM VCLib.T_ENUMS WHERE Name = '<xsl:value-of select="@Departament" />' AND EnumTypeID = @EnumTypeID)
      set @rc = newid()
      INSERT INTO VCLib.T_ROLES (RoleId,RoleName, RoleDesc, Departament, DivisionsLevel)
      VALUES (@rc,'<xsl:value-of select="@RoleName" />','<xsl:value-of select="@RoleDesc" />', @EnumID,
      <xsl:choose>
        <xsl:when test="@DivisionsLevel">
          <xsl:value-of select="@DivisionsLevel" />
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>)
      END
      GO

      <xsl:for-each select="users/user">
        -- USER IN ROLE
        DECLARE @rc uniqueidentifier
        DECLARE @userId uniqueidentifier

        select top 1 @userId = u.UserID from VCLib.T_USERS u join VCLib.T_IDENTITY i on u.[Identity] = i.IdentityID join VCLib.T_LOGIN l on l.[Identity] = i.IdentityID where l.[Login] = '<xsl:value-of select="@Login" />'

        if (@userId is not null)
        begin

        IF NOT EXISTS ( SELECT * FROM VCLib.T_USERS_ROLES
        WHERE UserId=(SELECT UserId FROM VCLib.T_USERS WHERE UserID = @userId)
        AND RoleId=(SELECT RoleId FROM VCLib.T_ROLES WHERE RoleName='<xsl:value-of select="ancestor::role/@RoleName" />') )
        begin
        set @rc = newid()
        INSERT INTO VCLib.T_USERS_ROLES (UserRoleId,UserId,RoleId)
        (
        SELECT
        @rc,
        (SELECT UserID FROM VCLib.T_USERS WHERE UserID = @userId),
        (SELECT RoleId FROM VCLib.T_ROLES WHERE RoleName='<xsl:value-of select="ancestor::role/@RoleName" />')
        )
        end
        end
        GO
      </xsl:for-each>

      PRINT 'ВКЛЮЧЕНИЕ КЛИЕНТСКИХ МОДУЛЕЙ И ИХ ФИЧ ДЛЯ РОЛЕЙ. НАЧАЛО.'
      GO
      <xsl:for-each select="client_modules/client_module">
        <xsl:variable name="module_name">
          <xsl:value-of select="@Schema" />.<xsl:value-of select="@ModuleType" />
        </xsl:variable>
        <xsl:variable name="role_name">
          <xsl:value-of select="ancestor::role/@RoleName" />
        </xsl:variable>
        PRINT 'ВКЛЮЧЕНИЕ КЛИЕНТСКОГО МОДУЛЯ <xsl:value-of select="$module_name" /> ДЛЯ РОЛИ <xsl:value-of select="$role_name" />. НАЧАЛО.'
        DECLARE @ClientModule uniqueidentifier = (SELECT ClientModuleID FROM VCLib.T_CLIENT_MODULES WHERE ModuleType = '<xsl:value-of select="@ModuleType" />' and [Schema] = '<xsl:value-of select="@Schema" />')
        DECLARE @Role uniqueidentifier = (SELECT RoleId FROM VCLib.T_ROLES WHERE RoleName='<xsl:value-of select="$role_name" />')
        DECLARE @RoleClientModule uniqueidentifier = (select RoleClientModuleID from VCLib.T_ROLE_CLIENT_MODULES where ClientModuleID = @ClientModule and RoleID = @Role)

        IF (@ClientModule is not null)
        BEGIN --0
        IF (@RoleClientModule is null)
        BEGIN
        PRINT 'КЛИЕНТСКИЙ МОДУЛЬ <xsl:value-of select="$module_name" /> БУДЕТ ВКЛЮЧЕН ДЛЯ РОЛИ <xsl:value-of select="$role_name" />'

        set @RoleClientModule= newid()

        INSERT INTO VCLib.T_ROLE_CLIENT_MODULES (RoleClientModuleID, ClientModuleID,RoleId, LoadOrder)
        SELECT
        @RoleClientModule
        , @ClientModule
        , @Role
        , 0
        END

        <xsl:if test="client_module_features/node()">
          PRINT 'ВКЛЮЧАЕМ ФИЧИ КЛИЕНТСКОГО МОДУЛЯ <xsl:value-of select="$module_name" /> ДЛЯ РОЛИ <xsl:value-of select="$role_name" />. НАЧАЛО'
          declare @FeatureEntityIndex int
          declare @FeatureId uniqueidentifier
          declare @FeatureEnabled bit = 0
          <xsl:for-each select="client_module_features/client_module_feature">
            --ВКЛЮЧЕНИЕ ФИЧИ. НАЧАЛО
            --ПРОВЕРКА СУЩЕСТВУЕТ ЛИ ФИЧА
            set @FeatureEntityIndex = (select top 1 EntityId from vclib.T_ENTITIES where EntName = '<xsl:value-of select="@EntityIndexName" />' and [Schema] = '<xsl:value-of select="@EntityIndexSchemaName" />')
            set @FeatureId = (select top 1 ClientModuleFeatureID from vclib.T_CLIENT_MODULE_FEATURE where Name = '<xsl:value-of select="@Name" />' and EntityIndex = @FeatureEntityIndex and ClientModules = @ClientModule)
            --ПРОВЕРКА ВКЛЮЧЕНА ЛИ ФИЧА
            set @FeatureEnabled = 0
            if exists(select top 1 1 from vclib.T_BASE_FEATURE_SETTINGS where ClientModuleFeature = @FeatureId and RoleClientModules = @RoleClientModule)
            set @FeatureEnabled = 1
            IF (@FeatureId is not null and @FeatureEnabled = 0)
            BEGIN
            PRINT 'ВКЛЮЧАЕМ ФИЧУ <xsl:value-of select="@Name" /> В КЛИЕНТСКОМ МОДУЛЕ <xsl:value-of select="$module_name" /> ДЛЯ РОЛИ <xsl:value-of select="$role_name" />'
            INSERT INTO [VCLib].[T_BASE_FEATURE_SETTINGS]
            ([BaseFeatureSettingsID]
            ,[ClientModuleFeature]
            ,[RoleClientModules]
            ,[type_])
            VALUES
            (newid()
            ,@FeatureId
            ,@RoleClientModule
            ,@FeatureEntityIndex)
            END
            --ВКЛЮЧЕНИЕ ФИЧИ. КОНЕЦ
          </xsl:for-each>
          PRINT 'ВКЛЮЧАЕМ ФИЧИ КЛИЕНТСКОГО МОДУЛЯ <xsl:value-of select="$module_name" /> ДЛЯ РОЛИ <xsl:value-of select="$role_name" />. КОНЕЦ'
        </xsl:if>
        END --0
        PRINT 'ВКЛЮЧЕНИЕ КЛИЕНТСКОГО МОДУЛЯ <xsl:value-of select="@Schema" />.<xsl:value-of select="@ModuleType" /> ДЛЯ РОЛИ <xsl:value-of select="$role_name" />. КОНЕЦ.'
        GO
      </xsl:for-each>
      print 'ВКЛЮЧЕНИЕ КЛИЕНТСКИХ МОДУЛЕЙ И ИХ ФИЧ ДЛЯ РОЛЕЙ. КОНЕЦ.'

      <xsl:for-each select="access_entries/access_entry">
        -- roles - access_entries
        declare @rc uniqueidentifier
        declare @role uniqueidentifier
        declare @entryid uniqueidentifier

        SELECT @role = RoleId FROM VCLib.T_ROLES WHERE RoleName='<xsl:value-of select="ancestor::role/@RoleName" />'
        select @entryid = '<xsl:value-of select="@EntryID" />'

        IF NOT EXISTS ( SELECT * FROM VCLib.T_BAE_ROLES
        where entryid = @entryid
        AND RoleId=@role )
        begin
        SET @rc= newid()
        INSERT INTO VCLib.T_BAE_ROLES (EntryRoleID, RoleID,EntryID)
        (
        SELECT
        @rc,
        @role,
        @entryid
        )

        end
        GO
      </xsl:for-each>

      <xsl:for-each select="access_reports/access_report">
        IF EXISTS (SELECT ReportId FROM VCLib.T_Report WHERE ReportId='<xsl:value-of select="@ReportID"/>')
        BEGIN
        DECLARE @repRoleID uniqueidentifier
        DECLARE @roleID uniqueidentifier
        DECLARE @rights int
        SET @repRoleID=newid()
        SELECT @roleId=RoleId FROM VCLib.T_ROLES WHERE RoleName='<xsl:value-of select="ancestor::role/@RoleName" />'
        SELECT @rights = EnumID FROM VCLib.T_ENUMS WHERE Alias='<xsl:value-of select="@Rights" />' and EnumTypeID = 7

        INSERT INTO VCLib.T_ReportRole
        (RepRoleID,ReportID,RoleID,ReportRights)
        VALUES
        (@repRoleID,'<xsl:value-of select="@ReportID"/>',@roleId,@rights)
        END
        GO
      </xsl:for-each>

      UPDATE mrs
      SET mrs.LoadOrder = t.LoadOrder
      FROM VCLib.T_ROLE_CLIENT_MODULES mrs
      join (
      SELECT rcm.RoleClientModuleID, ROW_NUMBER() OVER (PARTITION BY rcm.ClientModuleID ORDER BY rcm.LoadOrder, r.RoleDesc) - 1 AS LoadOrder
      FROM VCLib.T_ROLE_CLIENT_MODULES rcm
      join VCLib.T_ROLES r on r.RoleID = rcm.RoleID
      ) t ON t.RoleClientModuleID = mrs.RoleClientModuleID
      GO
    </xsl:for-each>

  </xsl:template>

  <!-- ClientModuleForms -->
  <xsl:template name="ClientModuleForms">
    INSERT INTO [VCLib].[T_CLIENT_MODULE_FORM] ([ClientModuleFormID], [ClientModules], [Entities], [Context], [InitializationLexem], [Name], [Schema])
    SELECT NEWID()
    ,@ID
    ,(select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@Entities" />')
    ,<xsl:choose>
      <xsl:when test="@Context != ''">
        '<xsl:value-of select="@Context" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@InitializationLexem != ''">
        '<xsl:value-of select="@InitializationLexem" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,'<xsl:value-of select="@Name" />'
    ,'<xsl:value-of select="@Schema" />'
    where not exists
    (
    select *
    from [VCLib].[T_CLIENT_MODULE_FORM] cmf
    where cmf.ClientModules = @ID and cmf.Entities = (select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@Entities" />')
    <xsl:choose>
      <xsl:when test="@Context != ''">
        and cmf.Context = '<xsl:value-of select="@Context" />'
      </xsl:when>
    </xsl:choose>
    )
  </xsl:template>

  <xsl:template match="root/UserContexts">
    <xsl:for-each select="UserContext">
      -- user columns
      DECLARE @EntityID INT
      DECLARE @rc uniqueidentifier

      DECLARE @ShowGrid bit
      DECLARE @Scale int
      DECLARE @Context varchar(255)
      DECLARE @ViewName varchar(255)
      DECLARE @ActiveContext bit
      DECLARE @contId uniqueidentifier

      DECLARE @ReadOnly bit
      DECLARE @SortingLexem varchar(max)
      DECLARE @CustomSortingEnabled bit
      DECLARE @UserContextType int

      SELECT @EntityID = EntityID from VCLib.T_ENTITIES WHERE [Schema] + '.' + [EntName]='<xsl:value-of select="@Entity" />'

      select @Context =    <xsl:choose>
        <xsl:when test="@UserContext">
          '<xsl:value-of select="@UserContext" />'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      select @ShowGrid = <xsl:choose>
        <xsl:when test="@ShowGrid">
          '<xsl:value-of select="@ShowGrid"/>'
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
      select @ViewName = <xsl:choose>
        <xsl:when test="@ViewName">
          '<xsl:value-of select="@ViewName"/>'
        </xsl:when>
        <xsl:otherwise>'По умолчанию'</xsl:otherwise>
      </xsl:choose>
      select @Scale = <xsl:choose>
        <xsl:when test="@Scale">
          '<xsl:value-of select="@Scale"/>'
        </xsl:when>
        <xsl:otherwise>100</xsl:otherwise>
      </xsl:choose>
      select @ActiveContext = <xsl:choose>
        <xsl:when test="@ActiveContext">
          '<xsl:value-of select="@ActiveContext"/>'
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
      select @ReadOnly = <xsl:choose>
        <xsl:when test="@ReadOnly">
          '<xsl:value-of select="@ReadOnly"/>'
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
      select @SortingLexem = '<xsl:value-of select="@SortingLexem" />'
      select @CustomSortingEnabled = <xsl:choose>
        <xsl:when test="@CustomSortingEnabled">
          <xsl:value-of select="@CustomSortingEnabled"/>
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
      select @UserContextType = <xsl:choose>
        <xsl:when test="@UserContextType">
          <xsl:value-of select="@UserContextType"/>
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>

      if (@Context is NULL)
      begin
      SELECT @contId = (SELECT UserContextID FROM VCLib.T_USER_CONTEXTS WHERE
      (Context is NULL AND EntityID = @EntityID AND UserID is NULL AND ViewName = @ViewName))
      end
      else
      begin
      SELECT @contId = (SELECT UserContextID FROM VCLib.T_USER_CONTEXTS WHERE
      (Context = @Context AND EntityID = @EntityID AND UserID is NULL and ViewName = @ViewName))
      end

      if (@contId is NULL)
      begin
      set @contId = newid()
      INSERT INTO VCLib.T_USER_CONTEXTS ([UserContextID], [EntityID], [UserID], [Context], [ShowGrid], [ScalePercent], [ViewName], [ActiveContext], [ReadOnly], [SortingLexem], [CustomSortingEnabled], [UserContextType])
      VALUES (@contId, @EntityID, null, @Context, @ShowGrid, @Scale, @ViewName, @ActiveContext, @ReadOnly, @SortingLexem, @CustomSortingEnabled, @UserContextType)
      end

      <xsl:for-each select="UserColumns/UserColumn">
        INSERT INTO VCLib.T_USER_COLUMNS(UserColsId, AttributePath, [DisplayName], [ColumnIndex], [ColumnWidth], [Visible], [SortingIndex], [Sorting], [UserContextID])
        VALUES(newid(), '<xsl:value-of select="@AttributePath" />',
        '<xsl:value-of select="@DisplayName" />', <xsl:value-of select="@ColumnIndex" />,
        <xsl:value-of select="@ColumnWidth" />, 1,
        <xsl:choose>
          <xsl:when test="@SortingIndex">
            '<xsl:value-of select="@SortingIndex"/>'
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>, <xsl:value-of select="@Sorting" />, @contId)
      </xsl:for-each>
      GO

    </xsl:for-each>
  </xsl:template>

  <xsl:template match="root/CommonUserSearches">
    -- user searches
    DECLARE @EntityID INT
    DECLARE @rc uniqueidentifier

    <xsl:for-each select="UserSearch">
      set @rc = newid()
      SELECT @EntityID = EntityID from VCLib.T_ENTITIES WHERE EntName='<xsl:value-of select="@Entity" />'
      INSERT INTO VCLib.T_USER_SEARCHES(SearchId,EntityID, UserID, SearchName, FilterValue, SimpleFilter)
      VALUES(@rc,@EntityID, null, '<xsl:value-of select="@SearchName" />', '<xsl:value-of select="." />', <xsl:value-of select="@SimpleFilter" />)
    </xsl:for-each>
    GO

  </xsl:template>

  <xsl:template match="EnumTypes">
    <xsl:apply-templates select="EnumType" />

    declare @FieldName varchar(256)
    set @FieldName = 'PrimaryKey'
    declare @isexist int

    set @isexist = (select id from T_ENTITY_IDS where EntName = 'ENUM_TYPES' and FieldName = @FieldName)
    if @isexist is null
    begin
    insert T_ENTITY_IDS (id, EntName, FieldName) values(<xsl:value-of select="@next-enum-type-id" />, 'ENUM_TYPES', @FieldName)
    end
    else
    begin
    UPDATE T_ENTITY_IDS SET [id]=<xsl:value-of select="@next-enum-type-id" />
    WHERE [EntName]='ENUM_TYPES'
    end

    set @isexist = (select id from T_ENTITY_IDS where EntName = 'ENUMS' and FieldName = 'PrimaryKey')
    if @isexist is null
    begin
    insert T_ENTITY_IDS (id, EntName, FieldName) values(<xsl:value-of select="@next-enum-id" />, 'ENUMS', @FieldName)
    end
    else
    begin
    UPDATE T_ENTITY_IDS SET [id]=<xsl:value-of select="@next-enum-id" />
    WHERE [EntName]='ENUMS'
    end
    GO

  </xsl:template>

  <xsl:template match="EnumType">
    -- EnumType
    --DECLARE @ID INT
    --DECLARE @rc INT
    DECLARE @typeT INT
    DECLARE @typeE INT
    DECLARE @id INT

    --exec @id = sp_GenerateIdForEntity 'ENUM_TYPES'
    <xsl:variable name="EnumTypeId"
					  select="@id" />

    SELECT @id = (SELECT EnumTypeId FROM VCLib.T_ENUM_TYPES WHERE EnumTypeId = <xsl:value-of select="$EnumTypeId" />)
    IF @id IS NOT NULL

    UPDATE VCLib.T_ENUM_TYPES SET
    Name = '<xsl:value-of select="@Name" />', Description = '<xsl:value-of select="@Description" />'
    WHERE EnumTypeId = <xsl:value-of select="$EnumTypeId" />

    ELSE

    INSERT INTO VCLib.T_ENUM_TYPES (EnumTypeId,Name, Description)
    VALUES(<xsl:value-of select="$EnumTypeId" />,'<xsl:value-of select="@Name" />', '<xsl:value-of select="@Description" />');
    --SELECT @ID = IDENT_CURRENT('VCLib.T_ENUM_TYPES')

    <xsl:for-each select="Enum">
      --exec @rc = sp_GenerateIdForEntity 'ENUMS'

      SELECT @id = (SELECT EnumId FROM VCLib.T_ENUMS WHERE EnumId = <xsl:value-of select="@id" />)
      IF @id IS NOT NULL

      UPDATE VCLib.T_ENUMS SET
      EnumTypeID = <xsl:value-of select="$EnumTypeId" />
      , Code = <xsl:value-of select="@Code" />
      , Name = '<xsl:value-of select="@Name" />'
      , ShortName = '<xsl:value-of select="@ShortName" />'
      , Active = <xsl:value-of select="@Active" />
      , Alias = '<xsl:value-of select="@Alias" />'
      <xsl:choose>
        <xsl:when test="@Order">
          , [Order] = <xsl:value-of select="@Order" />
        </xsl:when>
      </xsl:choose>
      WHERE EnumId = <xsl:value-of select="@id" />

      ELSE

      INSERT INTO VCLib.T_ENUMS (EnumId, EnumTypeID, Code, Name, ShortName, Active, Alias, [Order])
      VALUES(
      <xsl:value-of select="@id" />,
      <xsl:value-of select="$EnumTypeId" />,
      <xsl:value-of select="@Code" />,
      '<xsl:value-of select="@Name" />',
      '<xsl:value-of select="@ShortName" />',
      <xsl:value-of select="@Active" />,
      '<xsl:value-of select="@Alias" />',
      <xsl:choose>
        <xsl:when test="@Order">
          <xsl:value-of select="@Order" />
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>);
    </xsl:for-each>
    GO

  </xsl:template>

  <xsl:template match="root/process_access_entries/process_access_entry">
    -- PROCESS_ACCESS_ENTRY
    declare @type int
    declare @id uniqueidentifier
    declare @entryid uniqueidentifier
    select @entryid = '<xsl:value-of select="@EntryID" />'

    SELECT @type = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName = 'PROCESS_ACCESS_ENTRY')

    SELECT @id = (SELECT EntryID FROM VCLib.T_BASE_ACCESS_ENTRY WHERE EntryID = @entryid)
    IF @id IS NOT NULL

    UPDATE VCLib.T_BASE_ACCESS_ENTRY SET
    EntryDescription = '<xsl:value-of select="@EntryDescription" />',
    type_ = @type WHERE EntryID = @entryid

    ELSE

    INSERT INTO VCLib.T_BASE_ACCESS_ENTRY
    (EntryID, EntryDescription, type_)
    VALUES
    (@entryid, '<xsl:value-of select="@EntryDescription" />', @type)

    SELECT @id = (SELECT EntryID FROM VCLib.T_PROCESS_ACCESS_ENTRY WHERE EntryID = @entryid)
    IF @id IS NOT NULL

    UPDATE VCLib.T_PROCESS_ACCESS_ENTRY SET
    LexemContent = '<xsl:value-of select="@LexemContent" />',
    ProcessName = '<xsl:value-of select="@ProcessName" />',
    Priority = <xsl:value-of select="@Priority" />,
    Flags = <xsl:value-of select="@Flags" />,
    EntityID = <xsl:value-of select="@EntityID" />,
    CheckInputObject = <xsl:value-of select="@CheckInputObject" />,
    CheckDBObject = <xsl:value-of select="@CheckDBObject" />
    WHERE EntryID = @entryid;

    ELSE

    INSERT INTO VCLib.T_PROCESS_ACCESS_ENTRY
    (EntryID, LexemContent, ProcessName, Priority, Flags,
    EntityID, CheckInputObject, CheckDBObject)
    VALUES
    (@entryid,
    '<xsl:value-of select="@LexemContent" />',
    '<xsl:value-of select="@ProcessName" />',
    <xsl:value-of select="@Priority" />,
    <xsl:value-of select="@Flags" />,
    <xsl:value-of select="@EntityID" />,
    <xsl:value-of select="@CheckInputObject" />,
    <xsl:value-of select="@CheckDBObject" />);

    GO

  </xsl:template>

  <xsl:template match="root/entity_access_entries/entity_access_entry">
    -- ENTITY_ACCESS_ENTRY
    DECLARE @type INT
    declare @id uniqueidentifier
    declare @entryid uniqueidentifier
    select @entryid = '<xsl:value-of select="@EntryID" />'

    SELECT @type = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName = 'ENTITY_ACCESS_ENTRY')

    SELECT @id = (SELECT EntryID FROM VCLib.T_BASE_ACCESS_ENTRY WHERE EntryID = @entryid)
    IF @id IS NOT NULL

    UPDATE VCLib.T_BASE_ACCESS_ENTRY SET
    EntryDescription = '<xsl:value-of select="@EntryDescription" />',
    type_ = @type WHERE EntryID = @entryid

    ELSE

    INSERT INTO VCLib.T_BASE_ACCESS_ENTRY
    (EntryID, EntryDescription, type_)
    VALUES
    (@entryid,
    '<xsl:value-of select="@EntryDescription" />',
    @type);

    SELECT @id = (SELECT EntryID FROM VCLib.T_ENTITY_ACCESS_ENTRY WHERE EntryID = @entryid)
    IF @id IS NOT NULL

    UPDATE VCLib.T_ENTITY_ACCESS_ENTRY SET
    AccessType = <xsl:value-of select="@Access" />,
    LexemContent = '<xsl:value-of select="@LexemContent" />',
    EntityID = <xsl:value-of select="@EntityID" />
    WHERE EntryID = @entryid

    ELSE

    INSERT INTO VCLib.T_ENTITY_ACCESS_ENTRY
    (EntryID, AccessType, LexemContent, EntityID)
    VALUES
    (@entryid,
    <xsl:value-of select="@Access" />,
    '<xsl:value-of select="@LexemContent" />',
    <xsl:value-of select="@EntityID" />);

    GO

  </xsl:template>

  <xsl:template match="root/entity_attribute_access_entries/entity_attribute_access_entries">
    -- ENTITY_ATTRIBUTE_ACCESS_ENTRY
    DECLARE @type INT
    declare @entryid uniqueidentifier
    select @entryid = '<xsl:value-of select="@EntryID" />'

    SELECT @type = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName = 'ENTITY_ATTRIBUTE_ACCESS_ENTRY')

    INSERT INTO VCLib.T_BASE_ACCESS_ENTRY
    (EntryID, EntryDescription, type_)
    VALUES
    (@entryid,
    '<xsl:value-of select="@EntryDescription" />',
    @type);
    INSERT INTO VCLib.T_ENT_ATTR_ACCESS_ENTRY
    (EntryID, Attributes, AccessType, LexemContent, EntityID)
    VALUES
    (@entryid,
    '<xsl:value-of select="@Attributes" />',
    <xsl:value-of select="@Access" />,
    '<xsl:value-of select="@LexemContent" />',
    <xsl:value-of select="@EntityID" />);
    GO

  </xsl:template>

  <xsl:template match="root/enum_access_entries/enum_access_entry">
    -- ENUM_ACCESS_ENTRY
    DECLARE @type INT

    declare @entryid uniqueidentifier
    select @entryid = newid()

    SELECT @type = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName = 'ENUM_ACCESS_ENTRY')

    INSERT INTO VCLib.T_BASE_ACCESS_ENTRY
    (EntryID, EntryDescription, type_)
    VALUES
    (@entryid,
    '<xsl:value-of select="@EntryDescription" />',
    @type);
    INSERT INTO VCLib.T_ENUM_ACCESS_ENTRY
    (EntryID, Enabled, EnumTypeID)
    VALUES
    (@entryid,
    <xsl:value-of select="@Enabled" />,
    <xsl:value-of select="@EnumTypeID" />);
    GO

  </xsl:template>

  <xsl:template match="root/reportformats/reportformat">
    -- ReportFileFormat
    DECLARE @ID uniqueidentifier

    SELECT @ID = RepFmtId FROM VCLib.T_ReportFileFormat WHERE Name = '<xsl:value-of select="@FormatName"/>'
    IF @ID IS NOT NULL
    BEGIN
    UPDATE VCLib.T_ReportFileFormat SET
    Name = '<xsl:value-of select="@FormatName"/>',
    HandlerName = '<xsl:value-of select="@HandlerName"/>'
    WHERE RepFmtId = @ID
    END
    ELSE
    BEGIN
    set @ID = <xsl:choose>
      <xsl:when test="@id != ''">
        <xsl:text>'</xsl:text>
        <xsl:value-of select="@id"/>
        <xsl:text>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>newid()</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    INSERT INTO VCLib.T_ReportFileFormat (RepFmtId, Name, HandlerName)
    VALUES(@ID, '<xsl:value-of select="@FormatName"/>', '<xsl:value-of select="@HandlerName"/>')
    END
    GO
  </xsl:template>

  <xsl:template match="root/Reports">
    <xsl:for-each select="Report">
      -- Report
      DECLARE
      @ID uniqueidentifier,
      @ExistID uniqueidentifier,
      @repName varchar(100),
      @groupID uniqueidentifier,
      @entID int,
      @repLoadDataType int,
      @repFormTypeTable int,
      @repFormatType uniqueidentifier,
      @type int

      BEGIN
      SET @ID = '<xsl:value-of select="@ID"/>'
      SET @repName = '<xsl:value-of select="@Name"/>'
      SELECT @repLoadDataType = EnumID FROM VCLib.T_ENUMS
      WHERE EnumTypeID = (select EnumTypeID from VCLib.T_ENUM_TYPES where Name='ReportLoadDataType')
      AND Alias='<xsl:value-of select="@ReportLoadDataType"/>'
      SELECT @repFormTypeTable = EnumID FROM VCLib.T_ENUMS
      WHERE EnumTypeID = (select EnumTypeID from VCLib.T_ENUM_TYPES where Name='ReportFormType')
      AND Alias='<xsl:value-of select="@ReportFormType"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="@Entity"/>'
      SELECT @type = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='Report'

      SELECT @ExistID = ReportID FROM VCLib.T_BaseReport WHERE ReportID = @ID
      IF @ExistID IS NOT NULL

      UPDATE VCLib.T_BaseReport SET
      RepName = @repName,
      RepDesc= <xsl:choose>
        <xsl:when test="@Desc">
          '<xsl:value-of select="@Desc"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      Active = <xsl:choose>
        <xsl:when test="@Active">
          '<xsl:value-of select="@Active"/>'
        </xsl:when>
        <xsl:otherwise>1</xsl:otherwise>
      </xsl:choose>,
      type_ = @type
      WHERE ReportID = @ExistID

      ELSE

      INSERT INTO VCLib.T_BaseReport
      (ReportID, RepName, RepDesc, Active, type_)
      VALUES
      (@ID, @repName, <xsl:choose>
        <xsl:when test="@Desc">
          '<xsl:value-of select="@Desc"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>, <xsl:choose>
        <xsl:when test="@Active">
          '<xsl:value-of select="@Active"/>'
        </xsl:when>
        <xsl:otherwise>1</xsl:otherwise>
      </xsl:choose>, @type)

      SELECT @ExistID = ReportID FROM VCLib.T_Report WHERE ReportID = @ID
      IF @ExistID IS NOT NULL

      UPDATE VCLib.T_Report SET
      ForcedFetchAttrs = <xsl:choose>
        <xsl:when test="string(ForcedFetchAttrs)">
          '<xsl:value-of select="ForcedFetchAttrs"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      FilterValue = <xsl:choose>
        <xsl:when test="string(FilterValue)">
          '<xsl:value-of select="FilterValue"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      ReportFormType = @repFormTypeTable,
      ReportLoadDataType = @repLoadDataType,
      EntityID = @entID,
      Sorting = <xsl:choose>
        <xsl:when test="string(Sorting)">
          '<xsl:value-of select="Sorting"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      Descending = <xsl:choose>
        <xsl:when test="string(Descending)">
          '<xsl:value-of select="Descending"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      ScriptName = <xsl:choose>
        <xsl:when test="string(ScriptName)">
          '<xsl:value-of select="ScriptName"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      WHERE ReportID = @ExistID

      ELSE

      INSERT INTO VCLib.T_Report
      (ReportID,ForcedFetchAttrs,FilterValue,ReportFormType,ReportLoadDataType,EntityID,Sorting,Descending,ScriptName)
      VALUES
      (@ID, <xsl:choose>
        <xsl:when test="string(ForcedFetchAttrs)">
          '<xsl:value-of select="ForcedFetchAttrs"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>, <xsl:choose>
        <xsl:when test="string(FilterValue)">
          '<xsl:value-of select="FilterValue"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>, @repFormTypeTable, @repLoadDataType, @entID,<xsl:choose>
        <xsl:when test="string(Sorting)">
          '<xsl:value-of select="Sorting"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>, <xsl:choose>
        <xsl:when test="string(Descending)">
          '<xsl:value-of select="Descending"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>, <xsl:choose>
        <xsl:when test="string(ScriptName)">
          '<xsl:value-of select="ScriptName"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>)

      --ReportFileGroup
      <xsl:for-each select="ReportFileGroup">
        SET @groupID = newid();

        SELECT @ExistID = GroupID FROM VCLib.T_ReportFileGroup WHERE ReportID = @ID AND Name = <xsl:choose>
          <xsl:when test="@Name">
            '<xsl:value-of select="@Name"/>'
          </xsl:when>
          <xsl:otherwise>@repName</xsl:otherwise>
        </xsl:choose>
        IF @ExistID IS NOT NULL

        UPDATE VCLib.T_ReportFileGroup SET
        IsDefault = <xsl:choose>
          <xsl:when test="@IsDefault">
            '<xsl:value-of select="@IsDefault"/>'
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>
        WHERE GroupID = @ExistID

        ELSE

        INSERT INTO VCLib.T_ReportFileGroup(GroupID,ReportID,Name,IsDefault)
        VALUES (@groupID, @ID, <xsl:choose>
          <xsl:when test="@Name">
            '<xsl:value-of select="@Name"/>'
          </xsl:when>
          <xsl:otherwise>@repName</xsl:otherwise>
        </xsl:choose>, <xsl:choose>
          <xsl:when test="@IsDefault">
            '<xsl:value-of select="@IsDefault"/>'
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>)

        --Files
        <xsl:for-each select="File">
          UPDATE VCLib.T_FILES SET
          type_ = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName='ReportFile')
          WHERE FileID = '<xsl:value-of select="@ID"/>'

          SELECT @repFormatType = RepFmtID FROM VCLib.T_ReportFileFormat
          WHERE Name = '<xsl:value-of select="@Format"/>'

          SELECT @ExistID = FileID FROM VCLib.T_ReportFile WHERE FileID = '<xsl:value-of select="@ID"/>'
          IF @ExistID IS NOT NULL

          UPDATE VCLib.T_ReportFile SET
          RepFmtID = @repFormatType,
          IsSecondary = <xsl:choose>
            <xsl:when test="@IsSecondary">
              '<xsl:value-of select="@IsSecondary"/>'
            </xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
          </xsl:choose>
          WHERE FileID = @ExistID

          ELSE

          INSERT INTO VCLib.T_ReportFile
          (FileID, GroupID, RepFmtID, IsSecondary) VALUES
          ('<xsl:value-of select="@ID"/>', @groupID, @repFormatType, <xsl:choose>
            <xsl:when test="@IsSecondary">
              '<xsl:value-of select="@IsSecondary"/>'
            </xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
          </xsl:choose>)

          --Parameters
          <xsl:for-each select="Parameter">
            SET @tempID = newid();

            SELECT @ExistID = ParamID FROM VCLib.T_ReportFileParameter WHERE FileID = '<xsl:value-of select="@ID"/>' AND Name = '<xsl:value-of select="@Name"/>'
            IF @ExistID IS NOT NULL

            UPDATE VCLib.T_ReportFileParameter SET
            Content = '<xsl:value-of select="."/>'
            WHERE ParamID = @ExistID

            ELSE

            INSERT INTO VCLib.T_ReportFileParameter(ParamID,FileID,Name,Content)
            VALUES (@tempID, '<xsl:value-of select="@ID"/>', '<xsl:value-of select="@Name"/>', '<xsl:value-of select="."/>')
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
      END
      GO
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="root/kbks/kbk">
    -- KBK
    DECLARE @id uniqueidentifier

    SELECT @id = ID FROM T_KBK WHERE Code = '<xsl:value-of select="@Code" />'
    IF @id IS NOT NULL

    UPDATE T_KBK SET
    Name = '<xsl:value-of select="@Name" />'
    WHERE ID = @id

    ELSE

    INSERT INTO T_KBK
    (ID, Code, Name)
    VALUES
    (newid(),
    '<xsl:value-of select="@Code" />',
    '<xsl:value-of select="@Name" />')
    GO
  </xsl:template>

  <xsl:template match="root/kbks/childlist/kbk">
    -- KBK childs
    declare @parentid uniqueidentifier
    declare @id uniqueidentifier
    select @parentid = id from t_kbk where code = '<xsl:value-of select="ancestor::childlist/@ParentCode" />'

    SELECT @id = ID FROM T_KBK WHERE ParentID = @parentid AND Code = '<xsl:value-of select="@Code" />'
    IF @id IS NOT NULL

    UPDATE T_KBK SET
    Name = '<xsl:value-of select="@Name" />',
    ParentID = @parentid
    WHERE ID = @id

    ELSE

    INSERT INTO T_KBK
    (ID, Code, Name, ParentID)
    VALUES
    (    newid(),
    '<xsl:value-of select="@Code" />',
    '<xsl:value-of select="@Name" />',
    @parentid
    )
    GO
  </xsl:template>

  <xsl:template match="root/sqllist/sql">
    <xsl:value-of select="@Code" />
    GO
  </xsl:template>

  <!-- GENERIC REPORTS -->
  <xsl:template match="StaticGroups">
    IF EXISTS (select 0 from VCLib.T_STATIC_GROUPS where StaticGroupsID = '<xsl:value-of select="StaticGroupsID"/>')
    UPDATE VCLib.T_STATIC_GROUPS SET
    GrStaticGroupGenerator = <xsl:choose>
      <xsl:when test="GeneratorID">
        '<xsl:value-of select="GeneratorID"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>,
    Condition = <xsl:choose>
      <xsl:when test="Condition">
        '<xsl:value-of select="Condition"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>, Name = '<xsl:value-of select="Name"/>', OrderNum = '<xsl:value-of select="OrderNum"/>',
    ParentGroup = <xsl:choose>
      <xsl:when test="ParentGroup">
        '<xsl:value-of select="ParentGroup"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>
    WHERE StaticGroupsID = '<xsl:value-of select="StaticGroupsID"/>'
    ELSE INSERT INTO VCLib.T_STATIC_GROUPS (StaticGroupsID, GrStaticGroupGenerator, Condition, Name, OrderNum, ParentGroup)
    VALUES ('<xsl:value-of select="StaticGroupsID"/>',
    <xsl:choose>
      <xsl:when test="GeneratorID">
        '<xsl:value-of select="GeneratorID"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>,
    <xsl:choose>
      <xsl:when test="Condition">
        '<xsl:value-of select="Condition"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>,
    '<xsl:value-of select="Name"/>',
    <xsl:value-of select="OrderNum"/>,
    <xsl:choose>
      <xsl:when test="ParentGroup">
        '<xsl:value-of select="ParentGroup"/>'
      </xsl:when>
      <xsl:otherwise>NULL</xsl:otherwise>
    </xsl:choose>)

    <xsl:apply-templates select="StaticGroups" />

  </xsl:template>

  <xsl:template match="root/GenericReports">
    -- GenericReportGenerators
    <xsl:for-each select="GenericReportGeneratorStaticGroups">
      DECLARE
      @generatorID uniqueidentifier,
      @genName varchar(255),
      @entID int,
      @generatorType int

      BEGIN
      SET @generatorID = '<xsl:value-of select="ID"/>'
      SET @genName = '<xsl:value-of select="Name"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="Entity"/>'
      SELECT @generatorType = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='GR_STATIC_GROUP_GENERATOR'

      IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_GENERATOR where GenericReportGeneratorID = @generatorID)
      UPDATE VCLib.T_GENERIC_REPORT_GENERATOR SET Name = @genName, Entities = @entID, type_ = @generatorType
      WHERE GenericReportGeneratorID = @generatorID
      ELSE INSERT INTO VCLib.T_GENERIC_REPORT_GENERATOR (GenericReportGeneratorID, Name, Entities, type_)
      VALUES (@generatorID, @genName, @entID, @generatorType)

      <xsl:apply-templates select="StaticGroups" />

      END
      GO
    </xsl:for-each>

    <xsl:for-each select="GenericReportGeneratorGroupByPath">
      DECLARE
      @generatorID uniqueidentifier,
      @genName varchar(255),
      @entID int,
      @generatorType int

      BEGIN
      SET @generatorID = '<xsl:value-of select="ID"/>'
      SET @genName = '<xsl:value-of select="Name"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="Entity"/>'
      SELECT @generatorType = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='GR_GROP_BY_PATH_GENERATOR'

      IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_GENERATOR where GenericReportGeneratorID = @generatorID)
      UPDATE VCLib.T_GENERIC_REPORT_GENERATOR SET Name = @genName, Entities = @entID, type_ = @generatorType
      WHERE GenericReportGeneratorID = @generatorID
      ELSE INSERT INTO VCLib.T_GENERIC_REPORT_GENERATOR (GenericReportGeneratorID, Name, Entities, type_)
      VALUES (@generatorID, @genName, @entID, @generatorType)

      <xsl:for-each select="Groupbys">
        IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_GROUPBY where GenericReportGroupbyID = '<xsl:value-of select="GenericReportGroupbyID"/>')
        UPDATE VCLib.T_GENERIC_REPORT_GROUPBY SET OrderBy = '<xsl:value-of select="OrderBy"/>', OrderNum = '<xsl:value-of select="OrderNum"/>',
        GrGropByPathGenerator = @generatorID, GroupByPaths = '<xsl:value-of select="GroupByPaths"/>',
        DisplayFormat = '<xsl:value-of select="DisplayFormat"/>'
        WHERE GenericReportGroupbyID = '<xsl:value-of select="GenericReportGroupbyID"/>'
        ELSE INSERT INTO VCLib.T_GENERIC_REPORT_GROUPBY (GenericReportGroupbyID, OrderBy, OrderNum, GrGropByPathGenerator, GroupByPaths, DisplayFormat)
        VALUES ('<xsl:value-of select="GenericReportGroupbyID"/>',
        '<xsl:value-of select="OrderBy"/>',
        '<xsl:value-of select="OrderNum"/>',
        @generatorID,
        '<xsl:value-of select="GroupByPaths"/>',
        '<xsl:value-of select="DisplayFormat"/>')
      </xsl:for-each>

      END
      GO
    </xsl:for-each>

    <xsl:for-each select="GenericReportGeneratorCode">
      DECLARE
      @generatorID uniqueidentifier,
      @genName varchar(255),
      @entID int,
      @generatorType int

      BEGIN
      SET @generatorID = '<xsl:value-of select="ID"/>'
      SET @genName = '<xsl:value-of select="Name"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="Entity"/>'
      SELECT @generatorType = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='GR_CODE_GENERATOR'

      IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_GENERATOR where GenericReportGeneratorID = @generatorID)
      UPDATE VCLib.T_GENERIC_REPORT_GENERATOR SET Name = @genName, Entities = @entID, type_ = @generatorType
      WHERE GenericReportGeneratorID = @generatorID
      ELSE INSERT INTO VCLib.T_GENERIC_REPORT_GENERATOR (GenericReportGeneratorID, Name, Entities, type_)
      VALUES (@generatorID, @genName, @entID, @generatorType)

      IF EXISTS (select 0 from T_GR_CODE_GENERATOR where GenericReportGeneratorID = @generatorID)
      UPDATE T_GR_CODE_GENERATOR SET NetClass = '<xsl:value-of select="NetClass"/>'
      WHERE GenericReportGeneratorID = @generatorID
      ELSE INSERT INTO T_GR_CODE_GENERATOR (GenericReportGeneratorID, NetClass)
      VALUES (@generatorID, '<xsl:value-of select="NetClass"/>')

      END
      GO
    </xsl:for-each>

    <xsl:for-each select="GrResolver">
      DECLARE
      @ID uniqueidentifier,
      @resolverName varchar(255),
      @entID int,
      @columnDescription varchar(64)

      BEGIN
      SET @ID = '<xsl:value-of select="ID"/>'
      SET @resolverName = '<xsl:value-of select="Name"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="Entity"/>'

      IF EXISTS (select 0 from T_GR_RESOLVER where GrResolverID = @ID)
      UPDATE T_GR_RESOLVER SET Entities = @entID, Name = @resolverName
      WHERE GrResolverID = @ID
      ELSE INSERT INTO T_GR_RESOLVER (GrResolverID, Name, Entities) VALUES (@ID, @resolverName, @entID)

      <xsl:for-each select="Column">
        SET @columnDescription = <xsl:choose>
          <xsl:when test="Description">
            '<xsl:value-of select="Description"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
        IF EXISTS (select 0 from T_GENERIC_REPORT_COLUMN where GenericReportColumnID = '<xsl:value-of select="GenericReportColumnID"/>')
        UPDATE T_GENERIC_REPORT_COLUMN SET Description = @columnDescription, Condition = <xsl:choose>
          <xsl:when test="Condition">
            '<xsl:value-of select="Condition"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>,
        Name = '<xsl:value-of select="Name"/>',
        GrResolver = @ID, Calculated = <xsl:value-of select="Calculated"/>,
        LexemFormula = <xsl:choose>
          <xsl:when test="LexemFormula">
            '<xsl:value-of select="LexemFormula"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
        WHERE GenericReportColumnID = '<xsl:value-of select="GenericReportColumnID"/>'
        ELSE INSERT T_GENERIC_REPORT_COLUMN (GenericReportColumnID, Description, Condition, Name, GrResolver, Calculated, LexemFormula)
        VALUES ('<xsl:value-of select="GenericReportColumnID"/>',
        @columnDescription, <xsl:choose>
          <xsl:when test="Condition">
            '<xsl:value-of select="Condition"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>,
        '<xsl:value-of select="Name"/>', @ID,
        <xsl:value-of select="Calculated"/>,
        <xsl:choose>
          <xsl:when test="LexemFormula">
            '<xsl:value-of select="LexemFormula"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose>
        )
      </xsl:for-each>

      END
      GO
    </xsl:for-each>

    <xsl:for-each select="GenericReport">
      DECLARE @entID int,
      @ID uniqueidentifier,
      @generatorPath varchar(512),
      @columnsPath varchar(512),
      @roleID uniqueidentifier,
      @fileFrmID uniqueidentifier

      BEGIN
      SET @ID = '<xsl:value-of select="ID"/>'
      SELECT @entID = EntityID FROM VCLib.T_ENTITIES
      WHERE EntName='<xsl:value-of select="Entity"/>'
      SET @generatorPath = <xsl:choose>
        <xsl:when test="GeneratorPath">
          '<xsl:value-of select="GeneratorPath"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      SET @columnsPath = <xsl:choose>
        <xsl:when test="ColumnsPath">
          '<xsl:value-of select="ColumnsPath"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>

      IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT where GenericReportID = @ID)
      UPDATE VCLib.T_GENERIC_REPORT SET Name = '<xsl:value-of select="Name"/>',
      Entities = @entID,
      GenericReportGenerator = '<xsl:value-of select="Generator"/>',
      UseCustomGenerator = '<xsl:value-of select="UseCustomGenerator"/>',
      GrResolver = '<xsl:value-of select="GrResolver"/>',
      Filter = <xsl:choose>
        <xsl:when test="Filter">
          '<xsl:value-of select="Filter"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      GeneratorPath = @generatorPath, ColumnsPath = @columnsPath
      WHERE GenericReportID = @ID
      ELSE INSERT INTO VCLib.T_GENERIC_REPORT (GenericReportID, Entities, GenericReportGenerator,
      Filter, Name, GeneratorPath, UseCustomGenerator, GrResolver, ColumnsPath)
      VALUES (@ID, @entID,
      '<xsl:value-of select="Generator"/>',
      <xsl:choose>
        <xsl:when test="Filter">
          '<xsl:value-of select="Filter"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>,
      '<xsl:value-of select="Name"/>',
      @generatorPath,
      <xsl:value-of select="UseCustomGenerator"/>,
      '<xsl:value-of select="GrResolver"/>',
      @columnsPath)

      <xsl:for-each select="GeneratorParam">
        IF EXISTS (select 0 from VCLib.T_GENERATOR_PARAMS where GeneratorParamsID = '<xsl:value-of select="ID"/>')
        UPDATE VCLib.T_GENERATOR_PARAMS SET GenericReport = @ID,
        Name = '<xsl:value-of select="Name"/>',
        Value = '<xsl:value-of select="Value"/>',
        MakeUser = <xsl:value-of select="MakeUser"/>
        WHERE GeneratorParamsID = '<xsl:value-of select="ID"/>'
        ELSE INSERT VCLib.T_GENERATOR_PARAMS (GeneratorParamsID, Name, Value, GenericReport, MakeUser)
        VALUES ('<xsl:value-of select="ID"/>',
        '<xsl:value-of select="Name"/>',
        '<xsl:value-of select="Value"/>',
        @ID,
        <xsl:value-of select="MakeUser"/>)
      </xsl:for-each>

      <xsl:for-each select="GrRight">
        SELECT @roleID = RoleID from VCLib.T_ROLES WHERE RoleName = '<xsl:value-of select="Roles"/>'
        IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_RIGHTS where GenericReportRightsID = '<xsl:value-of select="ID"/>')
        UPDATE VCLib.T_GENERIC_REPORT_RIGHTS SET GenericReport = @ID,
        Roles = @roleID,
        ReportRights = '<xsl:value-of select="ReportRights"/>'
        WHERE GenericReportRightsID = '<xsl:value-of select="ID"/>'
        ELSE INSERT VCLib.T_GENERIC_REPORT_RIGHTS (GenericReportRightsID, GenericReport, Roles, ReportRights)
        VALUES ('<xsl:value-of select="ID"/>', @ID, @roleID,
        <xsl:value-of select="ReportRights"/>)
      </xsl:for-each>

      <xsl:for-each select="GenericReportTemplate">
        UPDATE VCLib.T_FILES SET
        type_ = (SELECT EntityID FROM VCLib.T_ENTITIES WHERE EntName='GENERIC_REPORT_TEMPLATE')
        WHERE FileID = '<xsl:value-of select="FileID"/>'

        SELECT @fileFrmID = RepFmtID from VCLib.T_ReportFileFormat WHERE Name = '<xsl:value-of select="ReportFileFormat"/>'

        IF EXISTS (select 0 from VCLib.T_GENERIC_REPORT_TEMPLATE where FileID = '<xsl:value-of select="FileID"/>')
        UPDATE VCLib.T_GENERIC_REPORT_TEMPLATE SET GenericReport = @ID,
        ReportFileFormat = @fileFrmID
        WHERE FileID = '<xsl:value-of select="FileID"/>'
        ELSE INSERT VCLib.T_GENERIC_REPORT_TEMPLATE (ReportFileFormat, GenericReport, FileID)
        VALUES (@fileFrmID, @ID, '<xsl:value-of select="FileID"/>')
      </xsl:for-each>

      END
      GO
    </xsl:for-each>
  </xsl:template>

  <!-- Reports.config -->
  <xsl:template match="Root/Reports/Report/Templates/Template">
    <xsl:variable name="tPath"
					  select="Files[1]/File[1]/@path" />

    <xsl:for-each select="Files/File">
      <xsl:if test="@path=$tPath" >
        <xsl:call-template name="ReportConfigFileTemplate" />
      </xsl:if>
      <xsl:if test="@path!=$tPath" >
        <xsl:call-template name="TemplateOverrideFileTemplate" />
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
  <xsl:template name="ReportConfigFileTemplate" >
    declare @fileFormat varchar(255)
    ,@formatID uniqueidentifier
    select @fileFormat = '<xsl:value-of select="../../../../@format"/>'
    select @fileFormat = SUBSTRING(@fileFormat, CHARINDEX('.', @fileFormat, CHARINDEX('.', @fileFormat, 0) + 1) + 1, CHARINDEX(',', @fileFormat, 0) - CHARINDEX('.', @fileFormat, CHARINDEX('.', @fileFormat, 0) + 1) - 1)

    select @formatID = rff.RepFmtID
    from VCLib.T_ReportFileFormat rff
    where rff.HandlerName like '%' + @fileFormat + '%'

    update rc
    set rc.[TemplatePath] = '<xsl:value-of select="@path"/>'
    ,rc.[FileName] = '<xsl:value-of select="@name"/>'
    ,rc.[OutputName] = '<xsl:value-of select="@outputName"/>'
    ,rc.[ReportFileFormat] = @formatID
    ,rc.[ReportProcessingWay] = case
    when '<xsl:value-of select="@EnableAspose"/>' = 'false' then 1
    when '<xsl:value-of select="@EnableAspose"/>' = 'true' then 2
    when '<xsl:value-of select="@ExcelFormat"/>' = 'MsOle' then 1
    when '<xsl:value-of select="@ExcelFormat"/>' = 'Fast' then 2
    else 0
    end
    ,rc.[OutputFormat] = case
    when '<xsl:value-of select="@OutputFormat"/>' = 'Pdf' then 1
    when '<xsl:value-of select="@OutputFormat"/>' = 'Html' then 2
    else 0
    end
    ,rc.[Encoding] = '<xsl:value-of select="Encoding"/>'
    from [VCLib].[T_REPORTS_CONFIG] rc
    where rc.[TemplateName] = '<xsl:value-of select="../../@name"/>'

    INSERT INTO [VCLib].[T_REPORTS_CONFIG] ([TemplateName], [TemplatePath], [FileName], [OutputName], [ReportFileFormat], [ReportProcessingWay], [OutputFormat], [Encoding])
    SELECT
    '<xsl:value-of select="../../@name"/>'
    ,'<xsl:value-of select="@path"/>'
    ,'<xsl:value-of select="@name"/>'
    ,'<xsl:value-of select="@outputName"/>'
    ,@formatID
    ,case
    when '<xsl:value-of select="@EnableAspose"/>' = 'false' then 1
    when '<xsl:value-of select="@EnableAspose"/>' = 'true' then 2
    when '<xsl:value-of select="@ExcelFormat"/>' = 'MsOle' then 1
    when '<xsl:value-of select="@ExcelFormat"/>' = 'Fast' then 2
    else 0
    end
    ,case
    when '<xsl:value-of select="@OutputFormat"/>' = 'Pdf' then 1
    when '<xsl:value-of select="@OutputFormat"/>' = 'Html' then 2
    else 0
    end
    ,'<xsl:value-of select="Encoding"/>'
    where not exists
    (
    select *
    from [VCLib].[T_REPORTS_CONFIG] rc
    where rc.[TemplateName] = '<xsl:value-of select="../../@name"/>'
    )
    GO
  </xsl:template>
  <xsl:template name="TemplateOverrideFileTemplate" >
    declare @fileFormat varchar(255)
    ,@formatID uniqueidentifier
    select @fileFormat = '<xsl:value-of select="../../../../@format"/>'
    select @fileFormat = SUBSTRING(@fileFormat, CHARINDEX('.', @fileFormat, CHARINDEX('.', @fileFormat, 0) + 1) + 1, CHARINDEX(',', @fileFormat, 0) - CHARINDEX('.', @fileFormat, CHARINDEX('.', @fileFormat, 0) + 1) - 1)

    select @formatID = rff.RepFmtID
    from VCLib.T_ReportFileFormat rff
    where rff.HandlerName like '%' + @fileFormat + '%'

    update tmo
    set tmo.[TemplatePath] = '<xsl:value-of select="@path"/>'
    ,tmo.[Printer] = '<xsl:value-of select="@printer"/>'
    ,tmo.OverrideOrder = ISNULL((select MAX(OverrideOrder) from [VCLib].[T_TEMPLATE_OVERRIDE] where ReportsConfig = '<xsl:value-of select="../../@name"/>'), -1) + 1
    ,tmo.[FileName] = '<xsl:value-of select="@name"/>'
    ,tmo.[OutputName] = '<xsl:value-of select="@outputName"/>'
    ,tmo.[ReportFileFormat] = @formatID
    ,tmo.[ReportProcessingWay] = case
    when '<xsl:value-of select="@EnableAspose"/>' = 'false' then 1
    when '<xsl:value-of select="@EnableAspose"/>' = 'true' then 2
    when '<xsl:value-of select="@ExcelFormat"/>' = 'MsOle' then 1
    when '<xsl:value-of select="@ExcelFormat"/>' = 'Fast' then 2
    else 0
    end
    ,tmo.[OutputFormat] = case
    when '<xsl:value-of select="@OutputFormat"/>' = 'Pdf' then 1
    when '<xsl:value-of select="@OutputFormat"/>' = 'Html' then 2
    else 0
    end
    ,tmo.[Encoding] = '<xsl:value-of select="Encoding"/>'
    from [VCLib].[T_TEMPLATE_OVERRIDE] tmo
    where tmo.[TemplatePath] = '<xsl:value-of select="@path"/>'
    and
    tmo.UsersGroup is null

    INSERT INTO [VCLib].[T_TEMPLATE_OVERRIDE] ([TemplateOverrideID], [TemplatePath], [Printer], [OverrideOrder], [FileName], [OutputName], [ReportsConfig], [ReportFileFormat], [ReportProcessingWay], [ConfigType], [OutputFormat], [Encoding])
    SELECT
    NEWID()
    ,'<xsl:value-of select="@path"/>'
    ,'<xsl:value-of select="@printer"/>'
    ,ISNULL((select MAX(OverrideOrder) from [VCLib].[T_TEMPLATE_OVERRIDE] where ReportsConfig = '<xsl:value-of select="../../@name"/>'), -1) + 1
    ,'<xsl:value-of select="@name"/>'
    ,'<xsl:value-of select="@outputName"/>'
    ,'<xsl:value-of select="../../@name"/>'
    ,@formatID
    ,case
    when '<xsl:value-of select="@EnableAspose"/>' = 'false' then 1
    when '<xsl:value-of select="@EnableAspose"/>' = 'true' then 2
    when '<xsl:value-of select="@ExcelFormat"/>' = 'MsOle' then 1
    when '<xsl:value-of select="@ExcelFormat"/>' = 'Fast' then 2
    else 0
    end
    ,1
    ,case
    when '<xsl:value-of select="@OutputFormat"/>' = 'Pdf' then 1
    when '<xsl:value-of select="@OutputFormat"/>' = 'Html' then 2
    else 0
    end
    ,'<xsl:value-of select="Encoding"/>'
    where not exists
    (
    select *
    from [VCLib].[T_TEMPLATE_OVERRIDE] tmo
    where tmo.[TemplatePath] = '<xsl:value-of select="@path"/>'
    and
    tmo.UsersGroup is null
    )
    GO
  </xsl:template>

  <xsl:template match="RefreshEntities">
    exec sp_UpdateEntities
    GO
  </xsl:template>

  <xsl:template match="StartupProcesses/StartupProcess">
    <xsl:text>INSERT INTO [VCLib].[T_STARTUP_PROCESS] (StartupProcessID, ProcessName, ProcessParameters)&#10;VALUES(newid(), '</xsl:text>
    <xsl:value-of select="@ProcessName"/>
    <xsl:text>', </xsl:text>
    <xsl:choose>
      <xsl:when test="ProcessParameters/ProcessParameter">
        <xsl:text>'<![CDATA[<ProcessParameters>]]></xsl:text>
        <xsl:apply-templates select="ProcessParameters/ProcessParameter"/>
        <xsl:text><![CDATA[</ProcessParameters>]]>'</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>NULL</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>)&#10;&#10;</xsl:text>
  </xsl:template>

  <xsl:template match="ProcessParameter">
    <xsl:text><![CDATA[<ProcessParameter Name="]]></xsl:text>
    <xsl:value-of select="@Name"/>
    <xsl:text><![CDATA["><Value>]]></xsl:text>
    <xsl:value-of select="normalize-space(.)"/>
    <xsl:text><![CDATA[</Value></ProcessParameter>]]></xsl:text>
  </xsl:template>

  <xsl:template name="serializeNodeToString">
    <xsl:param name="node" />
    <xsl:variable name="name"
					  select="name($node)" />

    <xsl:text>&lt;</xsl:text>
    <xsl:value-of select="$name" />
    <xsl:for-each select="$node/@*">
      <xsl:text> </xsl:text>
      <xsl:value-of select="name()" />
      <xsl:text>=&quot;</xsl:text>
      <xsl:call-template name ="replaceSpecCharacters">
        <xsl:with-param name="text"
								select="."/>
      </xsl:call-template>
      <xsl:text>&quot;</xsl:text>
    </xsl:for-each>
    <xsl:if test="namespace-uri($node)">
      <xsl:text> xmlns:</xsl:text>
      <xsl:value-of select="substring-before(name($node),':')"/>
      <xsl:text>="</xsl:text>
      <xsl:value-of select="namespace-uri($node)"/>
      <xsl:text>"</xsl:text>
    </xsl:if>
    <xsl:text>&gt;</xsl:text>
    <xsl:if test="$node/text()">
      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
      <xsl:value-of select="$node/text()" />
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </xsl:if>
    <xsl:for-each select="$node/*">
      <xsl:call-template name="serializeNodeToString">
        <xsl:with-param name="node"
								select="."/>
      </xsl:call-template>
    </xsl:for-each>

    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="$name" />
    <xsl:text>&gt;</xsl:text>
  </xsl:template>

  <xsl:template name="replaceApostrs">
    <xsl:param name="text" />
    <xsl:variable name="apos">'</xsl:variable>
    <xsl:variable name="apos2">''</xsl:variable>

    <xsl:call-template name ="replace">
      <xsl:with-param name="text"
							select="$text"/>
      <xsl:with-param name="replace"
							select="$apos"/>
      <xsl:with-param name="by"
							select="$apos2"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="replaceSpecCharacters">
    <xsl:param name="text" />

    <xsl:call-template name ="replace">
      <xsl:with-param name="text">
        <xsl:call-template name ="replace">
          <xsl:with-param name="text">
            <xsl:call-template name ="replace">
              <xsl:with-param name="text">
                <xsl:call-template name ="replace">
                  <xsl:with-param name="text">
                    <xsl:call-template name ="replace">
                      <xsl:with-param name="text"
															select="$text"/>
                      <xsl:with-param name="replace">&amp;</xsl:with-param>
                      <xsl:with-param name="by">&amp;amp;</xsl:with-param>
                    </xsl:call-template>
                  </xsl:with-param>
                  <xsl:with-param name="replace">&lt;</xsl:with-param>
                  <xsl:with-param name="by">&amp;lt;</xsl:with-param>
                </xsl:call-template>
              </xsl:with-param>
              <xsl:with-param name="replace">&gt;</xsl:with-param>
              <xsl:with-param name="by">&amp;gt;</xsl:with-param>
            </xsl:call-template>
          </xsl:with-param>
          <xsl:with-param name="replace">&apos;</xsl:with-param>
          <xsl:with-param name="by">&amp;apos;</xsl:with-param>
        </xsl:call-template>
      </xsl:with-param>
      <xsl:with-param name="replace">&quot;</xsl:with-param>
      <xsl:with-param name="by">&amp;quot;</xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name ="replace">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="by"/>
    <xsl:choose>
      <xsl:when test="contains($text, $replace)">
        <xsl:value-of select="substring-before($text,$replace)" />
        <xsl:value-of select="$by" />
        <xsl:call-template name="replace">
          <xsl:with-param name="text"
									select="substring-after($text,$replace)" />
          <xsl:with-param name ="replace"
									select="$replace"/>
          <xsl:with-param name ="by"
									select="$by"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!--Загрузка web приложений-->
  <xsl:template match="webapp/*">
    INSERT INTO [VCLib].[T_WEB_APP]
    ([WebAppID]
    ,[Name]
    ,[HostedAddress]
    ,[IsActive]
    ,[IsSwaggerActive]
    ,[AnonymousAccessUser])
    SELECT
    NEWID()--WebAppID, uniqueidentifier,>
    ,'<xsl:value-of select ="name(.)"/>'--Name, varchar(255),>
    ,'<xsl:value-of select ="@hosted"/>'--HostedAddress, varchar(255),>
    ,<xsl:choose>
      <xsl:when test="@active!=''">
        <xsl:value-of select="@active" />
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>--IsActive, bit,>)
    ,0
    ,<xsl:choose>
      <xsl:when test="@login!=''">
        (
        select top 1 u.UserID
        from VCLib.T_USERS u
        where exists
        (
        select *
        from VCLib.T_LOGIN l
        where l.[Identity] = u.[Identity]
        and
        l.[Login] = '<xsl:value-of select="@login" />'
        ) )
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>--AnonymousAccessUser, uniqueidentifier,>)
    where not exists
    (
    select *
    from [VCLib].[T_WEB_APP] wa
    where wa.Name = '<xsl:value-of select ="name(.)"/>'
    )
    GO

    <xsl:for-each select="DTOs[(headers)]">
      <xsl:call-template name="loadAppDtos" />
    </xsl:for-each>

    <xsl:for-each select="webAliases[(alias)]">
      <xsl:call-template name="loadAppAliases" />
    </xsl:for-each>

  </xsl:template>

  <!--Загрузка шаблонов DTO-->
  <xsl:template match="root/DTOs[(headers)]"
				  name="loadAppDtos">
    declare  @entity varchar(133)
    ,@alias varchar(100)
    ,@descr varchar(255)
    ,@system bit
    ,@type int
    ,@dtoId uniqueidentifier
    ,@dtoViewId uniqueidentifier
    ,@app varchar(255)

    <xsl:for-each select="headers/model[@Recreate='1']">
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      <xsl:call-template name="DropDTO" />
    </xsl:for-each>

    <xsl:for-each select="headers/model">
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      INSERT INTO [VCLib].[T_DTO_MODEL]
      ([DtoModelID] ,[Entities] ,[Name] ,[Descr] ,[MaxNestingLevel] ,[IsSystem] ,[WebApp])
      SELECT
      NEWID()--DtoModelID, uniqueidentifier,
      ,e.EntityID--Entities, int,
      ,@alias--Name, nvarchar(100),
      ,@descr--Descr, nvarchar(255),
      ,<xsl:value-of select="@nesting" />--MaxNestingLevel, int,
      ,@system--IsSystem, bit,
      ,(select a.WebAppID from VCLib.T_WEB_APP a where a.Name = @app)
      from VCLib.T_ENTITIES e
      where not exists(select * from VCLib.T_DTO_MODEL m where m.DtoModelID = @dtoId)
      and
      e.[Schema] + '.' + e.EntName = @entity
    </xsl:for-each>

    <xsl:for-each select="headers/model/items/item">
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      INSERT INTO [VCLib].[T_DTO_ITEM]
      ([DtoItemID] ,[Name] ,[ItemLexem] ,[EditValueLexem] ,[DataType] ,[Multiplicity] ,[DtoModel] ,[ItemDtoModel] ,[StringFormat] ,[IsInvariantCulture] ,[Postion] ,[PathsAttributes] ,[BindingType] ,[Descr] ,[InputValueLexem] ,[ChoiceData])
      SELECT
      NEWID()--DtoItemID, uniqueidentifier,
      ,'<xsl:value-of select="@itemName" />'--Name, nvarchar(255),
      ,'<xsl:call-template name="replaceApostrs">
        <xsl:with-param name="text" select="@lexem" />
      </xsl:call-template>'--ItemLexem, nvarchar(max),
      ,'<xsl:call-template name="replaceApostrs">
        <xsl:with-param name="text" select="@editLexem" />
      </xsl:call-template>'--EditValueLexem, nvarchar(max),
      ,@type--DataType, int,
      ,<xsl:value-of select="@multiplicity" />--Multiplicity, int,
      ,@dtoId--DtoModel, uniqueidentifier,
      ,(select m.DtoModelID
      from VCLib.T_DTO_MODEL m
      join VCLib.T_ENTITIES e on e.EntityID = m.Entities
      join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
      where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@itemEntity" />'
      and
      (m.Name is null and '<xsl:value-of select="@itemAlias" />' = '' or m.Name = '<xsl:value-of select="@itemAlias" />')
      and
      a.Name = @app)--ItemDtoModel, uniqueidentifier,
      ,'<xsl:call-template name="replaceApostrs">
        <xsl:with-param name="text"
								select="@format"/>
      </xsl:call-template>'--StringFormat, nvarchar(255),
      ,<xsl:value-of select="@invariant" />--IsInvariantCulture, bit,
      ,<xsl:value-of select="@position" />--Postion, int,
      ,'<xsl:value-of select="@pathAttributes" />'--PathsAttributes, nvarchar(max),
      ,<xsl:value-of select="@bindingType" />--BindingType, int,
      ,@descr--Descr, nvarchar(1000),
      ,'<xsl:value-of select="@inputLexem" />'--InputValueLexem, nvarchar(max),
      ,'<xsl:value-of select="@choiceData" />'--ChoiceData, varchar(2000),
      where exists(select * from VCLib.T_DTO_MODEL m where m.DtoModelID = @dtoId)
      and
      not exists(select * from VCLib.T_DTO_ITEM i where i.DtoModel = @dtoId and i.Name = '<xsl:value-of select="@itemName" />')
    </xsl:for-each>

    <xsl:for-each select="headers/model/filters/filter">
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      INSERT INTO VCLib.T_DTO_MODEL_FILTER
      (DtoModelFilterID ,DtoModel ,Name ,DtoItem ,CriterionType ,Condition)
      SELECT
      NEWID()--DtoModelFilterID, uniqueidentifier
      ,@dtoId--DtoModel, uniqueidentifier
      ,'<xsl:value-of select="@filterName" />'--Name, varchar(255)
      ,(
      select di.DtoItemID
      from VCLib.T_DTO_ITEM di
      where (di.Name is null and '<xsl:value-of select="@itemName" />' = '' or di.Name = '<xsl:value-of select="@itemName" />')
      and
      di.DtoModel = @dtoId
      )--DtoItem, uniqueidentifier
      ,<xsl:value-of select="@criterionType" />--CriterionType, int
      ,'<xsl:value-of select="@condition" />'--Condition, varchar(max))
      where not exists
      (
      select *
      from VCLib.T_DTO_MODEL_FILTER df
      where df.DtoModel = @dtoId
      and
      df.Name = '<xsl:value-of select="@filterName" />'
      )
    </xsl:for-each>

    <xsl:for-each select="headers/model/views/view">
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      select @dtoViewId = ISNULL((select v.DtoModelViewID
      from [VCLib].[T_DTO_MODEL_VIEW] v
      where v.DtoModel = @dtoId and <xsl:choose>
        <xsl:when test="@Context!=''">
          v.Context = '<xsl:value-of select="@Context" />'
        </xsl:when>
        <xsl:otherwise>v.Context is null</xsl:otherwise>
      </xsl:choose>), NEWID())
      INSERT INTO [VCLib].[T_DTO_MODEL_VIEW]
      ([DtoModelViewID] ,[Context] ,[DtoModel])
      SELECT
      @dtoViewId--DtoModelViewID, uniqueidentifier,
      ,<xsl:choose>
        <xsl:when test="@Context!=''">
          '<xsl:value-of select="@Context" />'
        </xsl:when>
        <xsl:otherwise>null</xsl:otherwise>
      </xsl:choose>--Context, varchar(255),
      ,@dtoId--DtoModel, uniqueidentifier,
      where not exists(select * from [VCLib].[T_DTO_MODEL_VIEW] v where v.DtoModelViewID = @dtoViewId)
      and
      exists(select * from VCLib.T_DTO_MODEL m where m.DtoModelID = @dtoId)
      <xsl:for-each select="columns/column" >
        INSERT INTO [VCLib].[T_DTO_MODEL_COLUMN]
        ([DtoModelColumnID] ,[DtoModelView] ,[ColPath] ,[EditPath] ,[ColDescr] ,[ColOrder] ,[IsVisible] ,[SortOrder] ,[SortDirection] ,[FormatType], [Aggregation])
        SELECT
        NEWID()--DtoModelColumnID, uniqueidentifier,
        ,@dtoViewId--DtoModelView, uniqueidentifier,
        ,'<xsl:value-of select="@ColPath" />'--ColPath, varchar(500),
        ,<xsl:choose>
          <xsl:when test="@EditPath!=''">
            '<xsl:value-of select="@EditPath" />'
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--EditPath, varchar(500),
        ,<xsl:choose>
          <xsl:when test="@ColDescr!=''">
            '<xsl:value-of select="@ColDescr" />'
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--ColDescr, varchar(1000),
        ,<xsl:value-of select="@ColOrder" />--ColOrder, int,
        ,<xsl:value-of select="@IsVisible" />--IsVisible, bit,
        ,<xsl:choose>
          <xsl:when test="@SortOrder!=''">
            <xsl:value-of select="@SortOrder" />
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--SortOrder, int,
        ,<xsl:choose>
          <xsl:when test="@SortDirection!=''">
            <xsl:value-of select="@SortDirection" />
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--SortDirection, int,
        ,<xsl:choose>
          <xsl:when test="@FormatType!=''">
            <xsl:value-of select="@FormatType" />
          </xsl:when>
          <xsl:otherwise>0</xsl:otherwise>
        </xsl:choose>--FormatType, int,
        ,<xsl:choose>
          <xsl:when test="@Aggregation!=''">
            <xsl:value-of select="@Aggregation" />
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--Aggregation, int,
        where not exists(select * from [VCLib].[T_DTO_MODEL_COLUMN] c where c.DtoModelView = @dtoViewId and c.ColPath = '<xsl:value-of select="@ColPath" />')
        and
        exists(select * from VCLib.T_DTO_MODEL m where m.DtoModelID = @dtoId)
      </xsl:for-each>
    </xsl:for-each>

  </xsl:template>
  <!--Генерация шаблонов DTO-->
  <xsl:template match="root/DTOs[(DTO)]">

    <xsl:for-each select="DTO[@Recreate='1']">
      declare  @entity varchar(133)
      ,@alias varchar(100)
      ,@descr varchar(255)
      ,@system bit
      ,@type int
      ,@dtoId uniqueidentifier
      ,@app varchar(255)
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      <xsl:call-template name="DropDTO" />
      GO
    </xsl:for-each>

    <xsl:for-each select="DTO">
      declare  @entity varchar(133)
      ,@alias varchar(100)
      ,@descr varchar(255)
      ,@system bit
      ,@type int
      ,@dtoId uniqueidentifier
      ,@app varchar(255)
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      <xsl:call-template name="DTO" />
      GO
    </xsl:for-each>

    update i
    set i.Postion = o.Position
    from VCLib.T_DTO_ITEM i
    join (
    select ROW_NUMBER() over (partition by i.DtoModel order by i.Postion, ae.depth desc, ea.AttributeId) Position, i.DtoItemID
    from VCLib.T_DTO_ITEM i
    join VCLib.T_DTO_MODEL m on m.DtoModelID = i.DtoModel
    join
    (
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,[IsAdditional] ,[EntitiesAttributesId] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from VCLib.T_ENTITIES_ATTRIBUTES
    union all
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,0 ,[EntityAttributesID] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from V_ENTITY_ATTRIBUTES
    ) ea on (ea.Name = i.Name or ea.IsPrimaryKey = 1 and i.Name =  'id')
    join
    ( select ae.BaseEntity, ae.EntityID, ae.depth from V_ENTITY_HIERARCHY ae) ae on ae.EntityID = m.Entities
    and
    ea.EntityID = ae.BaseEntity
    ) o on o.DtoItemID = i.DtoItemID
    GO

    <xsl:for-each select="DTO[@WithView='1']">
      declare  @entity varchar(133)
      ,@alias varchar(100)
      ,@descr varchar(255)
      ,@system bit
      ,@type int
      ,@dtoId uniqueidentifier
      ,@app varchar(255)
      <xsl:call-template name="FillDtoParams" />
      <xsl:call-template name="GetDtoId" />
      <xsl:call-template name="DtoModelView" />
      GO
    </xsl:for-each>

  </xsl:template>
  <!--Шаблон получения параметров для формирования DTO-->
  <xsl:template name="FillDtoParams">
    select   @entity = '<xsl:value-of select="@Entity"/>'
    ,@alias = <xsl:choose>
      <xsl:when test="@Name!=''">
        '<xsl:value-of select="@Name" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,@descr = <xsl:choose>
      <xsl:when test="@Descr!=''">
        '<xsl:value-of select="@Descr" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,@system = <xsl:choose>
      <xsl:when test="@IsSystem">
        '<xsl:value-of select="@IsSystem" />'
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
    ,@type = <xsl:choose>
      <xsl:when test="@type">
        '<xsl:value-of select="@type" />'
      </xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
    ,@app = <xsl:choose>
      <xsl:when test="@App">
        '<xsl:value-of select="@App" />'
      </xsl:when>
      <xsl:when test="../../@App">
        '<xsl:value-of select="../../@App" />'
      </xsl:when>
      <xsl:otherwise>'api'</xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!--Шаблон для получения идентификатора DTO-->
  <xsl:template name="GetDtoId">
    select @dtoId = ISNULL((select m.DtoModelID
    from VCLib.T_DTO_MODEL m
    join VCLib.T_ENTITIES e on e.EntityID = m.Entities
    join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
    where e.[Schema] + '.' + e.EntName = @entity
    and
    (m.Name is null and @alias is null or m.Name = @alias)
    and
    a.Name = @app), NEWID())
  </xsl:template>
  <!--Шаблон для удаления загруженных DTO-->
  <xsl:template name="DropDTO">
    delete mc
    from VCLib.T_DTO_MODEL_COLUMN mc
    join VCLib.T_DTO_MODEL_VIEW mv on mv.DtoModelViewID = mc.DtoModelView
    where mv.DtoModel = @dtoId

    delete mv
    from VCLib.T_DTO_MODEL_VIEW mv
    where mv.DtoModel = @dtoId

    delete mf
    from VCLib.T_DTO_MODEL_FILTER mf
    where mf.DtoModel = @dtoId

    update mi
    set mi.ItemDtoModel = null
    from VCLib.T_DTO_ITEM mi
    where mi.ItemDtoModel = @dtoId

    delete mi
    from VCLib.T_DTO_ITEM mi
    where mi.DtoModel = @dtoId
  </xsl:template>
  <!--Шаблон для генерации атрибутов в DTO-->
  <xsl:template name="DTO">
    update m
    set m.Descr = ISNULL(@descr, e.EntDesc),
    m.MaxNestingLevel = 2,
    m.IsSystem = @system
    from [VCLib].[T_DTO_MODEL] m
    join VCLib.T_ENTITIES e on e.EntityID = m.Entities
    join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
    where e.[Schema] + '.' + e.EntName = @entity
    and
    (m.Name is null and @alias is null or m.Name = @alias)
    and
    a.Name = @app

    INSERT INTO [VCLib].[T_DTO_MODEL]
    ([DtoModelID]
    ,[Entities]
    ,[Name]
    ,[Descr]
    ,[MaxNestingLevel]
    ,[IsSystem]
    ,[WebApp])
    SELECT
    @dtoId--DtoModelID, uniqueidentifier,
    ,(select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = @entity)--Entities, int,
    ,@alias--Name, varchar(100),
    ,ISNULL(@descr, (select top 1 e.EntDesc from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = @entity))--Descr, varchar(255),
    ,2
    ,@system
    ,(select a.WebAppID from VCLib.T_WEB_APP a where a.Name = @app)
    where not exists
    (
    select *
    from [VCLib].[T_DTO_MODEL] m
    join VCLib.T_ENTITIES e on e.EntityID = m.Entities
    join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
    where e.[Schema] + '.' + e.EntName = @entity
    and
    (m.Name is null and @alias is null or m.Name = @alias)
    and
    a.Name = @app
    )

    update i
    set
    i.ItemLexem = '&lt;lx:Path OwnerQueryLevel=&quot;0&quot; xmlns:lx=&quot;lexem&quot;&gt; &lt;lx:StepString name=&quot;' + ea.Name + '&quot; /&gt; &lt;/lx:Path&gt;',
    i.DataType = case
    when ea.AttributeType = 4 then 13
    when ea.SystemType = 'int' then 2
    when ea.SystemType in ('string', 'text') then 1
    when ea.SystemType = 'bigint' then 8
    when ea.SystemType = 'binary' then 9
    when ea.SystemType in ('date', 'datetime') then 6
    when ea.SystemType = 'float' then 5
    when ea.SystemType in ('boolean', 'bool') then 4
    when ea.SystemType = 'byte' then 10
    when ea.SystemType = 'GUID' then 3
    else 99
    end,
    i.Multiplicity = case
    when ea.AttributeType = 2 and ea.IsRequired = 1 then 3
    when ea.AttributeType = 2 and ea.IsRequired = 0 then 2
    when ea.IsRequired = 1 then 1
    else 0
    end,
    i.DtoModel = @dtoId,
    i.StringFormat = case
    when ea.DefaultFormat is null and ea.SystemType in ('date', 'datetime') then 'yyyy-MM-dd'
    else REPLACE(REPLACE(ea.DefaultFormat, '{0:', ''), '}', '')
    end,
    i.ItemDtoModel = (
    select top 1 m.DtoModelID
    from VCLib.T_DTO_MODEL m
    join V_ENTITY_HIERARCHY ae on m.Entities = ae.BaseEntity
    join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
    where (m.Name is null or m.Name = '')
    and
    ae.FullName = ea.SystemType
    and
    a.Name = @app
    order by ae.Depth desc
    ),
    i.Descr = ea.[Description]
    from VCLib.T_DTO_ITEM i
    join VCLib.T_DTO_MODEL m on m.DtoModelID = i.DtoModel
    join
    (
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,[IsAdditional] ,[EntitiesAttributesId] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from VCLib.T_ENTITIES_ATTRIBUTES
    union all
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,0 ,[EntityAttributesID] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from V_ENTITY_ATTRIBUTES
    ) ea on (ea.Name = i.Name or ea.IsPrimaryKey = 1 and i.Name =  'id')
    and
    ea.EntityID in (select ae.BaseEntity from V_ENTITY_HIERARCHY ae where ae.EntityID = m.Entities)
    where m.DtoModelID = @dtoId

    INSERT INTO [VCLib].[T_DTO_ITEM]
    ([DtoItemID]
    ,[Name]
    ,[ItemLexem]
    ,[DataType]
    ,[Multiplicity]
    ,[DtoModel]
    ,[BindingType]
    ,[StringFormat]
    ,[ItemDtoModel]
    ,[IsInvariantCulture]
    ,[Postion]
    ,[Descr]
    ,[ChoiceData])
    SELECT
    NEWID()--DtoItemID, uniqueidentifier,
    ,case
    when ea.IsPrimaryKey = 1 then 'id'
    else LOWER(SUBSTRING(ea.Name, 1, 1)) + SUBSTRING(ea.Name, 2, LEN(ea.Name) - 1)--Name, varchar(255),
    end
    ,'&lt;lx:Path OwnerQueryLevel=&quot;0&quot; xmlns:lx=&quot;lexem&quot;&gt; &lt;lx:StepString name=&quot;' + ea.Name + '&quot; /&gt; &lt;/lx:Path&gt;'
    ,case
    when ea.AttributeType = 4 then 13
    when ea.SystemType = 'int' then 2
    when ea.SystemType in ('string', 'text') then 1
    when ea.SystemType = 'bigint' then 8
    when ea.SystemType = 'binary' then 9
    when ea.SystemType in ('date', 'datetime') then 6
    when ea.SystemType = 'float' then 5
    when ea.SystemType in ('boolean', 'bool') then 4
    when ea.SystemType = 'byte' then 10
    when ea.SystemType = 'GUID' then 3
    else 99
    end--DataType, int,
    ,case
    when ea.AttributeType = 2 and ea.IsRequired = 1 then 3
    when ea.AttributeType = 2 and ea.IsRequired = 0 then 2
    else ea.IsRequired
    end--Multiplicity, int,
    ,@dtoId--DtoModel, uniqueidentifier,
    ,case
    when ea.IsCalculated = 1 or ea.MappingType in (4, 2) then 1
    else (1 | 2)
    end--TwoWayBinding, bit,
    ,case
    when ea.DefaultFormat is null and ea.SystemType in ('date', 'datetime') then 'yyyy-MM-dd'
    else REPLACE(REPLACE(ea.DefaultFormat, '{0:', ''), '}', '')
    end--StringFormat, varchar(255)
    ,(
    select top 1 m.DtoModelID
    from VCLib.T_DTO_MODEL m
    join V_ENTITY_HIERARCHY ae on m.Entities = ae.BaseEntity
    join VCLib.T_WEB_APP a on a.WebAppID = m.WebApp
    where (m.Name is null or m.Name = '')
    and
    ae.FullName = ea.SystemType
    and
    a.Name = @app
    order by ae.Depth desc
    )--ItemDtoModel, uniqueidentifier,
    ,1--IsInvariantCulture, bit,
    ,0--Postion, int,
    ,ea.[Description]
    ,ea.ChoiceAttributeData--ChoiceData, varchar(2000),
    from (
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,[IsAdditional] ,[EntitiesAttributesId] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from VCLib.T_ENTITIES_ATTRIBUTES
    union all
    select [EntityID] ,[Index] ,[AttributeType] ,[Name] ,[Description] ,[SystemType] ,[MaxLength] ,[Precision] ,[Scale] ,[DefaultFormat] ,[IsCalculated] ,[IsFlag] ,[IsRequired] ,[MappingType] ,[MappingName] ,[IsStored] ,[Save] ,[LinkAttributeName] ,[ChoiceAttributeData] ,[AttrLexem] ,[PathsAttributes] ,[IsCashed] ,0 ,[EntityAttributesID] ,[MappingTable] ,[MappingRefTable] ,[ParametersData] ,[CustomsData] ,[RequiredAttributes] ,[SortingAttribute] ,[EnumType] ,[IsIdentity] ,[IsCustom] ,[RemoveAction] ,[IsPrimaryKey] ,[RefTableSearchMode] ,[RefTableHashFunc] ,[AttributeId]
    from V_ENTITY_ATTRIBUTES
    ) ea
    where ea.EntityID in (select ae.BaseEntity from V_ENTITY_HIERARCHY ae where ae.FullName = @entity)
    and
    <xsl:choose>
      <xsl:when test="Ignore">
        (ea.Name not in (''<xsl:for-each select="Ignore">
          ,'<xsl:value-of select="@Name"/>'
        </xsl:for-each>))
        and
      </xsl:when>
    </xsl:choose>
    not exists
    (
    select *
    from [VCLib].[T_DTO_ITEM] di
    where di.DtoModel = @dtoId
    and
    (ea.Name = di.Name or ea.IsPrimaryKey = 1 and di.Name =  'id')
    )

  </xsl:template>
  <!--Шаблон для генерации отображения модели DTO-->
  <xsl:template name="DtoModelView">
    INSERT INTO VCLib.T_DTO_MODEL_VIEW
    (DtoModelViewID ,DtoModel)
    SELECT
    NEWID(), @dtoId
    where not exists
    (
    select *
    from VCLib.T_DTO_MODEL_VIEW dmv
    where dmv.DtoModel != @dtoId and "context" is null
    );

    INSERT INTO VCLib.T_DTO_MODEL_COLUMN
    (DtoModelColumnID ,DtoModelView ,ColPath ,ColDescr ,ColOrder ,IsVisible ,FormatType)
    SELECT
    NEWID()
    ,v.DtoModelViewID
    ,case
    when di.DataType = 99 then di.Name + '.displayName'
    else di.Name
    end
    ,di.Descr
    ,di.Postion
    ,1
    ,0
    from VCLib.T_DTO_ITEM di
    join VCLib.T_DTO_MODEL_VIEW v on v.DtoModel = di.DtoModel and (v.Context is null or v.Context = '')
    where di.DtoModel = @dtoId
    and
    di.Name != 'id'
    and
    (di.DataType != 99 or di.ItemDtoModel is not null)
    and
    di.Multiplicity &lt; 2;
  </xsl:template>

  <!--Загрузка Web алиасов сущностей-->
  <xsl:template match="root/webAliases[(alias)]"
				  name="loadAppAliases">

    <xsl:for-each select="alias">
      declare  @aliasId uniqueidentifier
      <xsl:call-template name="getWebAliasID"/>
      <xsl:call-template name="loadWebAlias"/>
      GO
    </xsl:for-each>

    <xsl:for-each select="alias[@default='1']">
      declare  @aliasId uniqueidentifier
      <xsl:call-template name="getWebAliasID"/>
      <xsl:call-template name="setDefaultWebAlias"/>
      GO
    </xsl:for-each>

    <xsl:for-each select="alias[@inherits!='']">
      declare  @aliasId uniqueidentifier
      <xsl:call-template name="getWebAliasID"/>
      <xsl:call-template name="setInheritedAlias"/>
      GO
    </xsl:for-each>

  </xsl:template>
  <!--Шаблон для получения идентификатора alias-а-->
  <xsl:template name="getWebAliasID">
    select @aliasId = ISNULL((select wa.EntitiesWebAliasID
    from VCLib.T_ENTITIES_WEB_ALIAS wa
    join VCLib.T_WEB_APP a on a.WebAppID = wa.WebApp
    where wa.Alias = '<xsl:value-of select="@name" />'
    and
    a.Name = '<xsl:choose>
      <xsl:when test="@App">
        <xsl:value-of select="@App" />
      </xsl:when>
      <xsl:when test="../../@hosted">
        <xsl:value-of select="name(../..)" />
      </xsl:when>
      <xsl:otherwise>api</xsl:otherwise>
    </xsl:choose>'), NEWID())
  </xsl:template>
  <!--Шаблон загрузки основной информации по alias-у-->
  <xsl:template name="loadWebAlias">
    INSERT INTO [VCLib].[T_ENTITIES_WEB_ALIAS] ([EntitiesWebAliasID], [Alias] ,[Entities] ,[Filter], [Descr], [IsDefault], [WebApp], [DefaultTemplateName], [PageRowCountMax])
    SELECT
    @aliasId
    ,'<xsl:value-of select="@name" />'
    ,e.EntityID
    ,<xsl:choose>
      <xsl:when test="./filter[(*)]" >
        '<xsl:call-template name="serializeNodeToString">
          <xsl:with-param name="node"
									select="filter/*"/>
        </xsl:call-template>'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@description != ''">
        '<xsl:value-of select="@description" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,0
    ,(select WebAppID from VCLib.T_WEB_APP a where a.Name = '<xsl:choose>
      <xsl:when test="@App">
        <xsl:value-of select="@App" />
      </xsl:when>
      <xsl:when test="../../@hosted">
        <xsl:value-of select="name(../..)" />
      </xsl:when>
      <xsl:otherwise>api</xsl:otherwise>
    </xsl:choose>')
    ,<xsl:choose>
      <xsl:when test="@template != ''">
        '<xsl:value-of select="@template" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,1000
    from VCLib.T_ENTITIES e
    where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity" />'
    and
    not exists ( select * from [VCLib].[T_ENTITIES_WEB_ALIAS] wa where wa.EntitiesWebAliasID = @aliasId )
    update wa
    set wa.Entities = e.EntityID
    ,wa.Filter = <xsl:choose>
      <xsl:when test="./filter[(*)]" >
        '<xsl:call-template name="serializeNodeToString">
          <xsl:with-param name="node"
									select="filter/*"/>
        </xsl:call-template>'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,wa.Descr = <xsl:choose>
      <xsl:when test="@description != ''">
        '<xsl:value-of select="@description" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,wa.DefaultTemplateName = <xsl:choose>
      <xsl:when test="@template != ''">
        '<xsl:value-of select="@template" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    from [VCLib].[T_ENTITIES_WEB_ALIAS] wa
    join VCLib.T_ENTITIES e on e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity" />'
    where wa.EntitiesWebAliasID = @aliasId
    <xsl:if test="@recreateAccess='1'">
      delete ewaa
      from [VCLib].[T_ENTITIES_WEB_ALIAS_ACCESS] ewaa
      where ewaa.EntitiesWebAlias = @aliasId
    </xsl:if>
    <xsl:for-each select="access/role">
      INSERT INTO [VCLib].[T_ENTITIES_WEB_ALIAS_ACCESS] ([EntitiesWebAliasAccessID] ,[EntitiesWebAlias] ,[Role] ,[Access])
      SELECT
      NEWID()--EntitiesWebAliasAccessID, uniqueidentifier,
      ,@aliasId--EntitiesWebAlias, varchar(255),
      ,(select top 1 r.RoleID from [VCLib].[T_ROLES] r where r.RoleName = '<xsl:value-of select="@name" />')--Role, uniqueidentifier,
      ,<xsl:value-of select="@access" />--Access, int,
      where not exists(select * from [VCLib].[T_ENTITIES_WEB_ALIAS_ACCESS] ewaa
      join [VCLib].[T_ROLES] r on r.RoleID = ewaa.[Role]
      where ewaa.EntitiesWebAlias = @aliasId and r.RoleName = '<xsl:value-of select="@name" />')
      and
      exists(select * from [VCLib].[T_ROLES] r where r.RoleName = '<xsl:value-of select="@name" />')
      and
      exists(select * from [VCLib].[T_ENTITIES_WEB_ALIAS] wa where wa.EntitiesWebAliasID = @aliasId)
    </xsl:for-each>
  </xsl:template>
  <!--Шаблон установки default флага-->
  <xsl:template name="setDefaultWebAlias">
    update wa
    set wa.IsDefault = case when wa.EntitiesWebAliasID = @aliasId then 1 else 0 end
    from [VCLib].[T_ENTITIES_WEB_ALIAS] wa
    join VCLib.T_WEB_APP a on a.WebAppID = wa.WebApp
    where wa.Entities = (select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity" />')
    and
    a.Name = '<xsl:choose>
      <xsl:when test="@App">
        <xsl:value-of select="@App" />
      </xsl:when>
      <xsl:when test="../../@hosted">
        <xsl:value-of select="name(../..)" />
      </xsl:when>
      <xsl:otherwise>api</xsl:otherwise>
    </xsl:choose>'
  </xsl:template>
  <!--Шаблон установки базового alias-а-->
  <xsl:template name="setInheritedAlias">
    update wa
    set wa.InheritsAlias =
    (
    select EntitiesWebAliasID
    from VCLib.T_ENTITIES_WEB_ALIAS
    join VCLib.T_WEB_APP a on a.WebAppID = WebApp
    where Alias = '<xsl:value-of select="@inherits" />'
    and
    a.Name = '<xsl:choose>
      <xsl:when test="@App">
        <xsl:value-of select="@App" />
      </xsl:when>
      <xsl:when test="../../@hosted">
        <xsl:value-of select="name(../..)" />
      </xsl:when>
      <xsl:otherwise>api</xsl:otherwise>
    </xsl:choose>'
    )
    from [VCLib].[T_ENTITIES_WEB_ALIAS] wa
    where wa.EntitiesWebAliasID = @aliasId
  </xsl:template>

  <!--Загрузка настраиваемых Web сервисов-->
  <xsl:template match="root/webServices[(service)]">

    <xsl:for-each select="service">
      <xsl:call-template name="loadWebService"/>
      delete wsmp
      from [VCLib].[T_CUSTOM_WEBSERVICE_METHOD_PARAMETER] wsmp
      join [VCLib].[T_CUSTOM_WEBSERVICE_METHOD] wsm on wsm.CustomWebserviceMethodID = wsmp.CustomWebserviceMethod
      where CustomWebservice = '<xsl:value-of select="@id" />';
      delete from [VCLib].[T_CUSTOM_WEBSERVICE_METHOD] where CustomWebservice = '<xsl:value-of select="@id" />';
      delete from [VCLib].[T_CUSTOM_WEBSERVICE_ENTITY] where CustomWebservice = '<xsl:value-of select="@id" />';
    </xsl:for-each>

    <xsl:for-each select="service/entities/entity">
      <xsl:call-template name="loadWebServiceEntity"/>
    </xsl:for-each>

    <xsl:for-each select="service/methods/method">
      <xsl:call-template name="loadWebServiceMethod"/>
    </xsl:for-each>

    <xsl:for-each select="service/parameters/parameter">
      <xsl:call-template name="loadWebServiceMethodParams"/>
    </xsl:for-each>

  </xsl:template>
  <!--Шаблон загрузки основной информации по сервису-->
  <xsl:template name="loadWebService">
    INSERT INTO [VCLib].[T_CUSTOM_WEBSERVICE]
    ([CustomWebserviceID]
    ,[Name]
    ,[Descr]
    ,[BaseAddress]
    ,[Soap11Supported]
    ,[Soap12Supported]
    ,[RestSupported]
    ,[SoapEndpoint]
    ,[Soap11BindingName]
    ,[Soap12BindingName]
    ,[PortTypeName])
    SELECT
    '<xsl:value-of select="@id" />'
    ,'<xsl:value-of select="@name" />'
    ,<xsl:choose>
      <xsl:when test="@descr != ''">
        '<xsl:value-of select="@descr" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,'<xsl:value-of select="@address" />'
    ,<xsl:value-of select="@soap11" />
    ,<xsl:value-of select="@soap12" />
    ,<xsl:value-of select="@rest" />
    ,<xsl:choose>
      <xsl:when test="@endpoint != ''">
        '<xsl:value-of select="@endpoint" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@soap11binding != ''">
        '<xsl:value-of select="@soap11binding" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@soap12binding != ''">
        '<xsl:value-of select="@soap12binding" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@portType != ''">
        '<xsl:value-of select="@portType" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    where not exists ( select * from [VCLib].[T_CUSTOM_WEBSERVICE] ws where ws.CustomWebserviceID = '<xsl:value-of select="@id" />' )
    GO
    update ws
    set ws.Name = '<xsl:value-of select="@name" />'
    ,ws.Descr = <xsl:choose>
      <xsl:when test="@descr != ''">
        '<xsl:value-of select="@descr" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,ws.BaseAddress = '<xsl:value-of select="@address" />'
    ,ws.Soap11Supported = <xsl:value-of select="@soap11" />
    ,ws.Soap12Supported = <xsl:value-of select="@soap12" />
    ,ws.RestSupported = <xsl:value-of select="@rest" />
    ,ws.SoapEndpoint = <xsl:choose>
      <xsl:when test="@endpoint != ''">
        '<xsl:value-of select="@endpoint" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,ws.Soap11BindingName = <xsl:choose>
      <xsl:when test="@soap11binding != ''">
        '<xsl:value-of select="@soap11binding" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,ws.Soap12BindingName = <xsl:choose>
      <xsl:when test="@soap12binding != ''">
        '<xsl:value-of select="@soap12binding" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,ws.PortTypeName = <xsl:choose>
      <xsl:when test="@portType != ''">
        '<xsl:value-of select="@portType" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    from [VCLib].[T_CUSTOM_WEBSERVICE] ws
    where ws.CustomWebserviceID = '<xsl:value-of select="@id" />'
    GO
  </xsl:template>
  <!--Шаблон загрузки сущностей сервиса-->
  <xsl:template name="loadWebServiceEntity">
    INSERT INTO [VCLib].[T_CUSTOM_WEBSERVICE_ENTITY]
    ([CustomWebserviceEntityID]
    ,[Descr]
    ,[CustomWebservice]
    ,[EntityName]
    ,[TextDescription])
    SELECT
    '<xsl:value-of select="@id" />'--CustomWebserviceEntityID, uniqueidentifier,
    ,<xsl:choose>
      <xsl:when test="@descr != ''">
        '<xsl:value-of select="@descr" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>--Descr, varchar(max),
    ,'<xsl:value-of select="../../@id" />'--CustomWebservice, uniqueidentifier,
    ,'<xsl:value-of select="@name" />'--EntityName, varchar(255),
    ,<xsl:choose>
      <xsl:when test="@text != ''">
        '<xsl:value-of select="@text" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>--TextDescription, varchar(max),
    GO
  </xsl:template>
  <!--Шаблон загрузки методов сервиса-->
  <xsl:template name="loadWebServiceMethod">
    INSERT INTO [VCLib].[T_CUSTOM_WEBSERVICE_METHOD]
    ([CustomWebserviceMethodID]
    ,[Descr]
    ,[MethodLexem]
    ,[NeedAuth]
    ,[CustomWebservice]
    ,[MethodType]
    ,[Path]
    ,[ContentType]
    ,[ContentEncoding]
    ,[BodyFormat]
    ,[InputWebServiceEntity]
    ,[InputAttributePaths]
    ,[OutputWebServiceEntity]
    ,[OutputAttributePahs])
    SELECT
    '<xsl:value-of select="@id" />'
    ,<xsl:choose>
      <xsl:when test="@descr != ''">
        '<xsl:value-of select="@descr" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,'<xsl:value-of select="@lexem" />'
    ,<xsl:value-of select="@auth" />
    ,'<xsl:value-of select="../../@id" />'
    ,<xsl:value-of select="@method" />
    ,'<xsl:value-of select="@path" />'
    ,<xsl:choose>
      <xsl:when test="@content != ''">
        '<xsl:value-of select="@content" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@encoding != ''">
        '<xsl:value-of select="@encoding" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="@bodyFormat != ''">
        <xsl:value-of select="@bodyFormat" />
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="input/@entity != ''">
        (select wse.CustomWebserviceEntityID from VCLib.T_CUSTOM_WEBSERVICE_ENTITY wse where wse.EntityName = '<xsl:value-of select="input/@entity" />' and wse.CustomWebservice = '<xsl:value-of select="../../@id" />')
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="input/@paths != ''">
        '<xsl:value-of select="input/@paths" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="output/@entity != ''">
        (select wse.CustomWebserviceEntityID from VCLib.T_CUSTOM_WEBSERVICE_ENTITY wse where wse.EntityName = '<xsl:value-of select="output/@entity" />' and wse.CustomWebservice = '<xsl:value-of select="../../@id" />')
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    ,<xsl:choose>
      <xsl:when test="output/@paths != ''">
        '<xsl:value-of select="output/@paths" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>
    GO
  </xsl:template>
  <!--Шаблон загрузки параметров методов сервиса-->
  <xsl:template name="loadWebServiceMethodParams">
    INSERT INTO [VCLib].[T_CUSTOM_WEBSERVICE_METHOD_PARAMETER]
    ([CustomWebserviceMethodParameterID]
    ,[MethodParameterName]
    ,[Order]
    ,[CustomWebserviceMethod]
    ,[BaseObjectType]
    ,[DataType]
    ,[Lexem]
    ,[ParameterType])
    SELECT
    '<xsl:value-of select="@id" />'--CustomWebserviceMethodParameterID, uniqueidentifier,
    ,'<xsl:value-of select="@name" />'--MethodParameterName, varchar(255),
    ,<xsl:value-of select="@order" />--Order, int,
    ,'<xsl:value-of select="@method" />'--CustomWebserviceMethod, uniqueidentifier,
    ,<xsl:choose>
      <xsl:when test="@entity != ''">
        '<xsl:value-of select="@entity" />'
      </xsl:when>
      <xsl:otherwise>null</xsl:otherwise>
    </xsl:choose>--BaseObjectType, varchar(255),
    ,<xsl:value-of select="@dataType" />--DataType, int,
    ,'<xsl:value-of select="@lexem" />'--Lexem, varchar(255),
    ,<xsl:value-of select="@paramType" />--ParameterType, int,
    GO
  </xsl:template>

  <!--Загрузка настроек валидации-->
  <xsl:template match="root/validation[(condition)]">
    <xsl:for-each select="condition">
      INSERT INTO VCLib.T_DATAFORM_VALIDATION (Entities)
      SELECT (select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity"/>')
      where not exists
      (
      select *
      from VCLib.T_DATAFORM_VALIDATION dv
      join VCLib.T_ENTITIES e on e.EntityID = dv.Entities
      where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity"/>'
      )
      GO
      INSERT INTO VCLib.T_VALIDATION_CONDITION (ValidationConditionID, ValidationGroup, Condition, Context, ValidationDescription, IsHierarchical, DataformValidation, ValidationType, ServerSide)
      SELECT
      '<xsl:value-of select="@id"/>'--ValidationConditionID, uniqueidentifier
      ,'<xsl:value-of select="@group"/>'--ValidationGroup, varchar(255)
      ,'<xsl:value-of select="@condition"/>'--Condition, varchar(max)
      ,'<xsl:value-of select="@context"/>'--Context, varchar(255)
      ,'<xsl:value-of select="@description"/>'--ValidationDescription, varchar(max)
      ,'<xsl:value-of select="@hierarchical"/>'--IsHierarchical, bit
      ,(select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity"/>')--DataformValidation, int
      ,'<xsl:value-of select="@type"/>'--ValidationType, int
      ,'<xsl:value-of select="@server"/>'--ServerSide, bit,
      where not exists
      (
      select *
      from VCLib.T_VALIDATION_CONDITION vc
      where vc.ValidationConditionID = '<xsl:value-of select="@id"/>'
      )
      GO
      update VCLib.T_VALIDATION_CONDITION
      set ValidationGroup = '<xsl:value-of select="@group"/>'
      ,Condition = '<xsl:value-of select="@condition"/>'
      ,Context = '<xsl:value-of select="@context"/>'
      ,ValidationDescription = '<xsl:value-of select="@description"/>'
      ,IsHierarchical = '<xsl:value-of select="@hierarchical"/>'
      ,DataformValidation = (select e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@entity"/>')
      ,ValidationType = '<xsl:value-of select="@type"/>'
      ,ServerSide = '<xsl:value-of select="@server"/>'
      where ValidationConditionID = '<xsl:value-of select="@id"/>'
      GO
    </xsl:for-each>
  </xsl:template>

  <!--Загрузка действий при изменении объекта-->
  <xsl:template match="ObjectModificationActions/SingleModificationAction|ObjectModificationActions/DependencyModificationAction">
    declare @ObjectModificationActionID uniqueidentifier
    <xsl:call-template name="getObjectModificationActionID"/>
    -- Обновление существующего действия
    update oma
    set oma.Position = <xsl:value-of select="@Position" />,
    oma.type_ = (select top 1 e.EntityID from VCLib.T_ENTITIES e where e.[Schema] = 'VCLib' and e.EntName = '<xsl:choose>
      <xsl:when test="name(.) = 'SingleModificationAction'">SINGLE_MODIFICATION_ACTION</xsl:when>
      <xsl:otherwise>DEPENDENCY_MODIFICATION_ACTION</xsl:otherwise>
    </xsl:choose>'),
    oma.Active = <xsl:value-of select="@Active" />,
    oma.Instruction = '<xsl:value-of select="Instruction" />',
    oma.InstructionType = <xsl:value-of select="@InstructionType" />
    from [VCLib].[T_OBJECT_MODIFICATION_ACTION] oma
    where oma.ObjectModificationActionID = @ObjectModificationActionID

    -- Создание нового, если не существует
    INSERT INTO [VCLib].[T_OBJECT_MODIFICATION_ACTION]
    ([ObjectModificationActionID]
    ,[Entities]
    ,[Position]
    ,[type_]
    ,[Active]
    ,[Name]
    ,[Instruction]
    ,[InstructionType])
    SELECT
    @ObjectModificationActionID--ObjectModificationActionID, uniqueidentifier
    ,(select top 1 e.EntityID from VCLib.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@Entities" />')--Entities, int
    ,<xsl:value-of select="@Position" />--Position, int
    ,(select top 1 e.EntityID from VCLib.T_ENTITIES e where e.[Schema] = 'VCLib' and e.EntName = '<xsl:choose>
      <xsl:when test="name(.) = 'SingleModificationAction'">SINGLE_MODIFICATION_ACTION</xsl:when>
      <xsl:otherwise>DEPENDENCY_MODIFICATION_ACTION</xsl:otherwise>
    </xsl:choose>')--type_, int
    ,<xsl:value-of select="@Active" />--Active, bit
    ,'<xsl:value-of select="@Name" />'--Name, varchar(255)
    ,'<xsl:value-of select="Instruction" />'--Instruction, varchar(max)
    ,<xsl:value-of select="@InstructionType" />--InstructionType, int
    where not exists
    (
    select *
    from [VCLib].[T_OBJECT_MODIFICATION_ACTION] oma
    where oma.ObjectModificationActionID = @ObjectModificationActionID
    )

    -- Перезагружаем информацию о параметрах и дополнительных настройках действия
    delete from [VCLib].[T_SINGLE_MODIFICATION_ACTION]
    where ObjectModificationActionID = @ObjectModificationActionID
    delete from [VCLib].[T_DEPENDENCY_MODIFICATION_ACTION]
    where ObjectModificationActionID = @ObjectModificationActionID
    INSERT INTO [VCLib].[T_<xsl:choose>
      <xsl:when test="name(.) = 'SingleModificationAction'">SINGLE_MODIFICATION_ACTION</xsl:when>
      <xsl:otherwise>DEPENDENCY_MODIFICATION_ACTION</xsl:otherwise>
    </xsl:choose>]
    ([ObjectModificationActionID]
    <xsl:choose>
      <xsl:when test="name(.) = 'SingleModificationAction'">
        <xsl:text>,[InsertFilter]</xsl:text>
        <xsl:text>,[UpdateFilter]</xsl:text>
        <xsl:text>,[DeleteFilter]</xsl:text>
        <xsl:text>,[EditType])</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>,[Dependencies])</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    SELECT
    @ObjectModificationActionID--ObjectModificationActionID, uniqueidentifier
    <xsl:choose>
      <xsl:when test="name(.) = 'SingleModificationAction'">
        ,<xsl:choose>
          <xsl:when test="InsertFilter">
            '<xsl:call-template name="serializeNodeToString">
              <xsl:with-param name="node"
											select="InsertFilter/*"/>
            </xsl:call-template>'
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--InsertFilter, varchar(max)
        ,<xsl:choose>
          <xsl:when test="UpdateFilter">
            '<xsl:call-template name="serializeNodeToString">
              <xsl:with-param name="node"
											select="UpdateFilter/*"/>
            </xsl:call-template>'
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--UpdateFilter, varchar(max)
        ,<xsl:choose>
          <xsl:when test="DeleteFilter">
            '<xsl:call-template name="serializeNodeToString">
              <xsl:with-param name="node"
											select="DeleteFilter/*"/>
            </xsl:call-template>'
          </xsl:when>
          <xsl:otherwise>null</xsl:otherwise>
        </xsl:choose>--DeleteFilter, varchar(max)
        ,<xsl:value-of select="@EditType" />--EditType, int
      </xsl:when>
      <xsl:otherwise>
        ,'<xsl:value-of select="@Dependencies" />'
      </xsl:otherwise>
    </xsl:choose>

    delete from [VCLib].[T_OBJECT_MODIFICATION_ACTION_PARAM]
    where ObjectModificationAction = @ObjectModificationActionID
    <xsl:for-each select="ObjectModificationActionParams/*">
      INSERT INTO [VCLib].[T_OBJECT_MODIFICATION_ACTION_PARAM]
      ([ObjectModificationActionParamID]
      ,[ObjectModificationAction]
      ,[ParamValue]
      ,[Name])
      SELECT
      NEWID()--ObjectModificationActionParamID, uniqueidentifier
      ,@ObjectModificationActionID--ObjectModificationAction, uniqueidentifier
      ,'<xsl:call-template name="serializeNodeToString">
        <xsl:with-param name="node"
								select="./*"/>
      </xsl:call-template>'--ParamValue, varchar(max)
      ,'<xsl:value-of select="name()" />'--Name, varchar(255)
    </xsl:for-each>
    GO
  </xsl:template>
  <!--Шаблон для получения идентификатора действия-->
  <xsl:template name="getObjectModificationActionID">
    select @ObjectModificationActionID =
    ISNULL((
    select top 1 oma.ObjectModificationActionID
    from [VCLib].[T_OBJECT_MODIFICATION_ACTION] oma
    join VCLib.T_ENTITIES e on e.EntityID = oma.Entities
    where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@Entities" />'
    and
    oma.Name = '<xsl:value-of select="@Name" />'
    ), NEWID())
  </xsl:template>

  <!-- Execute SQL Script -->
  <xsl:template match="executesql|MsScript">
    <xsl:value-of select="text()"/>
  </xsl:template>

  <xsl:template match="Jobs/Job">
    <xsl:variable name="apos">'</xsl:variable>
    <xsl:variable name="quot">"</xsl:variable>
    -- обработка Job с Name = <xsl:value-of select="@Name" />

    declare @JobID uniqueidentifier
    declare @UserID uniqueidentifier

    select @UserID = (select top 1 tu.[UserID]
    from VCLib.T_USERS tu
    where exists
    (
    select *
    from VCLib.T_LOGIN tl
    where tl.[Identity] = tu.[Identity] and tl.[Login] = <xsl:value-of select="@Login" />
    )
    )

    select @JobID = (select top 1 tj.[JobID] from [VCLib].[T_JOB] tj where tj.[Name] = <xsl:value-of select="@Name" />)

    if @JobID is NULL
    begin
    select @JobID = NEWID()
    insert into [VCLib].[T_JOB] (
    [JobID],
    [Name],
    [ConcurrentExecute],
    [JobUser])
    values (
    @JobID,
    <xsl:value-of select="@Name" />,
    <xsl:value-of select="@ConcurrentExecute" />,
    @UserID)
    end
    else
    begin
    update [VCLib].[T_JOB]
    set
    [ConcurrentExecute] = <xsl:value-of select="@ConcurrentExecute" />,
    [JobUser] = @UserID,
    [Name] = <xsl:value-of select="@Name" />
    where [JobID] = @JobID
    end

    -- обработка JobStep-ов для Job с Name = <xsl:value-of select="@Name" />

    declare @JobStepID uniqueidentifier
    declare @OperationID uniqueidentifier
    declare @DataIndex int
    <xsl:for-each select="Steps/Step">
      -- обработка JobStep со Step = <xsl:value-of select="@Step" />

      select @JobStepID = (select top 1 tjs.[JobStepID] from [VCLib].[T_JOB_STEP] tjs
      where tjs.[Job] = @JobID
      and tjs.[Step] = <xsl:value-of select="@Step" />)

      select @OperationID = (select top 1 tso.[OperationID] from [VCLib].[T_SCHEDULER_OPERATION] tso
      where tso.[Name] = <xsl:value-of select="Operation/@Name" />)

      select @DataIndex = (select top 1 te.[EntityId] from [VCLib].[T_ENTITIES] te
      where te.[EntName] = <xsl:value-of select="Operation/@EntityName" />
      and te.[Schema] = <xsl:value-of select="Operation/@EntitySchema" />)

      if @OperationID is NULL
      begin
      select @OperationID = NEWID()
      insert into [VCLib].[T_SCHEDULER_OPERATION] (
      [OperationID],
      [Name],
      [type_],
      [ProcessName])
      values (
      @OperationID,
      <xsl:value-of select="Operation/@Name" />,
      @DataIndex,
      <xsl:choose>
        <xsl:when test="Operation/@ProcessName">
          <xsl:value-of select="Operation/@ProcessName"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>)
      end
      else
      begin
      update [VCLib].[T_SCHEDULER_OPERATION]
      set
      [Name] = <xsl:value-of select="Operation/@Name" />,
      [type_] = @DataIndex,
      [ProcessName] = <xsl:choose>
        <xsl:when test="Operation/@ProcessName">
          <xsl:value-of select="Operation/@ProcessName"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      where [OperationID] = @OperationID
      end

      <xsl:for-each select="Operation/RunLexemOperation">
        <xsl:variable name="newLexem">
          <xsl:call-template name="replace">
            <xsl:with-param name="text"
										select="Lexem" />
            <xsl:with-param name="replace"
										select="$apos" />
            <xsl:with-param name="by"
										select="concat($apos, $apos)" />
          </xsl:call-template>
        </xsl:variable>
        if (select top 1 trlo.[OperationID] from [VCLib].[T_RUN_LEXEM_OPERATION] trlo
        where trlo.[OperationID] = @OperationID) is NULL
        begin
        insert into [VCLib].[T_RUN_LEXEM_OPERATION] (
        [OperationID],
        [Lexem])
        values (
        @OperationID,
        '<xsl:value-of select="$newLexem" />')
        end
        else
        begin
        update [VCLib].[T_RUN_LEXEM_OPERATION]
        set
        [Lexem] = '<xsl:value-of select="$newLexem" />'
        where [OperationID] = @OperationID
        end
      </xsl:for-each>

      if @JobStepID is NULL
      begin
      select @JobStepID = NEWID()
      insert into [VCLib].[T_JOB_STEP] (
      [JobStepID],
      [Step],
      [ContinueOnError],
      [Job],
      [Operation])
      values (
      @JobStepID,
      <xsl:value-of select="@Step" />,
      <xsl:value-of select="@ContinueOnError" />,
      @JobID,
      @OperationID)
      end
      else
      begin
      update [VCLib].[T_JOB_STEP]
      set
      [Step] = <xsl:value-of select="@Step" />,
      [ContinueOnError] = <xsl:value-of select="@ContinueOnError" />,
      [Job] = @JobID,
      [Operation] = @OperationID
      where [JobStepID] = @JobStepID
      end
    </xsl:for-each>
    go
  </xsl:template>

  <xsl:template match="ArrayOfExtraUICommand">
    --Insert or Update ExtraUICommand Records
    declare @ExtraUICommandId uniqueidentifier
    declare @Entities int
    declare @CommandEntity int
    <xsl:for-each select="ExtraUICommand">
      <xsl:variable name="index"
						  select="position()"/>
      --record <xsl:value-of select="$index" />
      SET @Entities = (SELECT TOP 1 EntityID from VCLIB.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="Entities" />')
      SET @CommandEntity = (SELECT TOP 1 EntityID from VCLIB.T_ENTITIES e where e.[Schema] + '.' + e.EntName = '<xsl:value-of select="CommandEntity" />')
      SET @ExtraUICommandId = (SELECT TOP 1 [ExtraUiCommandID] FROM [VCLib].[T_EXTRA_UI_COMMAND] WHERE [Name] = '<xsl:value-of select="Name" />' and Entities = @Entities and CommandEntity = @CommandEntity)

      IF @ExtraUICommandId is NULL
      BEGIN
      SET @ExtraUICommandId = NEWID()

      INSERT INTO [VCLib].[T_EXTRA_UI_COMMAND] (
      [ActivationFilter]
      , [CommandEntity]
      , [CommandType]
      , [Context]
      , [Credentials]
      , [DisplayAttributes]
      , [Entities]
      , [ExecutionType]
      , [ExtraUiCommandID]
      , [FilterValue]
      , [Instruction]
      , [InstructionType]
      , [Name]
      , [OpenContext]
      , [Priority]
      , [QueryProcessParams]
      , [RemoteCommandID]
      , [SameObject]
      , [StyleType]
      , [WayTransferObjects]
      , [IsCanRunCommand]
      , [IsForceModal]
      )
      SELECT
      <xsl:choose>
        <xsl:when test="ActivationFilter/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="ActivationFilter">
          '<xsl:value-of select="ActivationFilter"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [ActivationFilter]
      , @CommandEntity as [CommandEntity]
      , <xsl:choose>
        <xsl:when test="CommandType">
          <xsl:value-of select="CommandType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [CommandType]
      , <xsl:choose>
        <xsl:when test="Context/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Context">
          '<xsl:value-of select="Context"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [Context]
      , <xsl:choose>
        <xsl:when test="Credentials/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Credentials">
          <xsl:value-of select="Credentials"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [Credentials]
      , <xsl:choose>
        <xsl:when test="DisplayAttributes/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="DisplayAttributes">
          '<xsl:value-of select="DisplayAttributes"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [DisplayAttributes]
      , @Entities as [Entities]
      , <xsl:choose>
        <xsl:when test="ExecutionType">
          <xsl:value-of select="ExecutionType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [ExecutionType]
      , @ExtraUICommandId
      , <xsl:choose>
        <xsl:when test="FilterValue/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="FilterValue">
          '<xsl:value-of select="FilterValue"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [FilterValue]
      , <xsl:choose>
        <xsl:when test="Instruction/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Instruction">
          '<xsl:value-of select="Instruction"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [Instruction]
      , <xsl:choose>
        <xsl:when test="InstructionType/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="InstructionType">
          <xsl:value-of select="InstructionType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [InstructionType]
      , <xsl:choose>
        <xsl:when test="Name">
          '<xsl:value-of select="Name"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [Name]
      , <xsl:choose>
        <xsl:when test="OpenContext/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="OpenContext">
          '<xsl:value-of select="OpenContext"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [OpenContext]
      , <xsl:choose>
        <xsl:when test="Priority">
          <xsl:value-of select="Priority"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [Priority]
      , <xsl:choose>
        <xsl:when test="QueryProcessParams/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="QueryProcessParams">
          '<xsl:value-of select="QueryProcessParams"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [QueryProcessParams]
      , <xsl:choose>
        <xsl:when test="RemoteCommandID/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="RemoteCommandID">
          '<xsl:value-of select="RemoteCommandID"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [RemoteCommandID]
      , <xsl:choose>
        <xsl:when test="SameObject='true'">1</xsl:when>
        <xsl:when test="SameObject='false'">0</xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [SameObject]
      , <xsl:choose>
        <xsl:when test="StyleType/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="StyleType">
          '<xsl:value-of select="StyleType"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [StyleType]
      , <xsl:choose>
        <xsl:when test="WayTransferObjects/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="WayTransferObjects">
          <xsl:value-of select="WayTransferObjects"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [WayTransferObjects]
      , <xsl:choose>
        <xsl:when test="IsCanRunCommand='true'">1</xsl:when>
        <xsl:when test="IsCanRunCommand='false'">0</xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [IsCanRunCommand]
      , <xsl:choose>
        <xsl:when test="IsForceModal='true'">1</xsl:when>
        <xsl:when test="IsForceModal='false'">0</xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose> as [IsForceModal]
      END
      ELSE
      BEGIN
      UPDATE [VCLib].[T_EXTRA_UI_COMMAND] set
      [ActivationFilter]=<xsl:choose>
        <xsl:when test="ActivationFilter/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="ActivationFilter">
          '<xsl:value-of select="ActivationFilter"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[CommandType]=<xsl:choose>
        <xsl:when test="CommandType">
          <xsl:value-of select="CommandType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[Context]=<xsl:choose>
        <xsl:when test="Context/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Context">
          '<xsl:value-of select="Context"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[Credentials]=<xsl:choose>
        <xsl:when test="Credentials/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Credentials">
          <xsl:value-of select="Credentials"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[DisplayAttributes]=<xsl:choose>
        <xsl:when test="DisplayAttributes/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="DisplayAttributes">
          '<xsl:value-of select="DisplayAttributes"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[ExecutionType]=<xsl:choose>
        <xsl:when test="ExecutionType">
          <xsl:value-of select="ExecutionType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[FilterValue]=<xsl:choose>
        <xsl:when test="FilterValue/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="FilterValue">
          '<xsl:value-of select="FilterValue"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[Instruction]=<xsl:choose>
        <xsl:when test="Instruction/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="Instruction">
          '<xsl:value-of select="Instruction"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[InstructionType]=<xsl:choose>
        <xsl:when test="InstructionType/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="InstructionType">
          <xsl:value-of select="InstructionType"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[OpenContext]=<xsl:choose>
        <xsl:when test="OpenContext/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="OpenContext">
          '<xsl:value-of select="OpenContext"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[Priority]=<xsl:choose>
        <xsl:when test="Priority">
          <xsl:value-of select="Priority"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[QueryProcessParams]=<xsl:choose>
        <xsl:when test="QueryProcessParams/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="QueryProcessParams">
          '<xsl:value-of select="QueryProcessParams"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[RemoteCommandID]=<xsl:choose>
        <xsl:when test="RemoteCommandID/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="RemoteCommandID">
          '<xsl:value-of select="RemoteCommandID"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[SameObject]=<xsl:choose>
        <xsl:when test="SameObject='true'">1</xsl:when>
        <xsl:when test="SameObject='false'">0</xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[StyleType]=<xsl:choose>
        <xsl:when test="StyleType/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="StyleType">
          '<xsl:value-of select="StyleType"/>'
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      ,[WayTransferObjects]=<xsl:choose>
        <xsl:when test="WayTransferObjects/@xsi:nil='true'">NULL</xsl:when>
        <xsl:when test="WayTransferObjects">
          <xsl:value-of select="WayTransferObjects"/>
        </xsl:when>
        <xsl:otherwise>NULL</xsl:otherwise>
      </xsl:choose>
      WHERE [ExtraUiCommandID] = @ExtraUICommandId

      DELETE FROM [VCLib].[T_EXTRA_UI_ACTION_PARAMS] WHERE [ExtraUiCommand] = @ExtraUICommandId
      END

      --record <xsl:value-of select="$index" /> params
      <xsl:for-each select="ExtraUIActionParams/ExtraUIActionParam">
        INSERT INTO [VCLib].[T_EXTRA_UI_ACTION_PARAMS]
        (
        [ExtraUiActionParamsID]
        , [ExtraUiCommand]
        , [FileName]
        , [IsOutput]
        , [Name]
        , [OutputOrder]
        , [ParamDescription]
        , [ParamValue]
        , [ResultType]
        , [Verb]
        )
        SELECT
        newid() as [ExtraUiActionParamsID]
        , @ExtraUICommandId as [ExtraUiCommand]
        , <xsl:choose>
          <xsl:when test="FileName/@xsi:nil='true'">NULL</xsl:when>
          <xsl:when test="FileName">
            '<xsl:value-of select="FileName"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [FileName]
        , <xsl:choose>
          <xsl:when test="IsOutput='true'">1</xsl:when>
          <xsl:when test="IsOutput='false'">0</xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [IsOutput]
        , <xsl:choose>
          <xsl:when test="Name">
            '<xsl:value-of select="Name"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [Name]
        , <xsl:choose>
          <xsl:when test="OutputOrder/@xsi:nil='true'">NULL</xsl:when>
          <xsl:when test="OutputOrder">
            <xsl:value-of select="OutputOrder"/>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [OutputOrder]
        , <xsl:choose>
          <xsl:when test="ParamDescription">
            '<xsl:value-of select="ParamDescription"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [ParamDescription]
        , <xsl:choose>
          <xsl:when test="ParamValue/@xsi:nil='true'">NULL</xsl:when>
          <xsl:when test="ParamValue">
            '<xsl:value-of select="ParamValue"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [ParamValue]
        , <xsl:choose>
          <xsl:when test="ResultType/@xsi:nil='true'">NULL</xsl:when>
          <xsl:when test="ResultType">
            <xsl:value-of select="ResultType"/>
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [ResultType]
        , <xsl:choose>
          <xsl:when test="Verb/@xsi:nil='true'">NULL</xsl:when>
          <xsl:when test="Verb">
            '<xsl:value-of select="Verb"/>'
          </xsl:when>
          <xsl:otherwise>NULL</xsl:otherwise>
        </xsl:choose> as [Verb]
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="root[dictionaryUpdates/update]">
    -- Начало вставки записей DictionaryUpdate
    declare @DictionaryUpdateId uniqueidentifier;
    declare @Entities int;
    declare @DictionaryAttributeID uniqueidentifier;
    declare @ServiceUserID uniqueidentifier;

    <!-- Проход по каждому элементу update внутри dictionaryUpdates -->
    <xsl:for-each select="dictionaryUpdates/update">
      <xsl:variable name="index" select="position()"/>
      -- Обработка записи <xsl:value-of select="$index"/>

      -- Получение идентификатора Entities на основе атрибута @Entities
      SET @Entities = (
      SELECT TOP 1 EntityID
      FROM VCLIB.T_ENTITIES e
      WHERE e.[Schema] + '.' + e.EntName = '<xsl:value-of select="@Entities" />'
      );

      -- Получение или создание идентификатора DictionaryUpdateId на основе атрибута @Code
      SET @DictionaryUpdateId = (
      SELECT TOP 1 [DictionaryUpdateID]
      FROM [VCLib].[T_DICTIONARY_UPDATE]
      WHERE [Code] = '<xsl:value-of select="@Code" />' AND Entities = @Entities
      );

      IF @DictionaryUpdateId IS NULL
      BEGIN
      SET @DictionaryUpdateId = NEWID();

      -- Вставка записи в таблицу T_DICTIONARY_UPDATE, только если идентификатор не существует
      INSERT INTO [VCLib].[T_DICTIONARY_UPDATE] (
      [DictionaryUpdateID]
      , [IsVersion]
      , [DateUpdatePath]
      , [Code]
      , [Descr]
      , [Entities]
      , [GroupByPaths]
      , [RecordsInPacket]
      , [LoadOrder]
      )
      SELECT
      @DictionaryUpdateId
      , CASE
      WHEN '<xsl:value-of select="@IsVersion"/>' = '1' THEN 1
      WHEN '<xsl:value-of select="@IsVersion"/>' = '0' THEN 0
      ELSE NULL
      END as [IsVersion]
      , CASE WHEN '<xsl:value-of select="@DateUpdatePath"/>' = '' THEN NULL ELSE '<xsl:value-of select="@DateUpdatePath"/>' END as [DateUpdatePath]
      , CASE WHEN '<xsl:value-of select="@Code"/>' = '' THEN NULL ELSE '<xsl:value-of select="@Code"/>' END as [Code]
      , CASE WHEN '<xsl:value-of select="@Descr"/>' = '' THEN NULL ELSE '<xsl:value-of select="@Descr"/>' END as [Descr]
      , @Entities as [Entities]
      , CASE WHEN '<xsl:value-of select="@GroupByPaths"/>' = '' THEN NULL ELSE '<xsl:value-of select="@GroupByPaths"/>' END as [GroupByPaths]
      , CASE WHEN '<xsl:value-of select="@RecordsInPacket"/>' = '' THEN NULL ELSE '<xsl:value-of select="@RecordsInPacket"/>' END as [RecordsInPacket]
      , CASE WHEN '<xsl:value-of select="@LoadOrder"/>' = '' THEN NULL ELSE '<xsl:value-of select="@LoadOrder"/>' END as [LoadOrder];

      -- Вставка записей пользователей для записи <xsl:value-of select="$index"/>
      <xsl:for-each select="users/user">
        declare @DictionaryUserID uniqueidentifier;
        SET @DictionaryUserID = NEWID();

        <!-- Проход по каждому сервису пользователя -->
        <xsl:for-each select="service">

          SET @ServiceUserID = NEWID();

          -- Вставка записи в таблицу T_SERVICE_USER
          INSERT INTO [VCLib].[T_SERVICE_USER] (
          [ServiceUserID]
          , [ServiceKey]
          , [OrgName]
          )
          SELECT
          @ServiceUserID as [ServiceUserID]
          , CASE WHEN '<xsl:value-of select="@key"/>' = '' THEN NULL ELSE '<xsl:value-of select="@key"/>' END as [ServiceKey]
          , CASE WHEN '<xsl:value-of select="@OrgName"/>' = '' THEN NULL ELSE '<xsl:value-of select="@OrgName"/>' END as [OrgName];

          -- Вставка записи в таблицу T_DICTIONARY_USER
          INSERT INTO [VCLib].[T_DICTIONARY_USER] (
          [DictionaryUserID]
          , [DictionaryUpdate]
          , [DataFilter]
          , [UserDictionaryIndex]
          , [DictionaryEntityName]
          , [ServiceUser]
          )
          SELECT
          @DictionaryUserID as [DictionaryUserID]
          , @DictionaryUpdateId  as [DictionaryUpdate]
          , CASE WHEN '<xsl:value-of select="../@DataFilter"/>' = '' THEN NULL ELSE '<xsl:value-of select="../@DataFilter"/>' END as [DataFilter]
          , CASE WHEN '<xsl:value-of select="../@UserDictionaryIndex"/>' = '' THEN NULL ELSE '<xsl:value-of select="../@UserDictionaryIndex"/>' END as [UserDictionaryIndex]
          , CASE WHEN '<xsl:value-of select="../@DictionaryEntityName"/>' = '' THEN NULL ELSE '<xsl:value-of select="../@DictionaryEntityName"/>' END as [DictionaryEntityName]
          , @ServiceUserID;
        </xsl:for-each>
      </xsl:for-each>

      -- Вставка записей атрибутов для записи <xsl:value-of select="$index"/>
      <xsl:for-each select="attributes/attribute">
        -- Инициализация переменной DictionaryAttributeID
        SET @DictionaryAttributeID = NEWID();

        -- Вставка записи в таблицу T_DICTIONARY_ATTRIBUTE
        INSERT INTO [VCLib].[T_DICTIONARY_ATTRIBUTE] (
        [DictionaryAttributeID]
        , [DictionaryUpdate]
        , [Name]
        , [AttrDescription]
        , [AttrLexem]
        , [IsKey]
        , [IsChecked]
        )
        SELECT
        @DictionaryAttributeID as [DictionaryAttributeID]
        , @DictionaryUpdateId as [DictionaryUpdate]
        , CASE WHEN '<xsl:value-of select="@Name"/>' = '' THEN NULL ELSE '<xsl:value-of select="@Name"/>' END as [Name]
        , CASE WHEN '<xsl:value-of select="@AttrDescription"/>' = '' THEN NULL ELSE '<xsl:value-of select="@AttrDescription"/>' END as [AttrDescription]
        , CASE WHEN '<xsl:value-of select="@AttrLexem"/>' = '' THEN NULL ELSE '<xsl:value-of select="@AttrLexem"/>' END as [AttrLexem]
        , CASE WHEN '<xsl:value-of select="@IsKey"/>' = '1' THEN 1 ELSE 0 END as [IsKey]
        , CASE WHEN '<xsl:value-of select="@IsChecked"/>' = '1' THEN 1 ELSE 0 END as [IsChecked];

        <!-- Обработка ключей атрибутов -->
        <xsl:for-each select="keys/key">
          INSERT INTO [VCLib].[T_DICTIONARY_ATTRIBUTE_KEY] (
          [DictionaryAttributeKeyID]
          , [Name]
          , [KeyLexem]
          ,[IsChecked]
          ,[DictionaryAttribute]
          )
          SELECT
          NEWID() AS [DictionaryAttributeKeyID]
          , CASE WHEN '<xsl:value-of select="@Name"/>' = '' THEN NULL ELSE '<xsl:value-of select="@Name"/>' END as [Name]
          , CASE WHEN '<xsl:value-of select="@KeyLexem"/>' = '' THEN NULL ELSE '<xsl:value-of select="@KeyLexem"/>' END as [KeyLexem]
          , CASE WHEN '<xsl:value-of select="@IsChecked"/>' = '1' THEN 1 ELSE 0 END as [IsChecked]
          , @DictionaryAttributeID as [DictionaryAttribute];
        </xsl:for-each>
      </xsl:for-each>

      -- Обработка зависимостей для текущего update
      <xsl:for-each select="depends/depend">
        INSERT INTO [VCLib].[T_DICTIONARY_DEPEND] (
        [DictionaryDependID],
        ,[DictionaryUpdate]
        ,[DependedDictionary]
        )
        SELECT
        NEWID() as [DictionaryDependID]
        ,@DictionaryUpdateId as [DictionaryUpdate]
        ,'<xsl:value-of select="@Code"/>' as [DependedDictionary];
      </xsl:for-each>
      END
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>