
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <title>Documentation for citationstyle - citationstyle.xsd - Element description</title>
      <meta http-equiv="Content-Type" content="text/xml; charset=iso-8859-1"/>
      <style type="text/css">
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* More-configurable styles */

/******** General ********/
         
/* Document body */
body {
   color: Black;
   background-color: White;
   font-family: Arial, sans-serif;
   font-size: 10pt;
}
                  
/* Horizontal rules */
hr {
   color: black;
}
/* Document title */
h1 {
   font-size: 18pt;
   letter-spacing: 2px;
   border-bottom: 1px #ccc solid;
   padding-top: 5px;
   padding-bottom: 5px;
}
/* Main section headers */
h2 {
   font-size: 14pt;
   letter-spacing: 1px;
}
/* Sub-section headers */
h3, h3 a, h3 span {
   font-size: 12pt;
   font-weight: bold;
   color: black;
}
/* Table displaying the properties of the schema components or the
   schema document itself */
table.properties th, table.properties th a {
   color: black;
   background-color: #F99; /* Pink */
}
table.properties td {
   background-color: #eee; /* Gray */
}

img{
 border: 0;
}         

/********* Documentation style *************/
p.documentation {
   color:black;
   font-style:italic;
         background-color: #EEEEFF;
         border: 1px solid #DDDDFF;
         padding-top: 1px;
         margin-right: 30px;
         margin-top: 1px;
}

         
/******** Table of Contents Section ********/

/* Controls for switching between printing and viewing modes */
div#printerControls {
   color: #963; /* Orange-brown */
}
/* Controls that can collapse or expand all XML Instance
   Representation and Schema Component Representation boxes */
div#globalControls {
   border: 2px solid #999;
}


/******** Schema Document Properties Section ********/

/* Table displaying the namespaces declared in the schema */
table.namespaces th {
   background-color: #ccc;
}
table.namespaces td {
   background-color: #eee;
}
/* Target namespace of the schema */
span.targetNS {
   color: #06C;
   font-weight: bold;
}


/******** Schema Components' Sections ********/

/* Name of schema component */
.name {
   color: #F93; /* Orange */
}

/* Hierarchy table */
table.hierarchy {
   border: 2px solid #999; /* Gray */
}

/* XML Instance Representation table */
div.sample div.contents {
   border: 1px dashed black;
}


/* Schema Component Representation table */
div.schemaComponent div.contents {
   border: 2px black solid;
}


/******** Glossary Section ********/

/* Glossary Terms */
.glossaryTerm {
   color: #036; /* Blue */
}


/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Printer-version styles */

@media print {

/* Ensures that controls are hidden when printing */
div#printerControls {
   visibility: hidden;
}
div#globalControls {
   visibility: hidden;
}
#legend {
   display: none;
}
#legendTOC {
   display: none;
}
#glossary {
   display: none;
}
#glossaryTOC {
   display: none;
}

}

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Base styles */

/******** General ********/

/* Unordered lists */
ul {
   margin-left: 1.5em;
   margin-bottom: 0em;
}
/* Tables */
table {
   margin-top: 10px;
   margin-bottom: 10px;
   margin-left: 2px;
   margin-right: 2px;
}
table th, table td {
   font-size: 10pt;
   vertical-align: top;
   padding-top: 3px;
   padding-bottom: 3px;
   padding-left: 10px;
   padding-right: 10px;
}
table th {
   font-weight: bold;
   text-align: left;
}
/* Table displaying the properties of the schema components or the
   schema document itself */
table.properties {
   width: 90%;
}
table.properties th {
   width: 30%;
}
/* Boxes that can make its content appear and disappear*/
div.box {
   margin: 1em;
}
   /* Box caption */
div.box span.caption {
   font-weight: bold;
}
   /* Button to open and close the box */
div.box input.control {
   width: 1.4em;
   height: 1.4em;
   text-align: center;
   vertical-align: middle;
   font-size: 11pt;
}
   /* Box contents */
div.box div.contents {
   margin-top: 3px;
}


/******** Table of Contents Section ********/

/* Controls for switching between printing and viewing modes */
div#printerControls {
   white-space: nowrap;
   font-weight: bold;
   padding: 5px;
   margin: 5px;
}
/* Controls that can collapse or expand all XML Instance
   Representation and Schema Component Representation boxes */
div#globalControls {
   padding: 10px;
   margin: 5px;
}


/******** Schema Document Properties Section ********/

/* Table displaying the namespaces declared in the schema */
table.namespaces th {
}
table.namespaces td {
}
/* Target namespace of the schema */
span.targetNS {
}


/******** Schema Components' Sections ********/

/* Name of schema component */
.name {
}

/* Hierarchy table */
table.hierarchy {
   width: 90%;
}
table.hierarchy th {
   font-weight: normal;
   font-style: italic;
   width: 20%;
}
table.hierarchy th, table.hierarchy td {
   padding: 5px;
}

