MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/rdbms/xml/xsl/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/rdbms/xml/xsl/kualob.xsl

<?xml version="1.0"?>
<!--

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

NAME
    kualob.xsl
DESCRIPTION
    Convert column diffs in sxml TABLE diff document to ALTER_XML document
    This is for diffs in LOBs, UDTs, nested tables and VARRAYs.

MODIFIED        MM/DD/YY
    lbarton     11/12/09 - bug 8796742: translatable error messages
    lbarton     09/21/09 - bug 8820324: support all values in deferred_stg
    rapayne     06/30/08 - handle securefile/basicfile diff when moving/modifying lobs
    lbarton     07/10/08 - bug 5709159: SQL_LIST_ITEM subelements
    lbarton     03/06/08 - xmltype col properties
    htseng      12/27/06 - add objtype for support materialized view
    lbarton     09/22/05 - Initial version
 -->
<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="kuacomm.xsl"/>
 <xsl:import href="kustablc.xsl"/>
 <!-- Templates -->
 <xsl:template name="ModifyLob">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <xsl:param name="LobProperties" select="''"/>
  <xsl:param name="ObjType" select="'TABLE'"/>
  <xsl:param name="Action" select="''"/>
  <!-- *******************************************************************
Template: ModifyLob
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
 LobProperties - LOB_PROPERTIES
 Action = "PARSE" or "SQL"
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or 
                                        $PRS_CLAUSE_TYPE=1 or
                                        $PRS_COLUMN_ATTRIBUTE=1 or
                                        $PRS_ALTERABLE=1 or
                                        $PRS_XPATH=1)">
    <xsl:element name="PARSE_LIST">
     <xsl:call-template name="AddXPathParseItem">
      <xsl:with-param name="Node" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]"/>
     </xsl:call-template>
     <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="$NameNode"/>
     </xsl:call-template>
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
      <xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
      <xsl:with-param name="Value1">MODIFY_LOB</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:when test="$Action='SQL'">
    <xsl:element name="SQL_LIST">
     <xsl:element name="SQL_LIST_ITEM">
      <xsl:element name="TEXT">
       <xsl:text>ALTER </xsl:text>
       <xsl:value-of select="$ObjType"/>
       <xsl:text> </xsl:text>
       <xsl:call-template name="SchemaName">
        <xsl:with-param name="ParentNode" select="$TableNode"/>
       </xsl:call-template>
       <xsl:choose>
        <!-- use the more expensive MOVE LOB option if we have to -->
        <xsl:when test="$LobProperties/sxml:STORAGE_TABLE/sxml:TABLESPACE/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:STORAGE_IN_ROW/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:SECUREFILE/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:CHUNK/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:NAME/@src or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:NAME/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:STORAGE/sxml:INITIAL/@src or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:STORAGE/sxml:INITIAL/@value1 or
                  $LobProperties/sxml:STORAGE_TABLE/sxml:SECUREFILE/@src">
        <xsl:text> MOVE LOB (</xsl:text>
        <xsl:call-template name="QuotedName">
         <xsl:with-param name="NameNode" select="$NameNode"/>
        </xsl:call-template>
        <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:DATATYPE='XMLTYPE'">.XMLDATA</xsl:if>
        <xsl:text>) STORE AS </xsl:text>
        <xsl:choose>
         <xsl:when test="$LobProperties/sxml:STORAGE_TABLE/sxml:SECUREFILE/@src=2">
          <xsl:text>SECUREFILE </xsl:text>
         </xsl:when>
         <xsl:when test="$LobProperties/sxml:STORAGE_TABLE/sxml:BASICFILE/@src=2 or 
                                     $LobProperties/sxml:STORAGE_TABLE/sxml:SECUREFILE/@src=1">
          <xsl:text>BASICFILE </xsl:text>
         </xsl:when>
        </xsl:choose>
        <xsl:if test="$LobProperties/sxml:STORAGE_TABLE/sxml:NAME and
                           not($LobProperties/sxml:STORAGE_TABLE/sxml:NAME/@src='1')">
         <xsl:call-template name="QuotedName">
           <xsl:with-param name="NameNode" select="$LobProperties/sxml:STORAGE_TABLE/sxml:NAME"/>
          </xsl:call-template>
         </xsl:if>
         <xsl:apply-templates select="$LobProperties">
          <xsl:with-param name="DataType" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:DATATYPE"/>
         </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
         <xsl:text> MODIFY LOB (</xsl:text>
         <xsl:call-template name="QuotedName">
          <xsl:with-param name="NameNode" select="$NameNode"/>
         </xsl:call-template>
         <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:DATATYPE='XMLTYPE'">.XMLDATA</xsl:if>
         <xsl:text>) </xsl:text>
         <xsl:apply-templates select="$LobProperties">
          <xsl:with-param name="DataType" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:DATATYPE"/>
          <xsl:with-param name="ModifyLobStorage">1</xsl:with-param>
         </xsl:apply-templates>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:element>
     </xsl:element>
     <!-- This does not seem applicable in the non-nested table case...
