<?xml version="1.0" encoding="UTF-8"?>
<!--In diesem Script wird die edustore.xml für Modrian Version 4 erzeugt-->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<xsl:text>&#xA;</xsl:text>  
<xsl:comment>Automatisch generiert von Edustore durch tabelle_xml_mondrian4.xsl </xsl:comment>
<xsl:text>&#xA;</xsl:text>  
<Schema name="HISinOne" metamodelVersion="4.0">
<xsl:text>&#xA;</xsl:text>  
    
    <PhysicalSchema>
<!--erst Dimensionstabellen:-->
<xsl:for-each select="/ergebnisse/ergebnis/ergebniselement/sqlerg/row[col[f_name='is_fact_table_aggr_field']/wert='0' and col[f_name='foreignkey_tab']/wert !='']">
<xsl:variable name="foreignkey_tab"><xsl:value-of select="col[f_name='foreignkey_tab']/wert"/></xsl:variable>
<xsl:call-template name="getPhysicalSchema">
</xsl:call-template>
</xsl:for-each>
<!--dann Faktentabelle:-->
<xsl:for-each select="distinct-values(/ergebnisse/ergebnis/ergebniselement/sqlerg/row[col[f_name='fact_table_name']/wert!='']/col[f_name='fact_table_name' and wert !='']/wert)">
<Table name="{.}" alias= "{.}"/>
</xsl:for-each>

   </PhysicalSchema>
   
<!--Dimensionen-->
<xsl:for-each select="/ergebnisse/ergebnis/ergebniselement/sqlerg/row[col[f_name='is_fact_table_aggr_field' and wert='0']]">

        <xsl:variable name="hasAll">
			<xsl:choose>
			<xsl:when test="col[f_name='is_summable']/wert = '0'">false</xsl:when>
			<xsl:otherwise>true</xsl:otherwise>
			</xsl:choose>
		</xsl:variable>
	<xsl:variable name="dimensionName"><xsl:value-of select="concat('dim_',col[f_name='fact_table_field_name']/wert)" /></xsl:variable>
	<xsl:variable name="dimensionCaption"><xsl:value-of select="col[f_name='fact_table_field_caption']/wert" /></xsl:variable>
	
	<xsl:variable name="tableName"><xsl:value-of select="col[f_name='fact_table_name']/wert" /></xsl:variable>
        
        <Dimension caption="{$dimensionCaption}" name="{$dimensionName}" >
	<xsl:choose>
		<xsl:when test="col[f_name='foreignkey_tab']/wert !=''">
	<!-- mit Dim-Tabelle-->
	<xsl:attribute name="table">
	<xsl:choose>
	<xsl:when test="col[f_name='foreignkey_cond']/wert!=''">
	<xsl:value-of select="concat('view_',col[f_name='fact_table_field_name']/wert)" />
	</xsl:when>
	<xsl:otherwise>
	<xsl:value-of select="col[f_name='foreignkey_tab']/wert" />
	</xsl:otherwise>
	</xsl:choose>
	</xsl:attribute>
	<xsl:attribute name="key"><xsl:value-of select="concat('attr_',col[f_name='fact_table_field_name']/wert)" /></xsl:attribute>
	<Attributes>
	<Attribute caption="{col[f_name='fact_table_field_caption']/wert}" name="{concat('attr_',col[f_name='fact_table_field_name']/wert)}"
	keyColumn="{col[f_name='foreignkey_pk_col']/wert}" 
	 nameColumn="{col[f_name='foreignkey_name_col']/wert}"
	hasHierarchy="false" 
	orderByColumn="{col[f_name='foreignkey_ordinal_col']/wert}"/>  
  
	</Attributes>
	
	</xsl:when>
	<xsl:otherwise>
	<!--degenerateDimension-->
	<Hierarchy hasAll="true">