/* XML Instance Representation table */
div.sample {
   width: 90%;
}
div.sample div.contents {
   padding: 5px;
   font-family: Courier New, sans-serif;
   font-size: 10pt;
}
   /* Normal elements and attributes */
div.sample div.contents, div.sample div.contents a {
   color: black;
}
   /* Group Headers */
div.sample div.contents .group, div.sample div.contents .group a {
   color: #999; /* Light gray */
}
   /* Type Information */
div.sample div.contents .type, div.sample div.contents .type a {
   color: #999; /* Light gray */
}
   /* Occurrence Information */
div.sample div.contents .occurs, div.sample div.contents .occurs a {
   color: #999; /* Light gray */
}
   /* Fixed values */
div.sample div.contents .fixed {
   color: #063; /* Green */
   font-weight: bold;
}
   /* Simple type constraints */
div.sample div.contents .constraint, div.sample div.contents .constraint a {
   color: #999; /* Light gray */
}
   /* Elements and attributes inherited from base type */
div.sample div.contents .inherited, div.sample div.contents .inherited a {
   color: #666; /* Dark gray */
}
   /* Elements and attributes added to or changed from base type */
div.sample div.contents .newFields {
   font-weight: bold;
}
   /* Other type of information */
div.sample div.contents .other, div.sample div.contents .other a {
   color: #369; /* Blue */
   font-style: italic;
}
   /* Link to open up window displaying documentation */
div.sample div.contents a.documentation {
   text-decoration: none;
   padding-left: 3px;
   padding-right: 3px;
   padding-top: 0px;
   padding-bottom: 0px;
   font-weight: bold;
   font-size: 11pt;
   background-color: #FFD;
   color: #069;
}
   /* Invert colors when hovering over link to open up window 
      displaying documentation */
div.sample div.contents a.documentation:hover {
   color: #FFD;
   background-color: #069;
}

/* Schema Component Representation table */
div.schemaComponent {
   width: 90%;
}
div.schemaComponent div.contents {
   font-family: Courier New, sans-serif;
   font-size: 10pt;
   padding: 5px;
}
   /* Syntax characters */
div.schemaComponent div.contents {
   color: #00f; /* blue */
}
   /* Element and attribute tags */
div.schemaComponent div.contents .scTag {
   color: #933; /* maroon */
}
   /* Element and attribute content */
div.schemaComponent div.contents .scContent, div.schemaComponent div.contents .scContent a {
   color: black;
   font-weight: bold;
}
   /* Comments */
div.schemaComponent div.contents .comment {
   color: #999; /* Light gray */
}

/******** Legend Section ********/

div#legend table, div#legend div {
   margin-bottom: 3px;
}
div#legend div.hint {
   color: #999; /* Light gray */
   width: 90%;
   margin-left: 1em;
   margin-bottom: 2em;
}


/******** Glossary Section ********/

/* Glossary Terms */
.glossaryTerm {
   font-weight: bold;
}

/********* Details *************/
.detailsToc {
  color: #666; /* Light gray */
}

.details {
  color: #666; /* Light gray */
  text-decoration:none;
}

/******** Footer ********/

.footer {
   font-size: 8pt;
}
</style>
      <script type="text/javascript">
<!--
          
         
/**
 * Counter of documentation windows
 * Used to give each window a unique name
 */
var windowCount = 0;
         
/**
 * Opens up a window displaying the documentation
 * of a schema component in the XML Instance
 * Representation table.
 * 
 * @param compDesc      Description of schema component 
 * @param compName      Name of schema component 
 * @param docTextArray Array containing the paragraphs 
 *                           of the new document
 */
function viewDocumentation(compDesc, compName, docTextArray) {
  var width = 400;
  var height = 200;
  var locX = 100;
  var locY = 200;

  /* Generate content */
  var actualText = "<html>";
  actualText += "<head><title>";
  actualText += compDesc;
  if (compName != '') {
     actualText += ": " + compName;
  }
  actualText += "</title></head>";
  actualText += "<body bgcolor=\"#FFFFEE\">";
  // Title
  actualText += "<p style=\"font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; letter-spacing:1px;\">";
  actualText += compDesc;
  if (compName != '') {
     actualText += ": <span style=\"color:#006699\">" + compName + "</span>";
  }
  actualText += "</p>";
  // Documentation
  var idx;
  for (idx = 0; idx < docTextArray.length; idx++) {
     actualText += "<p style=\"font-family: Arial, sans-serif; font-size: 10pt;\">" + docTextArray[idx] + "</p>";
  }
  // Link to close window
  actualText += "<a href=\"javascript:void(0)\" onclick=\"window.close();\" style=\"font-family: Arial, sans-serif; font-size: 8pt;\">Close</a>";
  actualText += "</body></html>";

  /* Display window */
  windowCount++;
  var docWindow = window.open("", "documentation"+windowCount, "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable,alwaysRaised,dependent,titlebar=no,width="+width+",height="+height+",screenX="+locX+",left="+locX+",screenY="+locY+",top="+locY);
  docWindow.document.write(actualText);
}         
      