<xsl:if test="$LobProperties/sxml:STORAGE_TABLE/sxml:NAME/@value1">
      <xsl:element name="SQL_LIST_ITEM">
       <xsl:element name="TEXT">
        <xsl:text>ALTER TABLE </xsl:text>
        <xsl:call-template name="SchemaName">
         <xsl:with-param name="ParentNode" select="$LobProperties/sxml:STORAGE_TABLE"/>
        </xsl:call-template>
        <xsl:text> RENAME TO </xsl:text>
        <xsl:call-template name="QuotedName">
         <xsl:with-param name="NameNode" select="$LobProperties/sxml:STORAGE_TABLE/sxml:NAME"/>
        </xsl:call-template>
       </xsl:element>
      </xsl:element>
     </xsl:if-->
    </xsl:element>
   </xsl:when>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="DoModifyUDT">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <!-- *******************************************************************
Template: DoModifyUDT
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
******************************************************************** -->
  <xsl:variable name="ColListItemNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]"/>
  <xsl:choose>
   <xsl:when test="$ColListItemNode/sxml:SUBSTITUTABLE='Y' and not ($ColListItemNode/sxml:OF_TYPE)">
    <xsl:element name="ALTER_LIST_ITEM">
     <xsl:call-template name="ModifyUDT">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="$NameNode"/>
      <xsl:with-param name="ColListItemNode" select="$ColListItemNode"/>
      <xsl:with-param name="Action">PARSE</xsl:with-param>
     </xsl:call-template>
     <xsl:call-template name="ModifyUDT">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="$NameNode"/>
      <xsl:with-param name="ColListItemNode" select="$ColListItemNode"/>
      <xsl:with-param name="Action">SQL</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:otherwise>
    <xsl:variable name="Subst">
     <xsl:call-template name="QuotedName">
      <xsl:with-param name="NameNode" select="$NameNode"/>
     </xsl:call-template>
    </xsl:variable>
    <xsl:call-template name="CommonNotAlterable">
     <xsl:with-param name="XpathNode" select="$ColListItemNode"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="Reason">SUBSTITUTABLE_COLUMN</xsl:with-param>
     <xsl:with-param name="Message" select="$MSG_SUBSTITUTABLE_COLUMN"/>
     <xsl:with-param name="Subst" select="$Subst"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="ModifyUDT">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColListItemNode" select="''"/>
  <xsl:param name="Action" select="''"/>
  <!-- *******************************************************************
Template: ModifyUDT
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColListItemNode - node in colproperties/col list for this column
 Action = "PARSE" or "SQL"
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or 
                                        $PRS_CLAUSE_TYPE=1 or
                                        $PRS_COLUMN_ATTRIBUTE=1 or
                                        $PRS_ALTERABLE=1 or
                                        $PRS_XPATH=1)">
    <xsl:element name="PARSE_LIST">
     <xsl:call-template name="AddXPathParseItem">
      <xsl:with-param name="Node" select="$ColListItemNode"/>
     </xsl:call-template>
     <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="$NameNode"/>
     </xsl:call-template>
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
      <xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
      <xsl:with-param name="Value1">SUBSTITUTABLE_COLUMN</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:when test="$Action='SQL'">
    <xsl:element name="SQL_LIST">
     <xsl:element name="SQL_LIST_ITEM">
      <xsl:element name="TEXT">
       <xsl:text>ALTER TABLE </xsl:text>
       <xsl:call-template name="SchemaName">
        <xsl:with-param name="ParentNode" select="$TableNode"/>
       </xsl:call-template>
       <xsl:text> MODIFY COLUMN </xsl:text>
       <xsl:call-template name="QuotedName">
        <xsl:with-param name="NameNode" select="$NameNode"/>
       </xsl:call-template>
       <xsl:apply-templates select="$ColListItemNode/sxml:SUBSTITUTABLE"/>
      </xsl:element>
     </xsl:element>
    </xsl:element>
   </xsl:when>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="ModifyNestedTable">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <!-- *******************************************************************
