<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xml="http://www.w3.org/XML/1998/namespace"
    xmlns="http://purl.org/net/inloc/"
    xmlns:inloc="http://purl.org/net/inloc/"
    version="1.0"
    exclude-result-prefixes="xsi xml">
    <xsl:output method="text" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>
    <xsl:strip-space elements="*"/>
    
<!--
        <xsl:variable name="ns" select="tokenize(inloc:LOCstructure/@id,'/')[last()]"/>
-->
    
    <xsl:template match="inloc:LOCstructure">
<xsl:text>{"LOCstructure": {
</xsl:text>

<!-- ********* LOCtypeLOC ************** -->
        <xsl:call-template name="LOCtypeLOC"/>

        <xsl:if test="inloc:combinationRules">
            <xsl:text>    "combinationRules": [
</xsl:text> 
            <xsl:for-each select="inloc:combinationRules">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:combinationRules">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
        </xsl:if>

        <xsl:if test="inloc:LOCstructure|inloc:LOCdefinition|inloc:LOCassociation">
            <xsl:text>,
</xsl:text>
        </xsl:if>
        
<!-- ********* TEST LOCassociation ************** -->        
        <xsl:if test="inloc:LOCassociation">
            <xsl:text>    "LOCassociation": [
</xsl:text> 
            <xsl:for-each select="inloc:LOCassociation">
                <xsl:call-template name="LOCassociation"/>
                <xsl:if test="following-sibling::inloc:LOCassociation">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text> 
            <xsl:if test="inloc:LOCstructure|inloc:LOCdefinition">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>

<!-- ********* TEST LOCdefinition ************** -->
        <xsl:if test="inloc:LOCdefinition">
            <xsl:text>    "LOCdefinition": [
</xsl:text> 
            <xsl:for-each select="inloc:LOCdefinition">
                <xsl:call-template name="LOCdefinition"/>
                <xsl:if test="following-sibling::inloc:LOCdefinition">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text> 
            <xsl:if test="inloc:LOCstructure">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>

        <xsl:text>
}}</xsl:text>        
    </xsl:template>

<!-- ********* TEMPLATE LOCtypeLOC ************** -->
    <xsl:template name="LOCtypeLOC">
        <xsl:if test="@id">
        <xsl:text>    "id": "</xsl:text>
        <xsl:value-of select="@id"/>
        <xsl:text>"</xsl:text>
            <xsl:if test="@xml:lang|inloc:extraID|inloc:title|inloc:abbr|inloc:description|inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>

        <xsl:if test="@xml:lang!=''">
            <xsl:text>    "lang": "</xsl:text> 
            <xsl:value-of select="@xml:lang"/>
            <xsl:if test="inloc:extraID|inloc:title|inloc:abbr|inloc:description|inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:extraID">
            <xsl:text>    "extraID": [
</xsl:text> 
            <xsl:for-each select="inloc:extraID">
                <xsl:text>        "</xsl:text>
                <xsl:value-of select="."/>
                <xsl:if test="following-sibling::inloc:extraID">
                    <xsl:text>",
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>"
    ]</xsl:text>
            <xsl:if test="inloc:title|inloc:abbr|inloc:description|inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:title">
            <xsl:text>    "title": [
</xsl:text> 
            <xsl:for-each select="inloc:title">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:title">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
            <xsl:if test="inloc:abbr|inloc:description|inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:abbr">
            <xsl:text>    "abbr": [
</xsl:text> 
            <xsl:for-each select="inloc:abbr">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:abbr">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
            <xsl:if test="inloc:description|inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:description">
            <xsl:text>    "description": [
</xsl:text> 
            <xsl:for-each select="inloc:description">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:description">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
            <xsl:if test="inloc:furtherInformation|inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:furtherInformation">
            <xsl:text>    "furtherInformation": [
</xsl:text> 
            <xsl:for-each select="inloc:furtherInformation">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:furtherInformation">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
            <xsl:if test="inloc:rights|inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:rights">
            <xsl:text>    "rights": [
</xsl:text> 
            <xsl:for-each select="inloc:rights">
                <xsl:call-template name="multilingualString"/>
                <xsl:if test="following-sibling::inloc:rights">
                    <xsl:text>,
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>
    ]</xsl:text>
            <xsl:if test="inloc:created|inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:created">
            <xsl:text>    "created": "</xsl:text> 
            <xsl:value-of select="inloc:created"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:modified|inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:modified">
            <xsl:text>    "modified": [
</xsl:text> 
            <xsl:for-each select="inloc:modified">
                <xsl:text>        "</xsl:text> 
                <xsl:value-of select="."/>
                <xsl:if test="following-sibling::inloc:modified">
                    <xsl:text>",
</xsl:text> 
                </xsl:if>
            </xsl:for-each>
            <xsl:text>"
    ]</xsl:text>
            <xsl:if test="inloc:issued|inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:issued">
            <xsl:text>    "issued": "</xsl:text> 
            <xsl:value-of select="inloc:issued"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:validityStart|inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:validityStart">
            <xsl:text>    "validityStart": "</xsl:text> 
            <xsl:value-of select="inloc:validityStart"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:validityEnd|inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:validityEnd">
            <xsl:text>    "validityEnd": "</xsl:text> 
            <xsl:value-of select="inloc:validityEnd"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:version|inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:version">
            <xsl:text>    "version": "</xsl:text> 
            <xsl:value-of select="inloc:version"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:primaryStructure|inloc:combinationRules">
                <xsl:text>,
</xsl:text> 
            </xsl:if>
        </xsl:if>
        
    </xsl:template>

<!-- ******************* MULTILINGUAL STRING ************ -->
<xsl:template name="multilingualString">
    <xsl:choose>
        <xsl:when test="@xml:lang">
            <xsl:text>        {
            "lang": "</xsl:text>
            <xsl:value-of select="@xml:lang"/>
            <xsl:text>",
            "value": "</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>"
        }</xsl:text>            
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>        {"value": "</xsl:text> 
            <xsl:value-of select="."/>
            <xsl:text>"}</xsl:text>            
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<!-- ******************* LOCdefinition ************ -->
    <xsl:template name="LOCdefinition">

        <xsl:text>    {
</xsl:text> 
        
        <xsl:call-template name="LOCtypeLOC"/>
        
        <xsl:if test="inloc:primaryStructure">
            <xsl:text>    "primaryStructure": "</xsl:text> 
            <xsl:value-of select="inloc:primaryStructure"/>
            <xsl:text>"</xsl:text> 
        </xsl:if>
        <xsl:text>
    }</xsl:text> 
        
</xsl:template>

<!-- ******************* LOCassociation ************ -->
    <xsl:template name="LOCassociation">

        <xsl:text>        {
</xsl:text> 

        <xsl:if test="@id">
            <xsl:text>        "id": "</xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="@type|inloc:subject|inloc:scheme|inloc:object|inloc:number">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="@type!=''">
            <xsl:text>        "type": "</xsl:text> 
            <xsl:value-of select="@type"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="inloc:subject|inloc:scheme|inloc:object|inloc:number">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>
        
        <xsl:if test="inloc:subject">
            <xsl:text>        "subject": {
</xsl:text> 
            <xsl:if test="inloc:subject/@id">
                <xsl:text>        "id": "</xsl:text>
                <xsl:value-of select="inloc:subject/@id"/>
                <xsl:text>"</xsl:text>
                <xsl:if test="inloc:subject/inloc:label">
                    <xsl:text>,
</xsl:text>
                </xsl:if>
            </xsl:if>
            <xsl:if test="inloc:subject/inloc:label">
                <xsl:text>        "label": [
</xsl:text>
                <xsl:for-each select="inloc:subject/inloc:label">
                    <xsl:call-template name="multilingualString"/>
                    <xsl:if test="following-sibling::inloc:label">
                        <xsl:text>,
</xsl:text> 
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
        ]</xsl:text>
            </xsl:if>

            <xsl:text>
        }</xsl:text> 
            <xsl:if test="inloc:scheme|inloc:object|inloc:number">
                <xsl:text>,
</xsl:text>
            </xsl:if>
        </xsl:if>

        <xsl:if test="inloc:scheme">
            <xsl:text>        "scheme": {
</xsl:text> 
            <xsl:if test="inloc:scheme/@id">
                <xsl:text>        "id": "</xsl:text>
                <xsl:value-of select="inloc:scheme/@id"/>
                <xsl:text>"</xsl:text>
                <xsl:if test="inloc:scheme/inloc:label">
                    <xsl:text>,
</xsl:text>
                </xsl:if>
            </xsl:if>
            <xsl:if test="inloc:scheme/inloc:label">
                <xsl:text>        "label": [
</xsl:text>
                <xsl:for-each select="inloc:scheme/inloc:label">
                    <xsl:call-template name="multilingualString"/>
                    <xsl:if test="following-sibling::inloc:label">
                        <xsl:text>,
</xsl:text> 
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
        ]</xsl:text>
            </xsl:if>

            <xsl:text>
        }</xsl:text> 
            <xsl:if test="inloc:object|inloc:number">
                <xsl:text>,
</xsl:text>
            </xsl:if>
            
        </xsl:if>

        <xsl:if test="inloc:object">
            <xsl:text>        "object": {
</xsl:text> 
            <xsl:if test="inloc:object/@id">
                <xsl:text>        "id": "</xsl:text>
                <xsl:value-of select="inloc:object/@id"/>
                <xsl:text>"</xsl:text>
                <xsl:if test="inloc:object/inloc:label">
                    <xsl:text>,
</xsl:text>
                </xsl:if>
            </xsl:if>
            <xsl:if test="inloc:object/inloc:label">
                <xsl:text>        "label": [
</xsl:text>
                <xsl:for-each select="inloc:object/inloc:label">
                    <xsl:call-template name="multilingualString"/>
                    <xsl:if test="following-sibling::inloc:label">
                        <xsl:text>,
</xsl:text> 
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
        ]</xsl:text>
            </xsl:if>

            <xsl:text>
        }</xsl:text> 

            <xsl:if test="inloc:number">
                <xsl:text>,
</xsl:text>
            </xsl:if>
            
        </xsl:if>
        

        <xsl:if test="number!=''">
            <xsl:text>        "number": "</xsl:text> 
            <xsl:value-of select="number"/>
            <xsl:text>"</xsl:text>
        </xsl:if>

        <xsl:text>
    }</xsl:text> 
        

        
    </xsl:template>
            
</xsl:stylesheet>