<?xml version="1.0" encoding="utf-8"?>
<!--

 Copyright (c) 2006, 2009, Oracle and/or its affiliates.All rights reserved. 

NAME
    kuacomm.xsl
DESCRIPTION 
    XSLT stylesheet: common templates for SXML => ALTER_XML conversions
    This stylesheet imports kuscommc.xsl, common templates for both
    this and SXML => DDL conversions
MODIFIED        MM/DD/YY
    abodge      01/14/09 - Copy 10.2.0.5GC on top of 11.2 DB Control
    lbarton     07/08/08 - bug 5709159: UnquotedSourceName
    lbarton     01/24/08 - Bug 6724820: move VERSION param to kuscommc.xsl
    rapayne     12/21/06 - add AlterCOL_LIST template
    lbarton     09/22/06 - parse item support
    rapayne     06/09/06 - Add CmpObjects template.
    rapayne     05/24/06 - creation.
-->
<xsl:stylesheet version="1.0" xmlns:sxml="http://xmlns.oracle.com/ku" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <!-- Top level imports -->
 <xsl:import href="kuscommc.xsl"/>
 <!-- Parameters referenced by imported templates. They are never set
      by the ALTERXML transform, but they must be defined and have
      the specified values. -->
 <xsl:param name="PRETTY">0</xsl:param>
 <xsl:param name="SQLTERMINATOR">0</xsl:param>
 <xsl:param name="SEGMENT_ATTRIBUTES">1</xsl:param>
 <xsl:param name="STORAGE">1</xsl:param>
 <xsl:param name="TABLESPACE">1</xsl:param>
 <xsl:param name="PARTITIONING">1</xsl:param>
 <xsl:param name="CONSTRAINTS">1</xsl:param>
 <xsl:param name="REF_CONSTRAINTS">1</xsl:param>
 <!-- params for parse -->
 <xsl:param name="PRS_XPATH">0</xsl:param>
 <xsl:param name="PRS_XPATH_NS">sxml:</xsl:param>
 <!-- templates -->
 <xsl:template match="/">
 <!-- *******************************************************************
Top level template for all objects
******************************************************************** -->
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template name="Object1">
  <xsl:param name="ParentNode" select="''"/>
  <!-- *******************************************************************
Template: Object1
Parameters:
 ParentNode - Parent node of SCHEMA, NAME
******************************************************************** -->
  <xsl:element name="OBJECT1">
   <xsl:call-template name="ObjectSchemaName">
    <xsl:with-param name="ParentNode" select="$ParentNode"/>
    <xsl:with-param name="ObjectNumber">1</xsl:with-param>
   </xsl:call-template>
  </xsl:element>
 </xsl:template>
 <xsl:template name="Object2">
  <xsl:param name="ParentNode" select="''"/>
  <!-- *******************************************************************
Template: Object2
Parameters:
 ParentNode - Parent node of SCHEMA, NAME
******************************************************************** -->
  <xsl:element name="OBJECT2">
   <xsl:call-template name="ObjectSchemaName">
    <xsl:with-param name="ParentNode" select="$ParentNode"/>
    <xsl:with-param name="ObjectNumber">2</xsl:with-param>
   </xsl:call-template>
  </xsl:element>
 </xsl:template>
 <xsl:template name="CmpObjects">
  <xsl:param name="ParentNode" select="''"/>
  <!-- *******************************************************************
Template:  CmpObjects
Parameters:
 ParentNode - Parent node of SCHEMA, NAME for both object 1
                       and object2.
******************************************************************** -->
  <!-- Object 1 -->
  <xsl:call-template name="Object1">
   <xsl:with-param name="ParentNode" select="."/>
  </xsl:call-template>
  <!-- Object 2 -->
  <xsl:call-template name="Object2">
   <xsl:with-param name="ParentNode" select="."/>
  </xsl:call-template>
 </xsl:template>
 <xsl:template name="ObjectSchemaName">
  <xsl:param name="ParentNode" select="''"/>
  <xsl:param name="ObjectNumber">1</xsl:param>
  <!-- *******************************************************************
Template: ObjectSchemaName
Parameters:
 ParentNode - Parent node of SCHEMA, NAME
 ObjectNumber - 1 (default) or 2