<!-- No table element here. Fact table is assumed. -->
<Level caption="{col[f_name='fact_table_field_caption']/wert}"
name="{concat('level_',col[f_name='fact_table_field_name']/wert)}" 
column="{col[f_name='fact_table_field_name']/wert}" uniqueMembers="true"/>
</Hierarchy>
	</xsl:otherwise>
	</xsl:choose>
	</Dimension>
	<!--
        <Attributes>
        <xsl:choose>
        <xsl:when test="$srctable != ''">
        <xsl:call-template name="getAttributes">
        <xsl:with-param name="srctable" select="$srctable" />
        <xsl:with-param name="name_trans" select="$name_trans" />
        <xsl:with-param name="srctable_pk" select="@srctable_pk" />
        <xsl:with-param name="srctable_type" select="@srctable_type" />
        <xsl:with-param name="srctable_namecolumn" select="@srctable_namecolumn" />
        </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <Attribute name="{$name_trans}" keyColumn="apnr" nameColumn="druck" caption="{@name}" orderByColumn="apnr">
                <xsl:choose>
                <xsl:when test="$hasAll = 'true'">
                    <xsl:attribute name="hierarchyAllMemberName">Alle</xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="hierarchyHasAll">false</xsl:attribute>
                </xsl:otherwise>
                </xsl:choose>
            </Attribute>
        </xsl:otherwise>
        </xsl:choose>
        </Attributes>
        <xsl:if test="$srctable != ''">
        <Hierarchies>
        <Hierarchy name="{@name}" allMemberName="Alle">
        <xsl:call-template name="getLevels">
        <xsl:with-param name="srctable" select="$srctable" />
        <xsl:with-param name="name_trans" select="$name_trans" />
        <xsl:with-param name="srctable_pk" select="@srctable_pk" />
        <xsl:with-param name="srctable_type" select="@srctable_type" />
        <xsl:with-param name="srctable_namecolumn" select="@srctable_namecolumn" />
        </xsl:call-template>
        </Hierarchy>
        </Hierarchies>
        </xsl:if>
        </Dimension>-->
 </xsl:for-each>
<Cube name="{concat('cube_',/ergebnisse/ergebnis/ergebniselement/sqlerg/row[@no='0']/col[f_name='fact_table_name']/wert)}" 
caption="{/ergebnisse/ergebnis/ergebniselement/sqlerg/row[@no='0']/col[f_name='fact_table_caption']/wert}">
    <Dimensions> 
    <xsl:for-each select="/ergebnisse/ergebnis/ergebniselement/sqlerg/row[col[f_name='is_fact_table_aggr_field' and wert='0']]">

      <Dimension source="{concat('dim_',col[f_name='fact_table_field_name']/wert)}"/>  
      </xsl:for-each>
     </Dimensions>
     <MeasureGroups> 
      <MeasureGroup table="{/ergebnisse/ergebnis/ergebniselement/sqlerg/row[@no='0']/col[f_name='fact_table_name']/wert}" 
      name="{concat('measuregroup_',/ergebnisse/ergebnis/ergebniselement/sqlerg/row[@no='0']/col[f_name='fact_table_name']/wert)}"> 
        <Measures> 
          <Measure name="{concat('measure_',/ergebnisse/ergebnis/ergebniselement/sqlerg/row/col[f_name='is_fact_table_aggr_field' and wert='1']/../col[f_name='fact_table_field_name']/wert)}" 
	  caption="{/ergebnisse/ergebnis/ergebniselement/sqlerg/row/col[f_name='is_fact_table_aggr_field' and wert='1']/../col[f_name='fact_table_field_caption']/wert}"
	  column="{/ergebnisse/ergebnis/ergebniselement/sqlerg/row/col[f_name='is_fact_table_aggr_field' and wert='1']/../col[f_name='fact_table_field_name']/wert}" 
	  aggregator="sum" formatString="#,###"/> 
        </Measures>  
        <DimensionLinks> 
	<xsl:for-each select="/ergebnisse/ergebnis/ergebniselement/sqlerg/row[col[f_name='is_fact_table_aggr_field']/wert='0' and col[f_name='foreignkey_tab']/wert !='']">

          <ForeignKeyLink dimension="{concat('dim_',col[f_name='fact_table_field_name']/wert)}" 
	  foreignKeyColumn="{col[f_name='fact_table_field_name']/wert}"/>  
     </xsl:for-each>
        </DimensionLinks> 
      </MeasureGroup> 
    </MeasureGroups> 
     </Cube>
      
        <xsl:for-each select="module/olap-system/cubes/cube">
