<?xml version='1.0'?><!-- -*- mode: indented-text;-*- -->
<xsl:transform
    xmlns:xsl  ="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:web  ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:util ="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:g    ="http://www.w3.org/2001/02pd/gv#"
    >

<xsl:variable name="RCSId"
  select='"$Id: rdf2dot.xsl,v 1.13 2001/05/23 19:46:25 connolly Exp $"'/>
<xsl:param name="Debug" select='0'/>

<!--
<div xmlns="http://www.w3.org/1999/xhtml">

<address>Dan Connolly <br class=""/>
$Id: rdf2dot.xsl,v 1.13 2001/05/23 19:46:25 connolly Exp $</address>
</div>
-->

<xsl:output method="text"/>

<xsl:param name="GVns"
	   select='"http://www.w3.org/2001/02pd/gv#"'/>

<xsl:template match="/web:RDF">
  <xsl:text>/* transformed by by </xsl:text>
  <xsl:value-of select='substring($RCSId, 2, string-length($RCSId)-2)'/>
  <xsl:text> */
</xsl:text>

  <xsl:for-each select="*/g:digraph/@web:resource">

    <!-- I suspect there's a way to use xsl:key to in stead
         of this /web:RDF/*[@web:about="..."] idiom
      -->
    <xsl:variable name="it" select="/web:RDF/*[@web:about=current()]"/>

    <xsl:text>digraph </xsl:text>
    <xsl:call-template name="eachGraph">
      <xsl:with-param name="it" select='$it'/>
    </xsl:call-template>

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

<xsl:template name="eachGraph">
  <xsl:param name="it"/>
  <xsl:param name="cluster"/>

  <xsl:value-of select='concat($cluster, generate-id($it))'/>
  <xsl:text> {
</xsl:text>

  <!-- graph attributes see Graphviz spec table 1 -->
  <xsl:for-each select='$it/*[namespace-uri() = $GVns and (
			      local-name() = "center"
		           or local-name() = "clusterrank"
		           or local-name() = "color"
		           or local-name() = "concentrate"
		           or local-name() = "fontcolor"
		           or local-name() = "fontname"
		           or local-name() = "fontsize"
		           or local-name() = "label"
		           or local-name() = "layerseq"
		           or local-name() = "margin"
		           or local-name() = "mclimit"
		           or local-name() = "nodesep"
		           or local-name() = "nslimit"
		           or local-name() = "ordering"
		           or local-name() = "orientation"
		           or local-name() = "page"
		           or local-name() = "rank"
		           or local-name() = "rankdir"
		           or local-name() = "ranksep"
		           or local-name() = "ratio"
		           or local-name() = "size"
			   )]'> <!--@@ ...others-->
    <xsl:value-of select='local-name()'/>
    <xsl:text>="</xsl:text>
    <xsl:value-of select='.'/> <!-- @@quoting? -->
    <xsl:text>";
</xsl:text>
  </xsl:for-each>

  <!-- explicit nodes -->
  <xsl:for-each select="$it/g:hasNode/@web:resource">
    <xsl:variable name="nodeURI" select='current()'/>
    <xsl:variable name="nodeElt" select='/web:RDF/*[@web:about=$nodeURI]'/>
    <xsl:if test='$nodeElt'>
      <xsl:call-template name="eachNode">
        <xsl:with-param name="nodeElt" select='$nodeElt'/>
        <xsl:with-param name="nodeURI" select='$nodeURI'/>
      </xsl:call-template>
    </xsl:if>
  </xsl:for-each>

  <xsl:for-each select="$it/g:subgraph/@web:resource">
    <xsl:variable name="it2" select="/web:RDF/*[@web:about=current()]"/>

    <xsl:text>subgraph </xsl:text>
    <xsl:call-template name="eachGraph">
      <xsl:with-param name="it" select='$it2'/>
      <xsl:with-param name="cluster" select='"cluster"'/>
    </xsl:call-template>

  </xsl:for-each>

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

<xsl:template name="eachNode">
  <xsl:param name="nodeElt"/>
  <xsl:param name="nodeURI"/>

  <xsl:text>"</xsl:text>
  <xsl:value-of select='$nodeURI'/>
  <xsl:text>" [</xsl:text>

  <!-- node attributes -->
  <xsl:for-each select='$nodeElt/*[namespace-uri() = $GVns and (
                                   local-name() = "label"
			        or local-name() = "color"
				or local-name() = "shape"
				or local-name() = "style"
				or local-name() = "fontcolor"
				or local-name() = "fontname"
				or local-name() = "fontsize"
				or local-name() = "height"
				or local-name() = "width"
				or local-name() = "layer"
				or local-name() = "uri"
				or local-name() = "shapefile")
				]'> <!--@@ "uri" not in doc'n table but dan thought would work-->
    <xsl:value-of select='local-name()'/>
    <xsl:text>="</xsl:text>
    <xsl:value-of select='.'/> <!-- @@quoting? -->
    <xsl:text>",
</xsl:text>
  </xsl:for-each>
  <xsl:text>];
</xsl:text>

  <!-- edges -->
  <xsl:for-each select="$nodeElt/*[@web:resource]"> <!-- iterate over all properties -->
    <!-- compute full name of property -->
    <xsl:variable name="obj" select='./@web:resource'/>
    <xsl:variable name="pred" select='concat(namespace-uri(),  local-name())'/>


    <xsl:if test='$Debug>4'>
    <xsl:message>propertyElt in nodeElt:
      subj: <xsl:value-of select='$nodeURI'/>
      pred: <xsl:value-of select='$pred'/>
    </xsl:message>
    </xsl:if>

    <xsl:choose>
      <xsl:when test='/web:RDF/g:EdgeProperty[@web:about=$pred]'>

        <xsl:call-template name="doEdge">
          <xsl:with-param name="nodeURI" select='$nodeURI'/>
          <xsl:with-param name="pred" select='$pred'/>
          <xsl:with-param name="obj" select='$obj'/>
          <xsl:with-param name="edgeElt" select='/web:RDF/*[@web:about=$pred]'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='/web:RDF/*[@web:about=$pred]/web:type
                       [@web:resource=concat($GVns, "EdgeProperty")]'>
        <xsl:call-template name="doEdge">
          <xsl:with-param name="nodeURI" select='$nodeURI'/>
          <xsl:with-param name="pred" select='$pred'/>
          <xsl:with-param name="obj" select='$obj'/>
          <xsl:with-param name="edgeElt" select='/web:RDF/*[@web:about=$pred]'/>
          </xsl:call-template>

      </xsl:when>

      <xsl:otherwise>
        <!-- nothing -->
      </xsl:otherwise>
    </xsl:choose>

  </xsl:for-each>

</xsl:template>

<xsl:template name="doEdge">
        <xsl:param name="nodeURI"/>
        <xsl:param name="pred"/>
        <xsl:param name="obj"/>
        <xsl:param name="edgeElt"/>

          <xsl:if test='$Debug>4'>
            <xsl:message>EdgeProperty:
              pred: <xsl:value-of select='$pred'/>
              obj: <xsl:value-of select='$obj'/>
            </xsl:message>
          </xsl:if>

	     <xsl:text>"</xsl:text>
             <xsl:value-of select='$nodeURI'/>
	     <xsl:text>" -&gt; "</xsl:text>
	     <xsl:value-of select='$obj'/>
	     <xsl:text>"</xsl:text>


             <xsl:text> [ /* edge attributes */
</xsl:text>
             <!-- edge attributes all except id -->
             <xsl:for-each select='$edgeElt/*[local-name() = "label"
			          or local-name() = "color"
			          or local-name() = "decorate"
			          or local-name() = "dir"
			          or local-name() = "fontcolor"
			          or local-name() = "fontname"
			          or local-name() = "fontsize"
			          or local-name() = "layer"
			          or local-name() = "minlen"
			          or local-name() = "style"
			          or local-name() = "weight"
				  ]'> <!--@@ ...others-->
               <xsl:value-of select='local-name()'/>
               <xsl:text>="</xsl:text>
               <xsl:value-of select='.'/> <!-- @@quoting? -->
               <xsl:text>",
</xsl:text>
             </xsl:for-each>
             <xsl:text>];
</xsl:text>
</xsl:template>



<!-- don't pass text thru -->
<xsl:template match="text()|@*">
</xsl:template>


</xsl:transform>
