<?xml version="1.0" encoding="UTF-8" ?>
<!-- ****  slinks.dtd, version 1.11   5/4/2003       *****
     * http://nj.oclc.org/SLinkS/slinks-20030504.dtd **

     ****  The most recent version of this document  *****
     ****  is located at                             *****
     ****  http://nj.oclc.org/SLinkS/slinks.dtd   *****

     ****  Previous version:                         *****
     * http://nj.oclc.org/SLinkS/slinks-20030321.dtd **
     
    =====================================================
    This XML DTD describes a structure for templating 
    internet links to resources related to citations of 
    scholarly works.
    =====================================================
Author: Eric S. Hellman, eric@openly.com
Copyright (1998-2003) by Openly Informatics Inc.
All Rights Reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

    Redistributions of source  must retain the above copyright
    notice, this list of conditions and the following disclaimer. 

    Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

    The name of the author may not be used to endorse or promote
    products derived from this specification without specific prior written
    permission. 

    "S-Link-S" is a Service Mark of Openly Informatics, Inc. The S-Link-S
    name and logo may not be used to endorse or promote
    products derived from this specification without specific prior written
    permission of Openly Informatics, Inc.. 

THIS DOCUMENT TYPE DEFINITION IS PROVIDED ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->

<!-- ***** Top level container elements ***** -->

<!ELEMENT slinks  ( var*, lookUpTable*, scratch*, DOi?, URL?, postArgs?, cookie?, notRequired?, locator*  ) >
<!-- This is the top level element of the linking template. 
     It is referred to in metadata using its ID attribute. 
     -->
<!ATTLIST slinks ID       CDATA       #REQUIRED
                 vers     CDATA    #IMPLIED  
                 complete (yes|no) #IMPLIED >    

<!-- ID	      the ID of the slinks element (required)
     vers     the version of S-Link-S. The version number for S-Link-S complying 
              with this document DTD is "1"
     complete a complete template is one that can be used without a network
              connection; it needs no on-line look-ups of digital signatures.-->

<!ENTITY % varsafe.e "#PCDATA | lookUp | pad | replace | changeCase | if | titleCode | 
                                 pattern | private | option | param" >
<!-- a parameter entity used for allowable content in variable sections
     this content cannot depend on a variable section, and should be resolvable 
     in a single pass through a parser-->


<!ENTITY % template.e "%varsafe.e; |  hash | checkSum | SICI | pmid | 
                                       dsig | getDOi | encode" >
<!-- a parameter entity used for allowable content in template strings -->

<!ELEMENT var  ( %varsafe.e; )*  >
<!-- marks a string for other elements to use as a variable. 
     The content model for mark prohibits any entities 
     which may depend on variable sections. 
     In this way circular references are avoided.
     -->

<!ATTLIST var  ID  ID  #REQUIRED 
                xml:space (default|preserve) "preserve">
<!-- ID	the label used to refer to the variable section. 
     Must be unique in the document.
     -->

<!ELEMENT scratch  ( %template.e; )*  >
<!-- a scratch element is a var by another name. It serves as a register that can be used to build up computations.
     -->

<!ATTLIST scratch  ID  ID  #REQUIRED 
                xml:space (default|preserve) "preserve">
<!-- ID	the label used to refer to the value of the scratch section. 
     Must be unique in the document.
     -->

<!ELEMENT lookUpTable	( item+ )  >
<!-- together with lookup, this element  allows almost any site 
     to be described in the S-Link-S framework. 
     Nonetheless, it's bad practice to use the lookUpTable in 
     place of a search engine if you need a table item for 
     every item in your journal. item is the only allowed content.
     -->

<!ATTLIST lookUpTable  ID      ID    #REQUIRED 
                       default CDATA ""  >
<!-- ID	       a unique identifier used to address the lookup table (required)
     default   the value returned if no match is found default:""
     -->

<!ELEMENT item 	EMPTY >
<!-- a record in a lookUpTable. (empty)-->

