<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
   Name:  EntityAndAttributeInformation.xsl
   Author:  James W. Allor
   Date:  20050908
   Description:  XSLT stylesheet that transforms the Entity and Attribute
                 Information from the MIF to the MRF.
                 Please reference the MIF Specification and the GPMS Table 1.
   Modification History:
     Initial    Date      Change Request ID   Description
      JWA      20050908    N/A                 Initial Version 
      JWA      20051115    N/A                 Updated to reflect current MIF Spec.
-->

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>


  <xsl:template name="Entity_and_Attribute_Information">

    <xsl:element name="Entity_and_Attribute_Information">
     <!-- <xsl:comment>The very beginning</xsl:comment> -->
      <xsl:for-each-group
        select="Entity_Type_Label,
                                Entity_Type_Definition,
                                Entity_Type_Definition_Source,
                                Attribute_Label,
                                Attribute_Definition,
                                Attribute_Definition_Source,
                                Enumerated_Domain_Value,
                                Enumerated_Domain_Value_Definition,
                                Enumerated_Domain_Value_Definition_Source,
                                Range_Domain_Minimum,
                                Range_Domain_Maximum,
                                Attribute_Units_of_Measure,
                                Codeset_Name,
                                Codeset_Source,
                                Unrepresentable_Domain"
        group-by="@gid1">
        <xsl:sort select="current-grouping-key()" data-type="number"/>
        <xsl:sort select="current-grouping-key()" data-type="text"/>

        <xsl:variable name="gid1" select="current-grouping-key()"/>

     <!--   <xsl:comment>in place
          </xsl:comment> -->
        <xsl:element name="Detailed_Description">

          <xsl:element name="Entity_Type">
            <xsl:for-each select="current-group()">
              <xsl:if
                test="name()='Entity_Type_Label'
                          or name()='Entity_Type_Definition'
                          or name()='Entity_Type_Definition_Source'">
                <xsl:copy>
                  <xsl:apply-templates select="."/>
                </xsl:copy>
              </xsl:if>
            </xsl:for-each>
          </xsl:element>

          <!--  <xsl:comment>In place 2 pre gid2</xsl:comment> -->
          <xsl:for-each-group select="current-group()" group-by="@gid2">
            <xsl:sort select="current-grouping-key()" data-type="number"/>
            <xsl:sort select="current-grouping-key()" data-type="text"/>

            <xsl:variable name="gid2" select="current-grouping-key()"/>
            <xsl:variable name="gid2Length" select="string-length($gid2)"/>
            <xsl:variable name="numOfNodesED2"
              select="count(/MIF/Enumerated_Domain_Value[@gid1=$gid1][@gid2=$gid2])"/>
            <xsl:variable name="numOfNodesRd2"
              select="count(/MIF/Range_Domain_Minimum[@gid1=$gid1][@gid2=$gid2])"/>
            <xsl:variable name="numOfNodesCs2"
              select="count(/MIF/Codeset_Name[@gid1=$gid1][@gid2=$gid2])"/>
            <xsl:variable name="numOfNodesUD2"
              select="count(/MIF/Unrepresentable_Domain[@gid1=$gid1][@gid2=$gid2])"/>
            <xsl:variable name="totalNodes">
              <xsl:value-of select="$numOfNodesUD2+$numOfNodesRd2+$numOfNodesED2+$numOfNodesCs2"/>
            </xsl:variable>


            <!--  <xsl:comment>gid2Length:<xsl:value-of select="$gid2Length"/></xsl:comment>
            <xsl:comment>numOfNodesED:<xsl:value-of select="$numOfNodesED2"/></xsl:comment>
            <xsl:comment>numOfNodesRd:<xsl:value-of select="$numOfNodesRd2"/></xsl:comment>
            <xsl:comment>numOfNodesCs<xsl:value-of select="$numOfNodesCs2"/></xsl:comment>
            <xsl:comment>numOfNodesUD:<xsl:value-of select="$numOfNodesUD2"/></xsl:comment>
            <xsl:comment>totalNodes <xsl:value-of select="$totalNodes"/></xsl:comment>-->



            <xsl:choose>
              <xsl:when test="$totalNodes>0">

                <xsl:element name="Attribute">
                  <xsl:for-each select="current-group()">
                    <xsl:if
                      test="name()='Attribute_Label'
                            or name()='Attribute_Definition'
                            or name()='Attribute_Definition_Source'">
                      <xsl:copy>
                        <xsl:apply-templates select="."/>
                      </xsl:copy>
                    </xsl:if>
                  </xsl:for-each>
                   <!--<xsl:comment>doing the test</xsl:comment>
                   <xsl:comment>pregid2LengthTest</xsl:comment>
              <xsl:comment>gid2Length:<xsl:value-of select="$gid2Length"/></xsl:comment>
             
             
               <xsl:comment> IN place 3 (pre gid3 loop) $gid2Length ></xsl:comment>
                  <xsl:comment> IN place 3 (post test)gid2Length:<xsl:value-of select="$gid2Length"
                    /></xsl:comment> -->
                  <xsl:variable name="containsSpace" select="contains($gid2, ' ')"/>

                  <!--  <xsl:comment>containsSpace:<xsl:value-of select="$containsSpace"/> right before the current group!!!!!!!!! (in the test) </xsl:comment> -->


                  <xsl:for-each-group select="current-group()" group-by="@gid3">
                    <xsl:sort select="current-grouping-key()" data-type="number"/>
                    <xsl:sort select="current-grouping-key()" data-type="text"/>
                    <xsl:variable name="gid3" select="current-grouping-key()"/>
                    <xsl:variable name="lengthgid3" select="string-length($gid3)"/>
                    <xsl:variable name="containsW" select="contains($gid3,' ')"/>



                    <xsl:element name="Attribute_Domain_Values">
                      <xsl:variable name="gid3" select="current-grouping-key()"/>

                      <xsl:if
                        test="/MIF/Enumerated_Domain_Value[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3]">
                        <xsl:element name="Enumerated_Domain">
                          <xsl:for-each
                            select="/MIF/Enumerated_Domain_Value[@gid1=$gid1][@gid2=$gid2] [@gid3=$gid3],
                                      /MIF/Enumerated_Domain_Value_Definition[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3],
                                      /MIF/Enumerated_Domain_Value_Definition_Source[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3]">
                            <xsl:sort select="@gid3" data-type="number"/>
                            <xsl:sort select="@gid3" data-type="text"/>
                            <xsl:copy>
                              <xsl:apply-templates select="."/>
                            </xsl:copy>
                          </xsl:for-each>
                        </xsl:element>
                      </xsl:if>

                      <xsl:for-each-group select="current-group()" group-by="@gid3">
                        <xsl:sort select="current-grouping-key()" data-type="number"/>
                        <xsl:sort select="current-grouping-key()" data-type="text"/>
                        <xsl:variable name="gid3" select="current-grouping-key()"/>
                        <xsl:for-each select="current-group()">
                          <xsl:if test="name()='Range_Domain_Minimum'">
                            <xsl:element name="Range_Domain">
                              <xsl:for-each
                                select="/MIF/Range_Domain_Minimum[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3],
                                          /MIF/Range_Domain_Maximum[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3],
                                          /MIF/Attribute_Units_of_Measure[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3]">
                                <xsl:copy>
                                  <xsl:apply-templates select="."/>
                                </xsl:copy>
                              </xsl:for-each>
                            </xsl:element>
                          </xsl:if>
                        </xsl:for-each>
                      </xsl:for-each-group>

                      <xsl:for-each-group select="current-group()" group-by="@gid3">
                        <xsl:sort select="current-grouping-key()" data-type="number"/>
                        <xsl:sort select="current-grouping-key()" data-type="text"/>
                        <xsl:variable name="gid3" select="current-grouping-key()"/>
                        <xsl:for-each select="current-group()">
                          <xsl:if test="name()='Codeset_Name'">
                            <xsl:element name="Codeset_Domain">
                              <xsl:for-each
                                select="/MIF/Codeset_Name[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3],
                                          /MIF/Codeset_Source[@gid1=$gid1][@gid2=$gid2][@gid3=$gid3]">
                                <xsl:copy>
                                  <xsl:apply-templates select="."/>
                                </xsl:copy>
                              </xsl:for-each>
                            </xsl:element>
                          </xsl:if>
                        </xsl:for-each>
                      </xsl:for-each-group>

                      <xsl:for-each select="current-group()">
                        <xsl:if test="name()='Unrepresentable_Domain'">
                          <xsl:copy>
                            <xsl:apply-templates select="."/>
                          </xsl:copy>
                        </xsl:if>
                      </xsl:for-each>

                    </xsl:element>

                  </xsl:for-each-group>

                </xsl:element>

              </xsl:when>
              <xsl:otherwise>
                <xsl:comment>like a default</xsl:comment>
                <xsl:element name="Attribute">
                  <xsl:for-each select="current-group()">
                    <xsl:if
                      test="name()='Attribute_Label'
          or name()='Attribute_Definition'
          or name()='Attribute_Definition_Source'">
                      <xsl:copy>
                        <xsl:apply-templates select="."/>
                      </xsl:copy>
                    </xsl:if>
                  </xsl:for-each>
                  <xsl:element name="Attribute_Domain_Values">
                    <xsl:comment>gid1: <xsl:value-of select="$gid1"/></xsl:comment>
                    <xsl:comment>gid2:<xsl:value-of select="$gid2"/></xsl:comment>
                    <xsl:element name="Unrepresentable_Domain">Unable to find values!!!!!!! </xsl:element>
                  </xsl:element>
                </xsl:element>
              </xsl:otherwise>
            </xsl:choose>
            <!--    <xsl:comment> outside the choose structure!!!!!!!!!!!!</xsl:comment> -->
          </xsl:for-each-group>

        </xsl:element>

      </xsl:for-each-group>


      <xsl:for-each-group
        select="Entity_and_Attribute_Overview,
                                Entity_and_Attribute_Detail_Citation"
        group-by="@gid1">
        <xsl:sort select="current-grouping-key()" data-type="number"/>
        <xsl:sort select="current-grouping-key()" data-type="text"/>

        <xsl:element name="Overview_Description">
          <xsl:for-each select="current-group()">
            <xsl:copy>
              <xsl:apply-templates select="."/>
            </xsl:copy>
          </xsl:for-each>
        </xsl:element>

      </xsl:for-each-group>


    </xsl:element>

  </xsl:template>


</xsl:stylesheet>
<!-- Stylus Studio meta-information - (c) 2004-2005. Progress Software Corporation. All rights reserved.
<metaInformation>
<scenarios/><MapperMetaTag><MapperInfo srcSchemaPathIsRelative="yes" srcSchemaInterpretAsXML="no" destSchemaPath="" destSchemaRoot="" destSchemaPathIsRelative="yes" destSchemaInterpretAsXML="no"/><MapperBlockPosition></MapperBlockPosition></MapperMetaTag>
</metaInformation>
-->