<Cube name="{calculation/query-head/@fact-table}" caption="{name}">
    <Dimensions>
    <xsl:for-each select="dimensions/dimension">
    <Dimension source="{@blueprint}" />
    </xsl:for-each>
    </Dimensions>
    <MeasureGroups>
    <MeasureGroup table="{calculation/query-head/@fact-table}">
<Measures>
    <xsl:choose>
        <xsl:when test="measures">
            <xsl:for-each select="measures/measure">
<Measure>
<xsl:copy-of select="@*" />
<xsl:if test=". != ''">
<MeasureExpression>
<SQL>
<xsl:value-of select="." /> 
</SQL>
</MeasureExpression>
</xsl:if>
</Measure>
            </xsl:for-each>
 
        </xsl:when>
        <xsl:otherwise>
<Measure name="Anzahl" column="summe" aggregator="sum" formatString="#,###" />
        </xsl:otherwise>
    </xsl:choose>
</Measures>
    <DimensionLinks>
    <xsl:for-each select="dimensions/dimension">
    <xsl:variable name="name" 
    select="/module/olap-system/dimension-blueprints/dimension-blueprint[@system_key=current()/@blueprint]/@name"/>
    <ForeignKeyLink dimension="{@blueprint}" foreignKeyColumn="{@name}" />
    </xsl:for-each>
    </DimensionLinks>
    </MeasureGroup>
    </MeasureGroups>
</Cube>
        </xsl:for-each>

</Schema>
</xsl:template>

<xsl:template name="getAttributes">
<!--Wrapper für spezielle Dimensionstabellen oder Views -->
<xsl:param name="srctable" />
<xsl:param name="name_trans" />
<xsl:param name="srctable_pk" />
<xsl:param name="srctable_type" />
<xsl:param name="srctable_namecolumn" />
<!--alle Spalten außer dem Primärschlüssel sind Levels, wobei srctable_namecolumn die Namensspalte für den Primärschlüssel ist-->
<!--bei Views brauchen wir andere XPATH-Selektion als bei table-Elementen:-->
<xsl:choose>
<xsl:when test="$srctable_type='view'">
<xsl:for-each select="/module/database/views/view [@name=$srctable]/columns/column[@name != $srctable_pk ]">
<!--der Hierarchiehöchste Level muss im Mondrian-Schema am Anfang stehen, 
Konvention in BI ist aber, daß die höheren Levels ganz hinten stehen.
Daher sort order="descending" -->
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getAttributeElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_pk" select="$srctable_pk" />
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
<!-- falls die Dimension im Kernmodul definiert ist:-->
<xsl:for-each select="document('../install/conf/kern.xml')//module/database/views/view [@name=$srctable]/columns/column[@name != $srctable_pk ] ">
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getAttributeElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_pk" select="$srctable_pk" />
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="/module/database/table [@name=$srctable]/columns/column[@name != $srctable_pk ]">
<!--der Hierarchiehöchste Level muss im Mondrian-Schema am Anfang stehen, 
Konvention in BI ist aber, daß die höheren Levels ganz hinten stehen.
Daher sort order="descending" -->
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getAttributeElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_pk" select="$srctable_pk" />
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template name="getAttributeElement">
<!--erzeugt Level-Elemente für Spalten ind speziellen Dimensionstabellen/Views -->
<xsl:param name="srctable" />
<xsl:param name="name_trans" />
<xsl:param name="srctable_pk" />
<xsl:param name="srctable_namecolumn" />
<xsl:choose>
<xsl:when test="@currentlyUsed='false'">
<!-- Spalte ausblenden -->
</xsl:when>
<xsl:when test="@name=$srctable_namecolumn">
    <Attribute caption="{@description}" name="{$name_trans}" nameColumn="{@name}" keyColumn="{$srctable_pk}" hasHierarchy="false" orderByColumn="{$srctable_pk}" />