<!ATTLIST item  key    CDATA     #REQUIRED 
                value  CDATA     #REQUIRED 
                >
<!-- key    a string used to access the record. If there are two 
            items with the same key, then only the first is used. 
     value  the string returned by a look-up
     -->

<!ENTITY % usage.e "" >


<!ELEMENT URL	( %template.e; )* >
<!-- This element contains a template for a URL.-->

<!ATTLIST URL  usage ( literal | redirected | query ) "literal"
               xml:space (default|preserve) "preserve">
<!-- In this and other elements declared as mixed content, white space 
     is preserved. URL encoding should be assumed to occur only after 
     all parsing and manipulation has been done.-->
<!-- usage       a string describing whether the URL is to be resolved
	     literal     If a template is literal, the string it forms is to be used 
	                 as the URL  etc. 
	     redirected  A redirected template forms a URI which may get redirected to 
	                 another URI. The redirection URI is to be used as the "result" 
	                 of the element. Multiple redirections should be followed to the end.
	     query       A query URL is to be used only with a locator element to do web-page
	                 look-ups.
     
     In principle, we could add this to the DOi element, but that would require adding
     handle resolving code to the implementation.
                 -->

<!ELEMENT DOi	( %template.e; )* >
<!ATTLIST DOi  xml:space (default|preserve) "preserve">
<!-- This element contains a template for a digital object identifier. 
     When this element is present, it can be used in a URL template  
     using the <getDOi/> element.-->

<!ELEMENT postArgs	( postItem )*   >
<!ATTLIST postArgs  encoding CDATA "UTF-8">
<!-- Occasionally, a server may require form data to be submitted
     in a post arguments header. This element contains the items for the required form data.
     The encoding attribute indicates the encoding expected by the target-->

<!ELEMENT postItem 	( %template.e; )* >
<!-- a POST argument. contains a template for the value of the POST argument-->

<!ATTLIST item  key    CDATA     #REQUIRED 
                >
<!-- key    the name of the POST argument. 
     -->
<!ELEMENT cookie	( %template.e; )*  >
<!ATTLIST cookie    xml:space (default|preserve) "preserve">
<!-- Session ID's and user identification is often accomplished using 
     a special header in the HTTP protocol called the HTTP-Cookie.
     The cookie element is included in S-Link-S to enable specification 
     of site authentication in the intranet/library service scenario.
     The cookie element should never be used in generic or public 
     link specifications.-->

<!ELEMENT notRequired	( %template.e; )*  >
<!-- this element tells a processor that entities requested in the template it contains are 
     really not required for the formation of a URL. This was needed to override seemingly required
     entities in things like SICI's -->

<!ELEMENT locator  ( %template.e; )* >
<!-- element content is a "PERL5 regular expression" pattern that describes how to 
     find a string within a text resource. Locators are evaluated in the order 
     that they appear in the template
     -->
<!ATTLIST locator  query	CDATA	"URL"
                   name     CDATA   #REQUIRED
                   group    CDATA   "1" >

<!-- query    the name of the element providing the query URI. "URL" and "DOi"
              refer to the respective elements, unless the values have been 
              replaced in a previous locator.
     name     a name of the thing that is being sought. If the name is "URL" 
              or "DOi", then the result of the locator replaces the respective
              element.
     group    if there is more than one parenthesized group, then this selects which group.
              if group = 0 then the whole match is used
     -->
<!-- ***** String manipulation mark-up ***** -->

<!ELEMENT pad	( %template.e; )*  >
<!-- used to mark up strings which need padding to make a fixed-length string
     attributes. Can also be used to chop strings to a cetain length --> 

<!ATTLIST pad   padChar  CDATA           "0"
                length   NMTOKEN #REQUIRED
                align    (left|right)    "right"  
                xml:space (default|preserve) "preserve">

