<?xml version="1.0"?> 

<!-- Simon Chudley (src299) XML Network Manager -->
<!-- XST document to describe the translation from a generic DNS implementation into BIND 8 configurations -->

<xsl:stylesheet xmlns="http://www.ecs.soton.ac.uk/~src299/xmlnetman" 
					 xmlns:dns="http://www.ecs.soton.ac.uk/~src299/xmlnetman/dns"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">

  <!-- Is just text output -->
  <xsl:output method="text"/>


  <xsl:template match="/*/dns:DNS">

    <xsl:text>&#xa;  </xsl:text>
    <xsl:comment>Automatically Generated BIND Version 8 DNS Configurations </xsl:comment>
    <xsl:text> &#xa;&#xa;</xsl:text>

    <xsl:text>  </xsl:text>
    <xsl:comment>BIND 8 service configuration (named.conf) </xsl:comment>
    <xsl:text>&#xa;&#xa;</xsl:text>

    <!-- The bindings hold zone information, will be held in named.conf -->
    <xsl:apply-templates select="dns:Bindings/dns:Zone"/>  


    <xsl:text>&#xa;&#xa;  </xsl:text>
    <xsl:comment>Address Resolution Files Follow </xsl:comment>
    <xsl:text>&#xa;&#xa;</xsl:text>

    <!-- For all the service constructs -->
    <xsl:for-each select="dns:DNSConstruct">

      <xsl:text>  # </xsl:text> <xsl:value-of select="@name"/> <xsl:text> - </xsl:text>
      <xsl:value-of select="@description"/> <xsl:text>&#xa;</xsl:text>

      <!-- All the forward start of authorities -->
      <xsl:apply-templates select="./dns:ForwardSOA"/>

      <!-- All the reverse start of authorities -->
      <xsl:apply-templates select="./dns:ReverseSOA"/>

    </xsl:for-each>

  </xsl:template>

  <xsl:template match="dns:ForwardSOA">

    <xsl:text>  # File (</xsl:text> <xsl:value-of select="@file"/> <xsl:text>)&#xa;&#xa;</xsl:text>  
    <xsl:text>$TTL    3600&#xa;&#xa;</xsl:text>
    <xsl:value-of select="@match"/> <xsl:text>. IN SOA </xsl:text> 
    <xsl:value-of select="@primaryns"/>. <xsl:text> </xsl:text>
    <xsl:value-of select="@adminmail"/>. <xsl:text> (&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@serial"/> <xsl:text> ; Serial&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@refresh"/> <xsl:text> ; Refresh&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@retry"/> <xsl:text> ; Retry&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@expire"/> <xsl:text> ; Expires&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@min_ttl"/>) <xsl:text> ; Minumum Time to live&#xa;</xsl:text>
    <xsl:text>&#xa;&#xa;</xsl:text>

    <!-- For all the resource records -->
    <xsl:for-each select="*">

      <!-- Just use the element name as the resource record type -->
      <xsl:value-of select="@match"/> <xsl:text> IN </xsl:text>
      <xsl:value-of select="substring-after(name(.),'dns:')"/> <xsl:text> </xsl:text> 
      <xsl:if test="@priority"> <xsl:value-of select="@priority"/> <xsl:text> </xsl:text> </xsl:if>
      <xsl:value-of select="@target"/> <xsl:text>&#xa;</xsl:text>

    </xsl:for-each>

    <xsl:text>&#xa;&#xa;&#xa;</xsl:text>

  </xsl:template>


  <xsl:template match="dns:ReverseSOA">
  
    <xsl:text>  # File (</xsl:text> <xsl:value-of select="@file"/> <xsl:text>)&#xa;&#xa;</xsl:text> 

    <xsl:text>$TTL    3600&#xa;&#xa;</xsl:text>
    <xsl:value-of select="@match"/>. <xsl:text> IN SOA </xsl:text> 
    <xsl:value-of select="@primaryns"/>. <xsl:text> </xsl:text>
    <xsl:value-of select="@adminmail"/>. <xsl:text> (&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@serial"/> <xsl:text> ; Serial&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@refresh"/> <xsl:text> ; Refresh&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@retry"/> <xsl:text> ; Retry&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@expire"/> <xsl:text> ; Expires&#xa;</xsl:text>
    <xsl:text>          </xsl:text> <xsl:value-of select="@min_ttl"/>) <xsl:text> ; Minumum Time to live&#xa;</xsl:text>
    <xsl:text>&#xa;&#xa;</xsl:text>

    <!-- For all the resource records -->
    <xsl:for-each select="*">

      <!-- Just use the element name as the resource record type -->
      <xsl:value-of select="@match"/> <xsl:text> IN </xsl:text>
      <xsl:value-of select="substring-after(name(.),'dns:')"/> <xsl:text> </xsl:text> 
      <xsl:value-of select="@target"/>
      <xsl:text>.&#xa;</xsl:text>

    </xsl:for-each>

    <xsl:text>&#xa;&#xa;&#xa;</xsl:text>

  </xsl:template>

  <xsl:template match="dns:Zone">

    <xsl:text>  zone "</xsl:text> <xsl:value-of select="@name"/> <xsl:text>" in {&#xa;</xsl:text>
    <xsl:text>      type </xsl:text> <xsl:value-of select="@type"/> <xsl:text>; &#xa;</xsl:text>
    <xsl:text>      file "</xsl:text> <xsl:value-of select="@file"/> <xsl:text>"; &#xa;</xsl:text>
    <xsl:text>  };&#xa;&#xa;</xsl:text>

  </xsl:template>

</xsl:stylesheet>