</xsl:when>
<xsl:otherwise>
<Attribute caption="{@description}" name="{$srctable}_{@name}" keyColumn="{@name}" hasHierarchy="false" orderByColumn="{@name}" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template name="getLevels">
<xsl:param name="srctable" />
<xsl:param name="name_trans" />
<xsl:param name="srctable_pk" />
<xsl:param name="srctable_type" />
<xsl:param name="srctable_namecolumn" />
<xsl:choose>
<xsl:when test="$srctable_type='view'">
<xsl:for-each select="/module/database/views/view [@name=$srctable]/columns/column[@name != $srctable_pk ]">
<!--der Hierarchiehöchste Level muss im Mondrian-Schema am Anfang stehen, 
Konvention in BI ist aber, daß die höheren Levels ganz hinten stehen.
Daher sort order="descending" -->
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getLevelElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
<!-- falls die Dimension im Kernmodul definiert ist:-->
<xsl:for-each select="document('../install/conf/kern.xml')//module/database/views/view [@name=$srctable]/columns/column[@name != $srctable_pk ] ">
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getLevelElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="/module/database/table [@name=$srctable]/columns/column[@name != $srctable_pk ]">
<!--der Hierarchiehöchste Level muss im Mondrian-Schema am Anfang stehen, 
Konvention in BI ist aber, daß die höheren Levels ganz hinten stehen.
Daher sort order="descending" -->
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:call-template name="getLevelElement">
<xsl:with-param name="srctable" select="$srctable"/>
<xsl:with-param name="name_trans" select="$name_trans"/>
<xsl:with-param name="srctable_namecolumn" select="$srctable_namecolumn" />
</xsl:call-template>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template name="getLevelElement">
<xsl:param name="srctable" />
<xsl:param name="name_trans" />
<xsl:param name="srctable_namecolumn" />
<xsl:choose>
<xsl:when test="@currentlyUsed='false'">
<!-- Spalte ausblenden -->
</xsl:when>
<xsl:when test="@name=$srctable_namecolumn">
<Level caption="{@description}" attribute="{$name_trans}" />
</xsl:when>
<xsl:otherwise>
<Level caption="{@description}" attribute="{$srctable}_{@name}" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="getPhysicalSchema">
<xsl:choose>
<xsl:when test="col[f_name='foreignkey_cond']/wert =''">
<Table name="{col[f_name='foreignkey_tab']/wert}" alias= "{col[f_name='foreignkey_tab']/wert}" keyColumn="{col[f_name='foreignkey_pk_col']/wert}"/>
</xsl:when>
<xsl:otherwise>
<Query alias="{concat('view_',col[f_name='fact_table_field_name']/wert)}"> 
      <ExpressionView> 
        <SQL dialect="generic">
	<xsl:text>SELECT </xsl:text><xsl:value-of select="col[f_name='foreignkey_pk_col']/wert"/><xsl:text>,</xsl:text>
	<xsl:value-of select="col[f_name='foreignkey_name_col']/wert"/><xsl:text> 
	FROM </xsl:text> <xsl:value-of select="col[f_name='foreignkey_tab']/wert"/><xsl:text> 
	WHERE </xsl:text> <xsl:value-of select="col[f_name='foreignkey_cond']/wert"/></SQL> 
      </ExpressionView> 
    </Query>
</xsl:otherwise>
</xsl:choose>

<!--[f_name='foreignkey_tab' and wert=$foreignkey_tab]
<xsl:for-each select="/ergebnisse/ergebnis/ergebniselement/sqlerg/row/col">


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