<!-- padChar  a character to pad with (required)
     length   how long the padded string should be (required) (an integer)
     align    the side the text should align to (left|right) (default:right)
     -->

<!ELEMENT replace  ( %template.e; )*  >
<!-- substitute every instance of a string for another in the element's content
     -->

<!ATTLIST replace  for    CDATA   #REQUIRED
                   with   CDATA   #REQUIRED
                   grep   (yes|no)    "no"  
                   xml:space (default|preserve) "preserve">
<!-- for    the string to replace
     with   the string to substitute
     grep   whether to use "PERL5 regular expressions" "(yes|no)" default:"no" 
     -->

<!ELEMENT pattern  ( %varsafe.e; )*  >
<!-- declares a "PERL5 regular expression" pattern that the marked text should match.
     This markup is used in situations where a URL must be matched.
     -->

<!ATTLIST pattern  model    CDATA   #REQUIRED >

<!-- model the regular expression that the marked text should match
     -->


<!ELEMENT encode   ( %template.e; )*  >
<!ATTLIST encode  encoding CDATA "UTF-8">
<!-- URL encode the text in the element content; use the encoding specified in the attribute -->


<!ELEMENT changeCase   ( %template.e; )*  >
<!-- change case of the text in the element content -->

<!ATTLIST changeCase  to   (upper|lower|title)  #REQUIRED
                      offset  NMTOKEN  "0" 
                      xml:space (default|preserve) "preserve">
<!-- to	     the text can be changed to UPPER case, 
             lower case, or Title Case. Title case treats all 
             non-alphanumerics as word separators, and then 
             capitalizes the first letter of each word. (required)
     offset	 characters up to the offset character are unchanged. default: 0 
     -->

<!ELEMENT if ( ( case | match | notEmpty )+ , else? ) >
<!-- can contain "case", "match", "notEmpty" and "else" elements. 
     case and match contain conditions as attributes. 
     notEmpty  is true if the content is not empty.
     The content of the first element with a true condition is selected.
     -->

<!ELEMENT case	( %template.e; )*  >
<!-- the attributes define a comparison of strings. 
     If true, the content of this element becomes 
     the value of the parent <if> element
     -->

<!ATTLIST case varID     IDREF   #REQUIRED
               op     (gt|lt|eq|ne|ge|le)  #REQUIRED
               const     CDATA   #REQUIRED
               order  (numeric|alpha|date)  "numeric"
               xml:space (default|preserve) "preserve"
               >
<!-- varID  ID of the variable or scratch used for the left hand value of a comparison.
     op     a comparison operator,  matches "(gt|lt|eq|ne|ge|le)"
     const  the right hand value for a comparison.
     order  (numeric|alpha|date) default: numeric. 
           In numeric comparison, the numbers are extracted from the strings 
           before comparison. In a date comparison, 
           both strings should be either YYYY-MM-DD format strings 
           or they must be simple token values, i.e. "july" . date string parsing 
           is lenient.
           In alpha comparisons, the compareTo method of the Java 
           String object is used, with the English Locale. 
           Note that entities may be used only in the content of a variable.
           If the IDREF does not resolve, the case is false.
     -->


<!ELEMENT else ( %template.e; )*  >
<!ATTLIST else  xml:space (default|preserve) "preserve">
<!-- like case, but always true
     -->

<!ELEMENT match	 ( %template.e; )*  >
<!-- tests a match of one string in another
     -->

<!ATTLIST match  with   CDATA   #REQUIRED
                 varID     IDREF   #REQUIRED
                 grep   (yes|no)    "no"  
                 xml:space (default|preserve) "preserve"
                 >
<!-- with   the match string
     varID     the ID of the variable in which to search for the match string
     grep   whether to use "PERL5 regular expressions" "(yes|no)" default:"no"
     -->
<!ELEMENT notEmpty	 ( %template.e; )*  >
<!-- true if content is not an empty string
     -->

<!ATTLIST notEmpty	xml:space (default|preserve) "preserve"
                 >

