<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://xml.insee.intra/schema/annuaire/"
    xmlns:a="http://xml.insee.intra/schema/annuaire/" xmlns:q="http://xml.insee.intra/schema/qbe/"
    xmlns:l="http://xml.insee.intra/schema/ldap/" xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl" exclude-result-prefixes="a l" version="1.0">
    <!-- 
    
    This transformation implements default what clauses, ie the fact that :
    
    <q:select>
      <q:where>
        <inseePerson>
        ....
      </inseePerson>
      </q:where>
    </q:select>
    
    is equivalent to:
    
    <q:select>
      <q:where>
        <inseePerson>
        ....
        </inseePerson>
      </q:where>
      <q:what>
        <inseePerson/>
      </q:what>
    </q:select>
    
    or, in flat RDF:
    
    <q:select rdf:ID="d0e3">
      <q:where rdf:resource="#d0e5"/>
    </q:select>
    <inseePerson rdf:ID="d0e5">
      <q:if-not rdf:resource="#d0e7"/>
    </inseePerson>
    
    is equivalent to:
    
    <q:select rdf:ID="d0e3">
      <q:what rdf:resource="#d0e5"/>
      <q:where rdf:resource="#d0e7"/>
    </q:select>
    <inseePerson rdf:ID="d0e5"/>
    <inseePerson rdf:ID="d0e7">
      <q:if-not rdf:resource="#d0e9"/>
    </inseePerson>
    
    -->
    <xsl:import href="literals.xsl"/>
    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="resources" match="*[@rdf:ID]" use="concat('#', @rdf:ID)"/>
    <xsl:template match="/*">
        <xsl:apply-templates select="." mode="defwhat"/>
    </xsl:template>
    <xsl:template match="/*" mode="defwhat">
        <xsl:copy>
            <xsl:variable name="literals">
                <xsl:apply-templates select="." mode="literals"/>
            </xsl:variable>
            <xsl:apply-templates select="exsl:node-set($literals)/*/*" mode="defwhat"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*|@*" mode="defwhat">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="defwhat"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="q:select[not(q:what)]" mode="defwhat">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="defwhat"/>
            <q:what rdf:resource="#{generate-id()}"/>
        </xsl:copy>
        <xsl:element name="{name(key('resources', q:where/@rdf:resource))}">
            <xsl:attribute name="rdf:ID">
                <xsl:value-of select="generate-id()"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

