<?xml version='1.0'?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<!DOCTYPE rdf:RDF [
    <!ENTITY jena    'http://jena.hpl.hp.com/'>

    <!ENTITY rdf     'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
    <!ENTITY rdfs    'http://www.w3.org/2000/01/rdf-schema#'>
    <!ENTITY owl     'http://www.w3.org/2002/07/owl#'>
    <!ENTITY xsd     'http://www.w3.org/2001/XMLSchema#'>
    <!ENTITY base    '&jena;2003/04/schemagen'>
    <!ENTITY vocab   '&base;#'>
]>

<rdf:RDF
  xmlns:rdf   ="&rdf;"
  xmlns:rdfs  ="&rdfs;"
  xmlns:owl   ="&owl;"
  xmlns:vocab ="&vocab;"
  xmlns       ="&vocab;"
  xml:base    ="&base;"
>

<!--
	SchemaGen configuration for use with Jena
	Author: Ian Dickinson, mailto:ian_dickinson@users.sourceforge.net
-->

<vocab:Config>
    <vocab:owl rdf:datatype="&xsd;boolean">true</vocab:owl>
    <vocab:ontology rdf:datatype="&xsd;boolean">false</vocab:ontology>
    <vocab:uppercase rdf:datatype="&xsd;boolean">false</vocab:uppercase>
    <vocab:classnamesuffix rdf:datatype="&xsd;string">Vocab</vocab:classnamesuffix>
    <vocab:package rdf:datatype="&xsd;string">com.hp.hpl.jena.vocabulary</vocab:package>
    <vocab:output rdf:datatype="&xsd;string">src/com/hp/hpl/jena/vocabulary</vocab:output>

<vocab:header rdf:datatype="&xsd;string">/*****************************************************************************
 * Source code information
 * -----------------------
 * Package            Jena 2
 * Web site           http://incubator.apache.org/jena
 * Created            %date%
 *
 *****************************************************************************/


// Package
///////////////////////////////////////
%package%


// Imports
///////////////////////////////////////
%imports%



/**
 * Vocabulary definitions from %sourceURI%
 * @author Auto-generated by jena.schemagen on %date%
 */</vocab:header>

<vocab:footer rdf:datatype="&xsd;string">
</vocab:footer>

<vocab:propSection>
    // Vocabulary properties
    ///////////////////////////
</vocab:propSection>

<vocab:classSection>
    // Vocabulary classes
    ///////////////////////////
</vocab:classSection>

<vocab:datatypesSection>
    // Vocabulary datatypes
    ///////////////////////////
</vocab:datatypessSection>

<vocab:individualsSection>
    // Vocabulary individuals
    ///////////////////////////
</vocab:individualsSection>

</vocab:Config>

</rdf:RDF>