<!ELEMENT lookUp   ( %varsafe.e; )*  >
<!-- looks up a value in a lookUpTable using the content of this 
     element as the key. The entire element is replaced by the 
     returned value. Look-up is case sensitive
     -->

<!ATTLIST lookUp  ref  IDREF  #REQUIRED 
                  xml:space (default|preserve) "preserve">
<!-- ref    the ID of the lookUpTable to use
     -->
     
<!ELEMENT option  ( %template.e; )*  >
<!-- the contents of this element should be omitted if the value of the 
     attributes contained in the element where not resolved. 
     Use this mark-up to indicate a part of the 
     template which may be omitted if a required token is null
     -->

<!ATTLIST option     xml:space (default|preserve) "preserve">

<!ELEMENT hash	EMPTY >
<!-- an empty element which is replaced by an MD5 hash 
     of the targeted variable element. If varID is not present, the hash is 
     generated from the "current text" of the parent element. The Hash is 
     rendered as a hexadecimal number with capital A,B,C,D,E,F
     -->
<!ATTLIST hash varID IDREF  #IMPLIED > 
<!-- varID    the ID of a target variable section
     -->

<!ELEMENT checkSum	EMPTY >
<!-- an empty element which is  replaced by a= checksum of the 
     targeted marked variable. If varID is not present, the checkSum is generated from  
     the "current text" of the parent elementSupported algorithms are: "mod37", 
     which is useful for alphanumeric strings and is specified 
     in Z39.56-1996 (The version 2 SICI). Other useful checksum 
     algorithms may be added as experience warrants.
     -->
<!ATTLIST checkSum  varID   IDREF  #IMPLIED
                    type  CDATA #FIXED  "mod37"
                    >
<!-- varID    the ID of a variable section; if not present, then current string is used
     type   the name of the algorithm used to calculate the checksum. 
            mod37 is the only one defined so far.
     -->

<!-- *****  Bibliographic data tokens ***** -->