Template: ModifyNestedTable
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
******************************************************************** -->
  <!-- RETURN AS -->
  <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:RETURN_AS/@value1">
   <xsl:element name="ALTER_LIST_ITEM">
    <xsl:call-template name="ModifyNTReturnAs">
     <xsl:with-param name="TableNode" select="$TableNode"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="ColProperties" select="$ColProperties"/>
     <xsl:with-param name="Action">PARSE</xsl:with-param>
    </xsl:call-template>
    <xsl:call-template name="ModifyNTReturnAs">
     <xsl:with-param name="TableNode" select="$TableNode"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="ColProperties" select="$ColProperties"/>
     <xsl:with-param name="Action">SQL</xsl:with-param>
    </xsl:call-template>
   </xsl:element>
  </xsl:if>
  <!-- Storage Table physical properties -->
  <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:PHYSICAL_PROPERTIES//*[@value1] or $ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:PHYSICAL_PROPERTIES//*[@src]">
   <xsl:call-template name="DoModifyNTStorageTablePhysical">
    <xsl:with-param name="TableNode" select="$TableNode"/>
    <xsl:with-param name="NameNode" select="$NameNode"/>
    <xsl:with-param name="PhysicalProperties" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:PHYSICAL_PROPERTIES"/>
   </xsl:call-template>
  </xsl:if>
  <!-- Storage Table column properties -->
  <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:TABLE_PROPERTIES/sxml:COLUMN_PROPERTIES//*[@value1] or $ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:TABLE_PROPERTIES/sxml:COLUMN_PROPERTIES//*[@src]">
   <xsl:call-template name="ColProperties">
    <xsl:with-param name="ParentNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE"/>
    <xsl:with-param name="ColListNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:TABLE_PROPERTIES/sxml:COLUMN_PROPERTIES/sxml:COL_LIST"/>
    <xsl:with-param name="ColProperties" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:TABLE_PROPERTIES/sxml:COLUMN_PROPERTIES"/>
   </xsl:call-template>
  </xsl:if>
  <!-- Storage Table Name -->
  <xsl:if test="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:NAME/@value1">
   <xsl:element name="ALTER_LIST_ITEM">
    <xsl:call-template name="ModifyNTStorageTableName">
     <xsl:with-param name="TableNode" select="$TableNode"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="ColProperties" select="$ColProperties"/>
     <xsl:with-param name="Action">PARSE</xsl:with-param>
    </xsl:call-template>
    <xsl:call-template name="ModifyNTStorageTableName">
     <xsl:with-param name="TableNode" select="$TableNode"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="ColProperties" select="$ColProperties"/>
     <xsl:with-param name="Action">SQL</xsl:with-param>
    </xsl:call-template>
   </xsl:element>
  </xsl:if>
 </xsl:template>
 <xsl:template name="ModifyNTReturnAs">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <xsl:param name="Action" select="''"/>
  <!-- *******************************************************************
Template: ModifyNTReturnAs
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
 Action = "PARSE" or "SQL"
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or 
                                        $PRS_CLAUSE_TYPE=1 or
                                        $PRS_COLUMN_ATTRIBUTE=1 or
                                        $PRS_ALTERABLE=1 or
                                        $PRS_XPATH=1)">
    <xsl:element name="PARSE_LIST">
     <xsl:call-template name="AddXPathParseItem">
      <xsl:with-param name="Node" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]"/>
     </xsl:call-template>
     <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="$NameNode"/>
     </xsl:call-template>
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
      <xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
      <xsl:with-param name="Value1">COLLECTION_RETRIEVAL</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:when test="$Action='SQL'">
    <xsl:element name="SQL_LIST">
     <xsl:element name="SQL_LIST_ITEM">
      <xsl:element name="TEXT">
       <xsl:text>ALTER TABLE </xsl:text>
       <xsl:call-template name="SchemaName">
        <xsl:with-param name="ParentNode" select="$TableNode"/>
       </xsl:call-template>
       <xsl:text> MODIFY NESTED TABLE </xsl:text>
       <xsl:call-template name="QuotedName">
        <xsl:with-param name="NameNode" select="$NameNode"/>
       </xsl:call-template>
       <xsl:apply-templates select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:RETURN_AS"/>
      </xsl:element>
     </xsl:element>
    </xsl:element>
   </xsl:when>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="ModifyNTStorageTableName">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <xsl:param name="Action" select="''"/>
  <!-- *******************************************************************