******************************************************************** -->
  <xsl:if test="$ParentNode/sxml:SCHEMA">
   <xsl:element name="SCHEMA">
    <xsl:apply-templates select="$ParentNode/sxml:SCHEMA">
     <xsl:with-param name="ObjectNumber" select="$ObjectNumber"/>
    </xsl:apply-templates>
   </xsl:element>
  </xsl:if>
  <xsl:element name="NAME">
   <xsl:apply-templates select="$ParentNode/sxml:NAME">
    <xsl:with-param name="ObjectNumber" select="$ObjectNumber"/>
   </xsl:apply-templates>
  </xsl:element>
 </xsl:template>
 <xsl:template match="sxml:SCHEMA | sxml:NAME">
  <xsl:param name="ObjectNumber">1</xsl:param>
  <!-- *******************************************************************
Template: SCHEMA | NAME
Parameters:
 ObjectNumber - 1 (default) or 2
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$ObjectNumber=1 and @value1">
    <xsl:value-of select="@value1"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="."/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="SchemaName">
  <xsl:param name="ParentNode" select="''"/>
  <!-- *******************************************************************
Template: SchemaName
 This template puts out "<schema>"."<name>"
Parameters:
 ParentNode - parent of SCHEMA and NAME
******************************************************************** -->
  <xsl:if test="$ParentNode/sxml:SCHEMA">
   <xsl:call-template name="SourceName">
    <xsl:with-param name="NameNode" select="$ParentNode/sxml:SCHEMA"/>
   </xsl:call-template>
   <xsl:text>.</xsl:text>
  </xsl:if>
  <xsl:call-template name="SourceName">
   <xsl:with-param name="NameNode" select="$ParentNode/sxml:NAME"/>
  </xsl:call-template>
 </xsl:template>
 <xsl:template name="SourceName">
  <xsl:param name="NameNode" select="''"/>
  <!-- *******************************************************************
Template: SourceName: emit the source name or schema.
 The schema/name values are from the value1 attribute, if present,
 otherwise the element content.  This lets the template handle the
 case of comparing object1 and object2 where the objects have different
 names or schemas.  The alter templates should always generate ALTERs
 to object1.  But if the objects have different names or schemas,
 object1's name and schema are in the value1 attribute rather than the
 element content, e.g.,
      <NAME value1="EMP1">EMP2</NAME>
Parameters:
 NameNode - NAME or SCHEMA node
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$NameNode/@value1">
    <xsl:call-template name="QuotedName">
     <xsl:with-param name="NameNode" select="$NameNode/@value1"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="QuotedName">
     <xsl:with-param name="NameNode" select="$NameNode"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="UnquotedSourceName">
  <xsl:param name="NameNode" select="''"/>
  <!-- *******************************************************************
Template: UnquotedSourceName: Like "SourceName" except the quotes are
 omitted.
Parameters:
 NameNode - NAME or SCHEMA node
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$NameNode/@value1">
    <xsl:value-of select="$NameNode/@value1"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="$NameNode"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="QuotedName">
  <xsl:param name="NameNode" select="''"/>
  <!-- *******************************************************************
Template: QuotedName
Parameters:
 NameNode - NAME node
******************************************************************** -->
  <xsl:if test="(not(contains($NameNode,'&quot;')))">"</xsl:if>
  <xsl:value-of select="$NameNode"/>
  <xsl:if test="(not(contains($NameNode,'&quot;')))">"</xsl:if>
 </xsl:template>
 <xsl:template name="AddParseItem">
  <xsl:param name="ParseIt">0</xsl:param>
  <xsl:param name="Item" select="''"/>
  <xsl:param name="Value1" select="''"/>
  <xsl:param name="Value2" select="''"/>
  <xsl:param name="Value3" select="''"/>
  <xsl:param name="Value4" select="''"/>
  <xsl:param name="Value5" select="''"/>
  <xsl:param name="Value6" select="''"/>
  <xsl:param name="Value7" select="''"/>
  <!-- *******************************************************************
Template: AddParseItem
Parameters:
 ParseIt : 1 = generate the parse item
 Item    : Item name
 Value1  : value
 Value2-7: if defined, these values are appended (space-separated) to Value1