<!-- The bibliographic data tokens we refer to are placeholders 
     in a string for bibliographic input. Since XML syntax is 
     used in S-Link-S, XML "SYSTEM" entities are used to represent 
     these tokens. for example, if a publisher wants to specify 
     that links to an article on page 587 in volume 3 should use 
     the URL http://www.publisher.com/3/587/ , the string 
     "http://www.publisher.com/&vol;/&page;/" would be used. 
 
     A publisher wishing to use this link specification would run a 
     S-Link-S program that reads the specification file, and asks for 
     the required bibliographic information, and spits out the resulting URL.
     
     General rules for token normalization
     
     To improve the specificity of bibliographic token strings, 
     the data strings should be normalized before use as data tokens. 
     The normalization operations should take place in the order specified.
     
     replaceSlash           Occasionally, a data string may have a "/" in it; 
                            most servers treat "/" as a path delimiter. 
                            In such cases, "/" should be replaced with "-" 
                            in the many tokens. 
     removeWhiteSpace       White space should be removed in all tokens.
     underscoreWhiteSpace   All instances of one or more white space should be 
                            replaced by a single underscore character.
     removePunctuation      The following punctuation should be removed from 
                            token strings: "#", ",", ".", ":", "(", ")", "[", "]", 
                            "{", "}", "!", ";", """ . and replaced 
                            with white space
     removeStrings          Many entities should have certain strings removed 
                            for normalization. The list of strings should be 
                            removed in order.
     lowerCase              the data string should be converted to lower case.
     toAscii               accented characters should be replaced by their 
                            closest unaccented equivalent, as given in the mapping 
                            table supplied at http://nj.oclc.org/SLinkS/unicodeMap.txt
     trimPunctuation        Punctuation (enumerated above) and whitespace are removed 
                            from the end and beginning of the place-holder string.              
     A S-Link-S implementation should normalize bibliographic data on entry. In cases
     where specific formats are required, a S-Link-S implementation should consider 
     malformed or ambigus entries to be invalid. A S-Link-S implementation may apply
     correct formatting, such as adding a dash to ISSN's.
     -->
     
<!-- *****  General tokens ***** -->

<!ENTITY  baseURL  SYSTEM   "?baseURL" >
<!-- the base URL for the journal. This URL should start with a protocol 
     declaration (usually "http://") end in "/" . Normalization: removeWhiteSpace
     -->

<!ENTITY  volume  SYSTEM   "?volume" >
<!-- A string denoting the journal volume. Normalization: lowerCase, 
     removeStrings :  {"volume", "vol"}, ReplaceSlash,  trimPunctuation, 
     removeWhiteSpace
     -->

<!ENTITY  issue  SYSTEM   "?issue" >
<!-- A string denoting an issue number. Normalization: lowerCase, 
     removeStrings {"issue", "iss", "no" , "number" , "num"}, ReplaceSlash,  
     trimPunctuation, removeWhiteSpace 
     -->

<!ENTITY  pages  SYSTEM   "?pages" >
<!-- A string denoting the page numbers. &pages; =&startPage;-&endPage;
     -->

<!ENTITY  startPage  SYSTEM   "?startPage" >
<!-- A string denoting the page on which an article starts. 
     Normalization: lowerCase, removeStrings {"pages", "page", "no" , "number", 
     "num"}, ReplaceSlash,  trimPunctuation, removeWhiteSpace
     -->

<!ENTITY  endPage  SYSTEM   "?endPage" >
<!-- A string denoting the page on which an article ends. Normalization: 
     lowerCase, removeStrings {"pages", "page", "no" , "number" , "num"}, 
     ReplaceSlash,  trimPunctuation, removeWhiteSpace
     -->

<!ENTITY  pSeq  SYSTEM   "?pSeq" >
<!-- A string denoting the sequence number for cases where multiple 
     articles are found on a page.  Normalization: 
     lowerCase, ReplaceSlash,  trimPunctuation, removeWhiteSpace
     -->

<!ENTITY  artNum  SYSTEM   "?artNum" >
<!-- A string denoting an article number in cases where there are no pages. 
     Normalization: 
     lowerCase, removeStrings {"pages", "page", "no" , "number" , "num"}, 
     ReplaceSlash,  trimPunctuation, removeWhiteSpace
     -->
     
<!ENTITY  itemNum  SYSTEM   "?itemnum" >
<!-- A string denoting an item number for databases, archives, reports, patents. 
     Normalization: lowerCase, replaceSlash, removeStrings { "number" ,"no." ,"no" , 
     "num.","num",  percent},removeWhiteSpace
     -->
     
<!ENTITY  itemNumExact  SYSTEM   "?itemNumExact" >
<!-- A string denoting an item number for databases, archives, reports, patents. 
     Normalization:  removeWhiteSpace
     -->
     
<!ENTITY  CODEN  SYSTEM   "?CODEN" >
<!-- the CODEN of the journal. The match string for a CODEN string is 
     "[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z0-9]". The last digit is a check digit.
     -->

<!ENTITY  ISSN  SYSTEM   "?ISSN" >
<!-- the ISSN of the journal. If there is a separate ISSN for an on-line 
     version, this token refers to the print version ISSN. The match string 
     for an ISSN is "[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9x]". The last 
     character is a check digit.
     -->
      
<!ENTITY eISSN SYSTEM "?eISSN" >
<!-- the ISSN of an on-line version of a print journal. Same format as ISSN.
     -->
        

<!ENTITY  ISBN  SYSTEM   "?ISBN" >
<!-- the International Standard Book Number for a book. The match string 
     for an ISBN is "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9x]". 
     The last digit is a check digit. Hyphens are omitted.
     -->
     

<!ENTITY  jKey  SYSTEM   "?jKey" >
<!-- Many publishers use the same template string for all their journals, 
     and use a key string to distinguish among them. The key string has 
     to be declared in the journal metadata.
     -->
<!-- *****  Publication Date Tokens  ***** 
	A S-Link-S implementation should handle dates specially. If the 
	bibliographic token "month" is entered as "January" then a template 
	calling for "mo" should get "1", and "ssn" should get "winter", etc.
	-->
	
<!ENTITY  year  SYSTEM   "?year" >
<!-- A string denoting the year of publication. The match string is 
     "[0-2][0-9][0-9][0-9]".
     -->

<!ENTITY  yr  SYSTEM   "?yr" >
<!-- A two-digit publication year string. The match string is "[0-9][0-9]". 
      Publishers are admonished not to use this because of Y2K. 
     "00" shall be interpreted to mean "1900"
     -->

<!ENTITY  month  SYSTEM   "?month" >
<!-- A string representing the month of publication. This string should 
     match "(january|february|march|april|may|june|july|august|september|
     october|november|december)"
     -->

<!ENTITY  mon  SYSTEM   "?mon" >
<!-- A 3-letter string representing the month of publication. This string 
     should match "(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)"
     -->

<!ENTITY  mo  SYSTEM   "?mo" >
<!-- A 2-digit string representing the month of publication. This string 
     should match "(01|02|03|04|05|06|07|08|09|10|11|12)"
     -->

<!ENTITY  day  SYSTEM   "?day" >
<!-- A 2-digit string representing the day of publication. This string 
     should match "[0-3][0-9]"
     -->

<!ELEMENT  parsedDate  EMPTY >
<!-- An ISO format string (YYYY-MM-DD) formed from &year; or &yr;, &mo; or
     &month;, and &day;. 
     -->

<!ENTITY  ssn  SYSTEM   "?ssn" >
<!-- A string representing the season of publication. This string should 
     match "(winter|spring|summer|fall)"
     -->

<!ENTITY  quarter  SYSTEM   "?quarter" >
<!-- A string representing the quarter of publication. This string 
     should match "(1|2|3|4)"
     -->

<!ENTITY  authLast  SYSTEM   "?authLast" >
<!-- A string representing the first authors last name. Normalization: 
     toAscii, lowerCase, removePunctuation, underscoreWhiteSpace.
     -->

<!ENTITY  authInit  SYSTEM   "?authInit" >
<!-- A sring with  the first  author's first and middle initials. 
     Normalization: toAscii, lowerCase, removePunctuation, removeWhiteSpace.
     -->


<!-- *****  Input-only tokens ***** 
     These tokens should not be used in URL specifications, because 
     their representations are not generally unique. They are often 
     useful, however, for disambiguation and are inputs needed for 
     SICI generation. 
     -->

<!ENTITY  uTitle  SYSTEM   "?uTitle" >
<!-- title of the item, represented as a Unicode string.
     -->

<!ENTITY  aTitle  SYSTEM   "?aTitle" >
<!-- title of the item, represented as a 7-bit ascii string.
     -->
     
<!ENTITY  jTitle  SYSTEM   "?jTitle" >
<!-- title of the journal, represented as a 7-bit ascii string.
     -->
     
<!ENTITY  doi  SYSTEM   "?doi" >
<!-- the digital object identifier for an item. use <getDOi/> to insert in a urI string.
     -->
     
<!-- *****  Commerce and security tokens  *****  -->

<!ENTITY  linkerID  SYSTEM   "?linkerID" >
<!-- This is an identifier which, by mutual arrangement, can be used 
     to identify the linker. A null string will be substituted when 
     there is no arrangement between linker and linkee. For an example 
     of how this might be used, consider the Amazon.com associates 
     program. The URL in this case would be described as 
     http://www.amazon.com/exec/obidos/ISBN=&ISBN;/&linkerID;/ . 
     Remember that since the resulting URL can be bookmarked, linkerID 
     is only useful in situations where it benefits the linker to add 
     the token. i.e. you can use this to pay for people to link to you, 
     but you can't use it to charge them.

     Although you might think this might be useful for source tracking, 
     it's really only useful for that if you add a passworded hash as well
     -->

<!ENTITY  password  SYSTEM   "?password" >
<!-- I've been surprised how many systems want to have the password as a clear-text 
     token in the query string. So, we've provided this entity so that passwords can be 
     easily inserted in query URL's
     -->

<!ELEMENT  private  EMPTY >
<!-- similar to linkerID, but meant to to implement private arrangements.
     It is an element rather than an entity to allow postprocessing.
     -->
     
<!ATTLIST private data  CDATA #IMPLIED >
<!-- data        data for implementing private arrangements.
     -->

<!ELEMENT  param  EMPTY >
<!-- this element is to be used for parameter passing. parameters are opaque. 
     It can be used in OpenURL style links to insert arbitrarily named parameters into a URL.
     A param can also be used to insert a string cumputed in a var or scratch element.
     -->
     
<!ATTLIST param name  CDATA #IMPLIED>
<!-- name        the name of the parameter.
     -->

<!ELEMENT  dsig  EMPTY >
<!-- dsig is a 128 bit hex-coded (32 character) integer which is the 
     "MD5" one-way hash of the referenced variable or the current text 
     of the parent element, with the linkee's password appended 
     to it. This can be used to implement "digital signing" of a URL. 
     
     An S-Link-S implementation will have a centrallized signature authority
     which authenticates a user and adds the linkee's password to the signed 
     string before computing and returning a hash string to the linker. 
     -->
<!ATTLIST dsig varID IDREF  #IMPLIED > 
<!-- varID    the ID of a target variable section
     -->
       
<!-- ***** Public database key elements  *****   -->
<!-- Certain article databases are sufficiently public, accessible or 
     widely used that their keys may be suitable for use as tokens 
     in link URLs.
     -->

<!ELEMENT  pmid  EMPTY >
<!-- The NCBI PubMed identifier number for the article.
     -->

<!ELEMENT  getDOi  EMPTY >
<!-- The Digital Object identifier for the article. Checks first for a doi entity, then 
     a DOi element is present, 
     it is used, finally, a query is sent to a preferred DOi database.
     -->



<!-- ***** SICI-related markup  *****   -->
<!-- These entities are provided to support SICI standards and to allow 
     publishers to use SICI's in URL's and DOI's
     -->

<!ELEMENT  titleCode  EMPTY >
<!-- an ascii string derived from the title of the item using the rules 
     specified in ANSI/NISO Z39.56-1991 and ANSI/NISO Z39.56-1996 .
     -->

<!ATTLIST titleCode vers        (1|2)     "2" >
<!-- vers        the SICI version. vers="1" corresponds to ANSI/NISO Z39.56-1991; 
                 vers="2" corresponds to ANSI/NISO Z39.56-1996
     -->
          
<!ELEMENT SICI EMPTY >
<!-- an empty element which is  replaced by SICI strings according 
     to the specified attributes .
     -->
<!ATTLIST SICI vers        (1|2)     "2"
               titleCode   (yes|no)  "no"
               enumeration (v|vn)    "v"
               chronology  (year|yearMo|yearMoDa|yearQ|yearS)  "year"
               CSI         (1|2|3)   "2"
               DPI         (0|1|2|3) "0"
               MFI         (TX|TL|TH|TS|TB|CD|CF|CT|CO|HE|HD|SC|VX|ZN|ZU|ZZ) "TX"
               >
<!-- vers        the SICI version. vers="1" corresponds to ANSI/NISO Z39.56-1991; 
                 vers="2" corresponds to ANSI/NISO Z39.56-1996
     titleCode   whether to include the Title Code  in the contribution segment.
     enumeration This attribute specifies the required level of detail in the 
                 enumeration string.
     chronology  This attribute specifies the detail required for 
                 the chronology string.
     CSI         the SICI-2 code structure identifier. CSI="1" is 
                 the SICI-2 for a journal issue; CSI="3" contains private codes.
     DPI         The SICI-2 Derivative Part Identifier. DPI="0" is a 
                 contribution, DPI="1" is a table of contents, DPI="2" is an 
                 index, DPI="3" is an abstract.
     MFI         The SICI-2 "Medium/Format Identifier".
     -->
<!-- revisions:
0.2  1998-10-16 Added whitespace handling defaults. 
0.21 1998-10-19 Added pseq, artnum, itemnum. Changed &key; to &jkey;
0.22 1998-10-26 pseq to pSeq
0.3  1998-10-28 artnum to artNum, itemnum to item Num, startpage to startPage, endpage to endPage; 
                added itemNumExact; added unAccent normalization; changed some normalizations;
                many comment corrections; added option element
0.31 1998-10-30 hashURL, parsedDate, titleCode, DOi, medline now  elements; added unknown
0.32 1998-11-02 added private element
0.4  1998-11-24 fixed typos so that the DTD validates with XML4J; added pattern element; changed 
                some content models to %marksafe.e so that they remain mark-safe
0.41 1999-02-19 changed name of medline to muid.
                made default of padChar to be zero; clarified that pad can be used to chop.
0.5  1999-03-xx changed order of top-level elements to ensure that a S-Link-S file can be parsed 
                in a single pass.
0.9  1999-05-05 changed muid to pmid; fixed typos, added locator, changed system Identifiers, removed unknown,
                changed mark to var, marksafe.e to varsafe.e. xml:space attributes changed to FIXED.
                match and case now work differently. Both now reference a var element instead of containing
                variable text in attribute values. This was necessary because XML restrictions on external 
                entities in attribute values made the previous construct rather awkward. 
                The implementation of  hash and checkSum is now  that if the "ref" attribute is missing the hash 
                or checkSum is generated from the "current text"
                of the partent element. unAccent renamed toAscii. ref is changed to varID 
                whereever it refers to a var.
                passHash replaced with dsig. removed password.
0.91 1999-05-18 added CDATA declaration for #FIXED attributes to satisfy strict parsers 
1.0  1999-05-31 added complete attribute to slinks element to help distinguish templates that need
                a network connection from those that don't.
                added the usage attribute to URL.
                added query attribute to locator, to specify the source of the query string.
                The query and usage attributes replace the resolution property in S-Link-S RDF.
                content model errors introduced in previous versions have been corrected.
                changed &URL; to &baseURL; so that the element and entity don't step on each other.
1.01 1999-10-26	added jTitle.
1.02 1999-11-16 added a normalizaton, changed bibliographic token normalizations
1.03 2000-08-01 the declarations for xml:space were using #FIXED, when strictly speaking, they should be 
                enumerated tokens: (default|preserve)
1.04 2000-12-06 added the notEmpty element
1.05 2001-04-22 added password entity to facilitate use with Crossref. Added encode element for OpenURL use. 
                Added doi entity for OpenURL use.
1.06 2001-07-11 added param element to facilitate parameter passing from OpenURL. 
                added notRequired element to improve requirements analysis for SICI etc.
1.07 2002-05-26 moved lookUp into varsafe content model
                changed ID attribute of slinks element to CDATA to allow uri style ID's
                varID attribute of checksum changed to IMPLIED to match documentation
1.08 2002-09-06 changed content model of locator to (%varsafe.e;)*
1.09 2002-12-02 changed content model of a bunch of elements from (%varsafe.e)* to (%template.e;)*. The whole effort to enforce anti-looping using content models has not proven to be useful.
1.10 2003-03-21 big changes here. The postArgs element, previously not used, now contains items. encode and postArgs now have encoding parameters. The scratch element is introduced to provide extra flexibility in computation.
1.11 2003-05-04 added postItem to make the new postArgs usable.

             
-->