Template: ModifyNTStorageTableName
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
 Action = "PARSE" or "SQL"
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or 
                                        $PRS_CLAUSE_TYPE=1 or
                                        $PRS_COLUMN_ATTRIBUTE=1 or
                                        $PRS_ALTERABLE=1 or
                                        $PRS_XPATH=1)">
    <xsl:element name="PARSE_LIST">
     <xsl:call-template name="AddXPathParseItem">
      <xsl:with-param name="Node" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:NAME"/>
     </xsl:call-template>
     <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="$NameNode"/>
     </xsl:call-template>
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
      <xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
      <xsl:with-param name="Value1">RENAME_STORAGE_TABLE</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:when test="$Action='SQL'">
    <xsl:element name="SQL_LIST">
     <xsl:element name="SQL_LIST_ITEM">
      <xsl:element name="TEXT">
       <xsl:text>ALTER TABLE </xsl:text>
       <xsl:call-template name="SchemaName">
        <xsl:with-param name="ParentNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE"/>
       </xsl:call-template>
       <xsl:text> RENAME TO </xsl:text>
       <xsl:call-template name="QuotedName">
        <xsl:with-param name="NameNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:NESTED_TABLE_PROPERTIES/sxml:STORAGE_TABLE/sxml:NAME"/>
       </xsl:call-template>
      </xsl:element>
     </xsl:element>
    </xsl:element>
   </xsl:when>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="DoModifyNTStorageTablePhysical">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="PhysicalProperties" select="''"/>
  <!-- *******************************************************************
Template: DoModifyNTStorageTablePhysical
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 PhysicalProperties= TABLE_PROPERTIES/COLUMN_PROPERTIES/.../PHYSICAL_PROPERTIES
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$PhysicalProperties/sxml:HEAP_TABLE/@src and $PhysicalProperties/sxml:INDEX_ORGANIZED_TABLE/@src">
    <xsl:variable name="Subst">
     <xsl:call-template name="QuotedName">
      <xsl:with-param name="NameNode" select="$NameNode"/>
     </xsl:call-template>
    </xsl:variable>
    <xsl:call-template name="CommonNotAlterable">
     <xsl:with-param name="XpathNode" select="$PhysicalProperties"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="Reason">NESTED_TABLE_ORGNIZATION</xsl:with-param>
     <xsl:with-param name="Message" select="$MSG_NESTED_TABLE_ORGANIZATION"/>
     <xsl:with-param name="Subst" select="$Subst"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:element name="ALTER_LIST_ITEM">
     <xsl:call-template name="ModifyNTStorageTablePhysical">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="$NameNode"/>
      <xsl:with-param name="PhysicalProperties" select="$PhysicalProperties"/>
      <xsl:with-param name="Action">PARSE</xsl:with-param>
     </xsl:call-template>
     <xsl:call-template name="ModifyNTStorageTablePhysical">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="$NameNode"/>
      <xsl:with-param name="PhysicalProperties" select="$PhysicalProperties"/>
      <xsl:with-param name="Action">SQL</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="ModifyNTStorageTablePhysical">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="PhysicalProperties" select="''"/>
  <xsl:param name="Action" select="''"/>
  <!-- *******************************************************************
Template: ModifyNTStorageTablePhysical
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 PhysicalProperties= TABLE_PROPERTIES/COLUMN_PROPERTIES/.../PHYSICAL_PROPERTIES
 Action = "PARSE" or "SQL"