******************************************************************** -->
  <xsl:if test="$ParseIt=1 and (string-length($Value1)!=0 or
                                string-length($Value2)!=0 or
                                string-length($Value3)!=0 or
                                string-length($Value4)!=0 or
                                string-length($Value5)!=0 or
                                string-length($Value6)!=0 or
                                string-length($Value7)!=0)">
   <xsl:element name="PARSE_LIST_ITEM">
    <xsl:element name="ITEM">
     <xsl:value-of select="$Item"/>
    </xsl:element>
    <xsl:element name="VALUE">
     <xsl:if test="string-length($Value1)!=0">
      <xsl:value-of select="$Value1"/>
     </xsl:if>
     <xsl:if test="string-length($Value2)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value2"/>
     </xsl:if>
     <xsl:if test="string-length($Value3)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value3"/>
     </xsl:if>
     <xsl:if test="string-length($Value4)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value4"/>
     </xsl:if>
     <xsl:if test="string-length($Value5)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value5"/>
     </xsl:if>
     <xsl:if test="string-length($Value6)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value6"/>
     </xsl:if>
     <xsl:if test="string-length($Value7)!=0">
      <xsl:text> </xsl:text>
      <xsl:value-of select="$Value7"/>
     </xsl:if>
    </xsl:element>
   </xsl:element>
  </xsl:if>
 </xsl:template>
 <xsl:template name="AddXPathParseItem">
  <xsl:param name="Node" select="''"/>
  <!-- *******************************************************************
Template: AddXPathParseItem
Parameters:
 Node - Node whose XPath we generate
******************************************************************** -->
  <xsl:if test="$PRS_XPATH=1">
   <xsl:element name="PARSE_LIST_ITEM">
    <xsl:element name="ITEM">XPATH</xsl:element>
    <xsl:element name="VALUE">
     <xsl:call-template name="GenXPath">
      <xsl:with-param name="Node" select="$Node"/>
     </xsl:call-template>
    </xsl:element>
   </xsl:element>
  </xsl:if>
 </xsl:template>
 <xsl:template name="GenXPath">
  <xsl:param name="Node" select="''"/>
  <!-- *******************************************************************
Template: GenXPath - recursive template to generate XPath
Parameters:
 Node - current node
******************************************************************** -->
  <!-- In Oracle C-based XSL parser, the local name of the document root node
     is '#document' -->
  <xsl:if test="string-length(local-name($Node))!=0 and local-name($Node)!='#document'">
   <xsl:call-template name="GenXPath">
    <xsl:with-param name="Node" select="$Node/parent::node()"/>
   </xsl:call-template>
   <xsl:text>/</xsl:text>
   <xsl:value-of select="$PRS_XPATH_NS"/>
   <xsl:value-of select="local-name($Node)"/>
   <xsl:variable name="thisPosition" select="count($Node/preceding-sibling::*[name($Node)=name()])"/>
   <xsl:variable name="numFollowing" select="count($Node/following-sibling::*[name($Node)=name()])"/>
   <xsl:if test="$thisPosition+$numFollowing &gt; 0">
    <xsl:value-of select="concat('[',$thisPosition+1,']')"/>
   </xsl:if>
  </xsl:if>
 </xsl:template>
 <xsl:template name="AlterCOL_LIST">
  <xsl:param name="ColListItems" select="''"/>
  <!-- ***********************
Template: AlterCOL_LIST 
Parameters:
ColListItems - COL_LIST_ITEM nodes
******************************************************************** -->
  <xsl:for-each select="$ColListItems">
   <xsl:choose>
    <xsl:when test="@src='1'"/>
    <xsl:otherwise>
     <xsl:if test="position()!=1">
      <!-- to avoid the last item is @src='1' -->
      <xsl:text>,</xsl:text>
     </xsl:if>
     <xsl:call-template name="QuotedName">
      <xsl:with-param name="NameNode" select="sxml:NAME"/>
     </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </xsl:template>
 <xsl:template name="CommonNotAlterable">
  <xsl:param name="NameParent" select="''"/>
  <xsl:param name="Reason" select="''"/>
  <!-- *******************************************************************
Template: CommonNotAlterable
Parameters:
 NameParent
 Reason:   
******************************************************************** -->
  <xsl:element name="ALTER_LIST_ITEM">
   <xsl:element name="PARSE_LIST">
    <xsl:call-template name="AddXPathParseItem">
     <xsl:with-param name="Node" select="$NameParent"/>
    </xsl:call-template>
    <xsl:if test="$NameParent/sxml:NAME">
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_NAME"/>
      <xsl:with-param name="Item">NAME</xsl:with-param>
      <xsl:with-param name="Value1" select="$NameParent/sxml:NAME"/>
     </xsl:call-template>
    </xsl:if>
    <xsl:call-template name="AddParseItem">
     <xsl:with-param name="ParseIt" select="$PRS_ALTERABLE"/>
     <xsl:with-param name="Item">NOT_ALTERABLE</xsl:with-param>
     <xsl:with-param name="Value1" select="$Reason"/>
    </xsl:call-template>
   </xsl:element>
  </xsl:element>
 </xsl:template>

</xsl:stylesheet>