// -->
</script>
   </head>
   <body>
      <h1>
         <a name="top">Documentation for citationstyle</a>
      </h1>
      <h3>Element: <a name="h-129865927" class="name">description</a>
      </h3>
      <h4>
         <a href="citationstyle.xsd.html" class="details">[Table of contents]</a>
      </h4>
      <table class="properties">
         <tr>
            <th>Name</th>
            <td>description</td>
         </tr>
         <tr>
            <th>Used by (from the same schema document)</th>
            <td>Element <b>
                  <a href="citationstyle.xsd.html_h-573506543.html">info</a>
               </b>
            </td>
         </tr>
         <tr>
            <th>Type</th>
            <td>
               <span class="type">
                  <a href="citationstyle.xsd.html#ns_xs" title="Find out namespace of 'xs' prefix">xs</a>:string</span>
            </td>
         </tr>
         <tr>
            <th>
               <a title="Look up 'Nillable' in glossary"
                  href="citationstyle.xsd.html#term_Nillable">Nillable</a>
            </th>
            <td>no</td>
         </tr>
         <tr>
            <th>
               <a title="Look up 'Abstract' in glossary"
                  href="citationstyle.xsd.html#term_Abstract">Abstract</a>
            </th>
            <td>no</td>
         </tr>
      </table>
      <div class="sample box">
         <div>
            <input type="button" id="h-129865927_logicalDiagram_button" class="control"
                   onclick="switchState('h-129865927_logicalDiagram'); return false;"
                   style="display: none"/> 
            <span class="caption">Logical Diagram</span>
         </div>
         <div id="h-129865927_logicalDiagram" class="contents">
            <img usemap="#h534871697" src="schemaDiagrams/h534871697.png"/>
            <!--
            Map ref: file:/test/rng//schemaDiagrams/h534871697.map--><map name="h534871697">
</map>
         </div>
         <script type="text/javascript">
<!--
          setState('h-129865927_logicalDiagram', false);
// -->
</script>
      </div>
      <div class="sample box">
         <div>
            <input type="button" id="h-129865927_xibox_button" class="control"
                   onclick="switchState('h-129865927_xibox'); return false;"
                   style="display: none"/> 
            <span class="caption">XML Instance Representation</span>
         </div>
         <div id="h-129865927_xibox" class="contents">
            <div style="margin-left: 0em">&lt;<a href="citationstyle.xsd.html#ns_cs" title="Find out namespace of 'cs' prefix">cs</a>:description&gt; <span class="type">
                  <a href="citationstyle.xsd.html#ns_xs" title="Find out namespace of 'xs' prefix">xs</a>:string</span> &lt;/<a href="citationstyle.xsd.html#ns_cs" title="Find out namespace of 'cs' prefix">cs</a>:description&gt;</div>
         </div>
         <script type="text/javascript">
<!--
          setState('h-129865927_xibox', true);
// -->
</script>
      </div>
      <div class="sample box">
         <div>
            <input type="button" id="h-129865927_diagram_button" class="control"
                   onclick="switchState('h-129865927_diagram'); return false;"
                   style="display: none"/> 
            <span class="caption">Diagram</span>
         </div>
         <div id="h-129865927_diagram" class="contents">
            <img usemap="#h1136786503" src="schemaDiagrams/h1136786503.png"/>
            <!--
            Map ref: file:/test/rng//schemaDiagrams/h1136786503.map--><map name="h1136786503">
</map>
         </div>
         <script type="text/javascript">
<!--
          setState('h-129865927_diagram', true);
// -->
</script>
      </div>
      <div class="schemaComponent box">
         <div>
            <input type="button" id="h-129865927_scbox_button" class="control"
                   onclick="switchState('h-129865927_scbox'); return false;"
                   style="display: none"/> 
            <span class="caption">Schema Component Representation</span>
         </div>
         <div id="h-129865927_scbox" class="contents">
            <div style="margin-left: 0em">&lt;<span class="scTag">xs:element</span> 
               <span class="scTag">name</span>="<span class="scContent">description</span>" <span class="scTag">type</span>="<span class="scContent">
                  <span class="type">
                     <a href="citationstyle.xsd.html#ns_xs" title="Find out namespace of 'xs' prefix">xs</a>:string</span>
               </span>"/&gt;</div>
         </div>
         <script type="text/javascript">
<!--
          setState('h-129865927_scbox', false);
// -->
</script>
      </div>
      <hr/>
      <p class="footer">Generated by <a href="http://www.oxygenxml.com">&lt;oXygen/&gt; XML Editor</a> using a modified version of <a href="http://titanium.dstc.edu.au/xml/xs3p">xs3p</a> that adds schema diagrams and chunking support. Last modified: <script type="text/javascript">
<!--
          document.write(document.lastModified);
// -->
</script>
      </p>
   </body>
</html>