******************************************************************** -->
  <xsl:choose>
   <xsl:when test="$Action='PARSE' and ($PRS_NAME=1 or 
                                        $PRS_CLAUSE_TYPE=1 or
                                        $PRS_COLUMN_ATTRIBUTE=1 or
                                        $PRS_ALTERABLE=1 or
                                        $PRS_XPATH=1)">
    <xsl:element name="PARSE_LIST">
     <xsl:call-template name="AddXPathParseItem">
      <xsl:with-param name="Node" select="$PhysicalProperties"/>
     </xsl:call-template>
     <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="$NameNode"/>
     </xsl:call-template>
     <xsl:call-template name="AddParseItem">
      <xsl:with-param name="ParseIt" select="$PRS_CLAUSE_TYPE"/>
      <xsl:with-param name="Item">CLAUSE_TYPE</xsl:with-param>
      <xsl:with-param name="Value1">STORAGE_TABLE_PHYSICAL_PROPERTIES</xsl:with-param>
     </xsl:call-template>
    </xsl:element>
   </xsl:when>
   <xsl:when test="$Action='SQL'">
    <xsl:element name="SQL_LIST">
     <xsl:element name="SQL_LIST_ITEM">
      <xsl:element name="TEXT">
       <xsl:text>ALTER TABLE </xsl:text>
       <xsl:call-template name="SchemaName">
        <xsl:with-param name="ParentNode" select="$PhysicalProperties/.."/>
       </xsl:call-template>
       <xsl:text> MOVE </xsl:text>
       <!-- one of these will work: either heap table -->
       <xsl:apply-templates select="$PhysicalProperties/sxml:HEAP_TABLE/sxml:SEGMENT_ATTRIBUTES">
        <xsl:with-param name="DoCompress">N</xsl:with-param>
       </xsl:apply-templates>
       <!-- or IOT -->
       <xsl:apply-templates select="$PhysicalProperties/sxml:INDEX_ORGANIZED_TABLE/sxml:SEGMENT_ATTRIBUTES">
        <xsl:with-param name="DoCompress">N</xsl:with-param>
       </xsl:apply-templates>
       <!-- and if it's an IOT, these will also work -->
       <xsl:apply-templates select="$PhysicalProperties/sxml:INDEX_ORGANIZED_TABLE/sxml:PCTTHRESHOLD"/>
         <xsl:apply-templates select="$PhysicalProperties/sxml:INDEX_ORGANIZED_TABLE/sxml:OVERFLOW"/>
      </xsl:element>
     </xsl:element>
    </xsl:element>
   </xsl:when>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="ModifyXMLType">
  <xsl:param name="TableNode" select="''"/>
  <xsl:param name="NameNode" select="''"/>
  <xsl:param name="ColProperties" select="''"/>
  <!-- *******************************************************************
Template: ModifyXMLType
Parameters:
 TableNode  - parent of table SCHEMA/NAME
 NameNode   - column name
 ColProperties - TABLE_PROPERTIES/COLUMN_PROPERTIES
******************************************************************** -->
  <xsl:variable name="StorageNode" select="$ColProperties/sxml:COL_LIST/sxml:COL_LIST_ITEM[sxml:NAME=$NameNode]/sxml:XMLTYPE_PROPERTIES/sxml:XMLTYPE_STORAGE"/>
  <xsl:choose>
   <xsl:when test="$StorageNode/sxml:STORE_AS/@value1">
    <xsl:variable name="Subst">
     <xsl:call-template name="QuotedName">
      <xsl:with-param name="NameNode" select="$NameNode"/>
     </xsl:call-template>
    </xsl:variable>
    <xsl:call-template name="CommonNotAlterable">
      <xsl:with-param name="XpathNode" select="$StorageNode/sxml:STORE_AS"/>
     <xsl:with-param name="NameNode" select="$NameNode"/>
     <xsl:with-param name="Reason">XMLTYPE_STORAGE_TYPE</xsl:with-param>
     <xsl:with-param name="Message" select="$MSG_XMLTYPE_STORAGE_TYPE"/>
     <xsl:with-param name="Subst" select="$Subst"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:when test="$StorageNode/sxml:LOB_PROPERTIES//*[@value1]">
    <xsl:element name="ALTER_LIST_ITEM">
     <xsl:call-template name="ModifyLob">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="sxml:NAME"/>
      <xsl:with-param name="ColProperties" select="$ColProperties"/>
      <xsl:with-param name="LobProperties" select="$StorageNode/sxml:LOB_PROPERTIES"/>
      <xsl:with-param name="Action">PARSE</xsl:with-param>
     </xsl:call-template>
     <xsl:call-template name="ModifyLob">
      <xsl:with-param name="TableNode" select="$TableNode"/>
      <xsl:with-param name="NameNode" select="sxml:NAME"/>
      <xsl:with-param name="ColProperties" select="$ColProperties"/>
      <xsl:with-param name="LobProperties" select="$StorageNode/sxml:LOB_PROPERTIES"/>
      <xsl:with-param name="Action">SQL</xsl:with-param>
     </xsl:call-template>
    </xsl:element> 
   </xsl:when>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

OHA YOOOO