Skip to content

Instantly share code, notes, and snippets.

@rmzelle
Created May 19, 2011 17:42
Show Gist options
  • Save rmzelle/981311 to your computer and use it in GitHub Desktop.
Save rmzelle/981311 to your computer and use it in GitHub Desktop.
namespace atom = "http://www.w3.org/2005/Atom"
namespace cs = "http://purl.org/net/xbiblio/csl"
namespace dc = "http://purl.org/dc/elements/1.1/"
namespace s = "http://www.ascc.net/xml/schematron"
namespace xhtml = "http://www.w3.org/1999/xhtml"
dc:title [ "Citation Style Language" ]
dc:creator [ "Bruce D'Arcus" ]
dc:creator [ "Simon Kornblith" ]
dc:copyright [ "Bruce D'Arcus and Simon Kornblith, 2007" ]
dc:rights [ "Permission to freely use, copy and distribute." ]
dc:description [
"Citation Style Language (CSL) schema for describing bibliographic and citation formatting."
]
start = style
## The CSL data model consists of resources and variables. Primary resources are the
## citation object itself, as well as related agents and events. Variables are
## attributes of the resource: titles, dates, volume numbers, and so forth. From the
## perspective of CSL, resources templates involve a list of variables. By contrast,
## a variable can be accessed directly.
## In addition, CSL also contains structures for macros and parameter options.
div {
style =
element cs:style {
attribute xml:lang { xsd:language }?,
## Refers to the default locale for the style; should generally
## be set for any academic journal, since it can be used to ensure
## proper quote formatting and such.
attribute default-locale { xsd:language }?,
attribute class { "in-text" | "note" },
info,
(terms? & macro* & citation & bibliography?)?
}
}
## info element
div {
## The Content model for the metadata is borrowed from Atom.
info =
element cs:info {
info-author*
& info-category*
& info-contributor*
& info-id
& info-issn?
& info-link*
& info-published?
& info-rights?
& info-source?
& info-summary?
& info-title
& info-updated
}
info-text =
attribute xml:lang { xsd:language }?,
text
info-author = element cs:author { info-Contributor-pattern }
info-Contributor-pattern =
element cs:name { text }
& element cs:email { text }?
& element cs:uri { xsd:anyURI }?
div {
## The schema attribute should be understood to specify the controlled
## CSL category list. The terms thus typically include further logic,
## such as the broader categories to which they belong ("humanities",
## "social sciences") as well as the class of style ("author-date", "note", etc.).
info-category =
element cs:category {
attribute term { info-fields | info-classes },
attribute scheme { xsd:anyURI }?,
attribute label { text }?
}
## Add one or more field categories. The "generic-base" category is reserved
## for the handful of truly generic styles (APA, Harvard, etc.) from which most descend.
info-fields =
"anthropology"
| "astronomy"
| "biology"
| "botany"
| "chemistry"
| "communications"
| "engineering"
| "generic-base"
| "geography"
| "geology"
| "history"
| "humanities"
| "law"
| "linguistics"
| "literature"
| "math"
| "medicine"
| "philosophy"
| "physics"
| "psychology"
| "sociology"
| "science"
| "political_science"
| "social_science"
| "theology"
| "zoology"
| info-categories.extension
info-classes = "author-date" | "numeric" | "label" | "note" | "in-text"
## You can override in a customization schema, though please report
## obvious gaps for inclusion in the schema.
info-categories.extension = notAllowed
}
info-contributor = element cs:contributor { info-Contributor-pattern }
info-translator = element cs:translator { info-Contributor-pattern }
## As in Atom, the cs:id element is a required URI that is globally-unique
## and persistant. Once assigned it should never change. Ideally, of course,
## the URI resolves to the correct CSL file.
info-id = element cs:id { string }
info-link =
element cs:link {
attribute href { xsd:anyURI },
## For transformation to Atom, the rel values should be expanded to include the
## base URI <http://purl.org/net/xbiblio/csl/relations#>.
attribute rel {
## The CSL file URI whose configuration content should be
## used for processing. To be used where, for example, a
## journal may use a generic publisher style that is shared
## with other journals.
"source"
|
## The CSL file URI on which the style is based. Since most
## styles are based on a handful of core styles, this can be
## useful metadata to see those relationships.
"template"
|
## The homepage URI for the style.
"homepage"
|
## A documentation URI for a style.
"documentation"
}?,
# type borrows from Atom schema pattern
## media-type
attribute type {
xsd:string { pattern = ".+/.+" }
}?,
attribute hreflang { xsd:language }?,
attribute title { text }?,
attribute length { text }?,
string
}
info-published = element cs:published { xsd:dateTime }
info-rights = element cs:rights { info-text }
info-source = element cs:source { info-title & info-link? & info-id }
info-summary = element cs:summary { info-text }
info-title = element cs:title { info-text }
## the issn for the journal the style corresponds to
# might use a regular expression pattern to validate content?
info-issn = element cs:issn { text }
info-updated = element cs:updated { xsd:dateTime? }
}
## Terms and forms
div {
cs-terms =
## Miscellaneous Terms
"accessed"
| "anonymous"
| "and"
| "and others"
| "at"
| "et-al"
| "forthcoming"
| "from"
| "in press"
| "ibid"
| "in"
| "no date"
| "references"
| "retrieved"
| "letter"
| "interview"
| "online"
| "cited"
| "edition"
| "internet"
| "presented at"
|
## Roles
"editor"
| "translator"
| "interviewer"
| "recipient"
|
## Months
"month-01"
| "month-02"
| "month-03"
| "month-04"
| "month-05"
| "month-06"
| "month-07"
| "month-08"
| "month-09"
| "month-10"
| "month-11"
| "month-12"
|
## Other
cs-terms.locator
| cs-terms.extension
| info-fields
## Locators
cs-terms.locator =
"book"
| "chapter"
| "column"
| "figure"
| "folio"
| "issue"
| "line"
| "note"
| "opus"
| "page"
|
## a synonym for "page" (to be deprecated)
"page-range"
| "page-first"
| "paragraph"
| "part"
| "section"
| "sub verbo"
| "volume"
| "verse"
## "symbol" and reverts to "short" if no term exists
## "verb-short" reverts to "verb" if no term exists
## all others revert to "long" if no term exists
cs-term-forms = "long" | "verb" | "short" | "verb-short" | "symbol" | cs-term-forms.extension
## include-period adds a period after a term if and only if the
## term used (not necessarily term specified; see above) is
## of form "short" or "verb-short"
include-period = attribute include-period { xsd:boolean }?
## Extension structures. You may override these in a customization
## schema. If you do, please contact the xbiblio project to add
## the term or form to the formal controlled list in the schema.
div {
cs-terms.extension = notAllowed
cs-term-forms.extension = notAllowed
}
}
## Locales
div {
## Terms are localized strings used as content for the cs:text field.
## It is only needed where you need to add a term not supported by
## default, or override an existing one.
terms = element cs:terms { locale+ }
## A language-specific wrapper.
locale =
element cs:locale {
## Where localization is other than that of the style, use the
## xml:lang attribute.
attribute xml:lang { xsd:language }?,
(simple-term | compound-term)+
}
term-attributes =
attribute form { cs-term-forms }?,
attribute name { cs-terms },
include-period
## Simple terms are basic strings, used to represent genres, media, etc.
simple-term = element cs:term { term-attributes, text }
## Compound terms are those whose output can be either singular or plural.
## Typically used for things like page number or editor labels.
compound-term = element cs:term { term-attributes, single-term, multiple-term }
multiple-term = element cs:multiple { text }
single-term = element cs:single { text }
}
## Names is a data type holding a text of authors, editors, or translators.
div {
names-attributes =
formatting,
delimiter,
attribute variable {
list { cs-names+ }
}
names = element cs:names { names-attributes, (name & name-label*), substitute? }
## Short version of "names" element, without children, allowed in <substitute>
names-short = element cs:names { names-attributes }
name =
element cs:name {
formatting,
## Indicates long (first name + last name, for Western names) or short
## (last name only, for Western names) form of name. Default is long
## form
attribute form { "long" | "short" }?,
## Controls appearance of "and"/"&". To disable, do not specify.
attribute and { "text" | "symbol" }?,
## Delimiter between names (delimiter between variables is on <names>
## tag, where it should be). This is ", " in "J. Doe, S. Smith."
delimiter,
## delimiter for the last name is a list
attribute delimiter-precedes-last {
## The "always" value means that result is "J. Doe, and T. Timmons"
"always"
|
## Default behavior; would result in "J. Doe and T. Timmons," but "J. Doe,
## S. Smith, and T. Timmons" (note comma preceding 'and').
"never"
}?,
## Sets the first-author name order to correspond to the sort order of
## the bibliography; e.g. Doe, John (name-as-sort-order) vs. John Doe (w/o
## attribute).
attribute name-as-sort-order { "first" | "all" }?,
## The delimiter for personal name parts where sort order differs from
## display order (for example, in standard Western names). This is the
## ", " in "Doe, John."
attribute sort-separator { text }?,
## Indicates whether given name parts ought to be given as initials
## (e.g., J. K. Rowling) and the text to follow each initial.
attribute initialize-with { text }?
}
## Similar to label as below, but inherits variable from <names> tag
name-label = element cs:label { label-primitives }
## Substitutions, if the name does not exist
substitute = element cs:substitute { (names-short | cs-element)+ }
cs-names =
"author"
| "editor"
| "translator"
| "recipient"
| "interviewer"
| "publisher"
| "composer"
| "original-publisher"
| "original-author"
|
## to be used when citing a section of a book, for example, to distinguish the author
## proper from the author of the containing work
"container-author"
|
## use for series editor
"collection-editor"
}
## date
div {
date =
element cs:date {
attribute variable {
list { cs-date-tokens+ }
},
formatting,
delimiter,
date-part+
}
date-part = element cs:date-part { formatting, (month | day | year-other) }
## Month formats:
## long (default): January
## short: Jan
## numeric: 1
## numeric-leading-zeros: 01
month =
attribute name { "month" },
(attribute form { "long" | "short" | "numeric" | "numeric-leading-zeros" }?,
include-period)
## Day formats:
## numeric (default): 5
## numeric-leading-zeros: 05
## ordinal: 5th
day =
attribute name { "day" },
attribute form { "numeric" | "numeric-leading-zeros" | "ordinal" }?
## Year formats:
## long (default): 2005
## short: 05
## Other represents any non-month/day/year date part
year-other =
attribute name { "year" | "other" },
attribute form { "short" | "long" }?
cs-date-tokens = "issued" | "event" | "accessed" | "container" | "original-date" | "submitted"
}
## The cs:text element is the main formatting element used to layout down content.
div {
cs-text =
element cs:text {
formatting,
((((
## adds a variable belonging to this item
attribute variable {
list { variables+ }
}
& delimiter)
|
## adds the results of a macro, as specified in the main body of the CSL
attribute macro { token }
|
## A descriptor that locates sub-item content within a cited resource. Used
## in some styles to indicate specific page numbers for excerpted
## content, for example.
attribute point-locator { cs-terms.locator }),
attribute form { "short" | "long" }?)
| (
## adds a localized term
attribute term { cs-terms },
attribute form { cs-term-forms }?,
include-period,
plural?)
|
## adds the text in the value field. use sparingly.
## when dealing with localizable text, <text term="(term)"/> should be
## used, even if this means defining a new term.
attribute value { text })
}
## The number markup directive matches the first number found in a field,
## and returns only that component. If no number is detected, the result
## is empty. A non-empty number may be subject to further formatting consisting
## of a form attribute whose value may be numeric, ordinal or roman to format
## it as a simple number (the default), an ordinal number (1st, 2nd, 3rd etc)
## or roman (i, ii, iii, iv etc). The text-case can also apply to capitalize
## the roman numbers for instance. The other normal formatting rules apply
## too (font-style, ...). When used in a conditional, number tests if
## there is a number present, allowing conditional formatting.
cs-number =
element cs:number {
formatting,
attribute variable { "edition" | "volume" | "issue" | "number" | "number-of-volumes" },
attribute form { "numeric" | "ordinal" | "roman" }?
}
variables =
## the primary title for the cited item
"title"
|
## the secondary title for the cited item; for a book chapter, this
## would be a book title, for an article the journal title, etc.
"container-title"
|
## the tertiary title for the cited item; for example, a series title
"collection-title"
|
## collection number; for example, series number
"collection-number"
|
## title of a related original version; often useful in cases of translation
"original-title"
|
## the name of the publisher
"publisher"
|
## the location of the publisher
"publisher-place"
|
## the name of the archive
"archive"
|
## the location of the archive
"archive-place"
|
## the location within an archival collection (for example, box and folder)
"archive_location"
|
## issuing authority (for patents) or judicial authority (such as court
## for legal cases)
"authority"
|
## the name or title of a related event such as a conference or hearing
"event"
|
## the location or place for the related event
"event-place"
|
##
"page"
|
## a description to locate an item within some larger container or
## collection; a volume or issue number is a kind of locator, for example.
"locator"
|
## version description
"version"
|
## volume number for the container periodical
"volume"
|
## refers to the number of items in multi-volume books and such
"number-of-volumes"
|
## refers to the number of pages in a book or other document
"number-of-pages"
|
## the issue number for the container publication
"issue"
|
##
"chapter-number"
|
## medium description (DVD, CD, etc.)
"medium"
|
## the (typically publication) status of an item; for example "forthcoming"
"status"
|
## an edition description
"edition"
|
## a section description (for newspapers, etc.)
"section"
|
##
"genre"
|
## a short inline note, often used to refer to additional details of the resource
"note"
|
## notes made by a reader about the content of the resource
"annote"
|
##
"abstract"
|
##
"keyword"
|
## a document number; useful for reports and such
"number"
|
## for related referenced resources; this is here for legal case
## histories, but may be relevant for other contexts.
"references"
|
##
"URL"
|
##
"DOI"
|
##
"ISBN"
|
##
"call-number"
|
## the number used for the in-text citation mark in numeric styles
"citation-number"
|
## the label used for the in-text citation mark in label styles
"citation-label"
|
## The number of a preceding note containing the first reference to
## this item. Relevant only for note-based styles, and null for first references.
"first-reference-note-number"
|
## The year suffix for author-date styles; e.g. the 'a' in '1999a'.
"year-suffix"
}
## The cs:label element.
div {
## The label element is used to print text terms that depend on document content
## for pluralization. For labeling pages, this is preferable, as pages may be
## either singular or plural (p. or pp.)
label =
element cs:label {
label-primitives,
attribute variable { "page" | "locator" }
}
label-primitives =
formatting,
include-period?,
attribute form { cs-term-forms },
## On cs:label, use to modify default pluralization behavior.
plural?
## modifies plualization behavior [ a:defaultValue = "contextual" ]
plural = attribute plural { xsd:boolean }
}
## The cs:macro element
div {
## The macro element works something like in BibTeX, and provides a ready-made
## bundle of formatting templates that can be easily reusesd elsewhere.
macro =
element cs:macro {
attribute name { token },
cs-element+
}
}
## The cs:group element
div {
## Group is used to provide delimiters and a common prefix/suffix. It is syntactic
## sugar for a conditional that tests for the presence of any non-null child variable
## or macro call results. So if there are no such results, then any <text term="(term)">
## content will not be printed.
group =
element cs:group {
formatting,
delimiter,
## the class attribute can be used to pass on styling hooks for CSS and such
attribute class { token }?,
cs-element+
}
}
div {
layout = element cs:layout { formatting, delimiter, cs-element }
cs-element = (names | date | label | cs-text | cs-number | choose | group)+
}
## The cs:citation element
div {
## The cs:citation handles printing of citations. A citation may consist of
## one-or-more references to bibliographic sources. These references can either
## be simple in-text keys [doe99] or numeric markers [1], or more complex short
## descriptors generated at runtime common in author-date (Doe, 1999a) or note-based
## styles.
## note: one issue unique to note-based styles is that a citation reference
## effectively may become a full sentence. Implementers should consider this in
## their design and insert the final formatted citation in the correct title form.
## For example, if a citation is footnoted without any additional text, the first
## character of the output should be uppercased. By contrast, if the citation is
## within a pre-existing footnote, and preceded by non-citation text, then it should
## be printed as is.
citation = element cs:citation { (citation-options* & sort?), layout }
}
## The cs:bibliography element
div {
bibliography = element cs:bibliography { (bibliography-options* & sort?), layout }
}
## The cs:option element
div {
citation-options = et-al | et-al-subsequent | disambiguate | collapse
bibliography-options =
et-al | hanging-indent | second-field-align | subsequent-author-substitute | line-formatting | group-by
## Pattern for options that are either true or false
option-tf = attribute value { xsd:boolean }
## Sorting and grouping by author assumes by default that the string includes the entire list
## of authors. This option allows you to instead use first author only.
group-by =
element cs:option {
attribute name { "group-by" },
attribute value { "first-author" }
}
## sets the bibliographic entries to be rendered with hanging-indents
hanging-indent =
element cs:option {
attribute name { "hanging-indent" },
option-tf
}
## "citation-number" collapses numeric citations from [1, 2, 3] to [1-3]
## "year" collapses authors from (Doe 2000, Doe 2001) to (Doe 2000,
## 2001)
## "year-suffix" collapses as "year", but also collapses (Doe 2000a,
## Doe 2000b) to (Doe 2000a, b) (ignored if
## disambiguate-add-year-suffix is missing)
collapse =
element cs:option {
attribute name { "collapse" },
attribute value { "citation-number" | "year" | "year-suffix" }
}
## second-field-align is useful for formatting a numbered list. It aligns
## any subsequent lines of a bibliography entry with the beginning of the
## second field. For example, if the first field is
## <text variable="citation-number" suffix=". "/>
##
## 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
## eiusmod
##
## If set to "margin," then the first field is put in the margin and all
## subsequent lines of text are aligned with the margin. This is useful for
## IEEE style.
second-field-align =
element cs:option {
attribute name { "second-field-align" },
attribute value { "true" | "margin" }
}
## substitutes subsequent recurrences of an author for a given string
subsequent-author-substitute =
element cs:option {
attribute name { "subsequent-author-substitute" },
attribute value { text }
}
## defines parameters relating to "et al" formatting:
## et-al-min: the minimum number of contributors to use "et al"
## et-al-use-first: the number of contributors to explicitly print under
## "et al" conditions
## et-al-subsequent-*: same as above, but for subsequent references
## (citation only)
et-al =
element cs:option {
attribute name { "et-al-min" | "et-al-use-first" },
attribute value { xsd:integer }
}
et-al-subsequent =
element cs:option {
attribute name { "et-al-subsequent-min" | "et-al-subsequent-use-first" },
attribute value { xsd:integer }
}
## defines parameters relating to disambiguation, followed in the order given
## below until a citation is disambiguated
## disambiguate-add-names: add additional names, disregarding
## the "et-al" setting, to disambiguate the citations
## disambiguate-add-givenname: add a given name to a citation
## to disambiguate it (e.g., John Doe, 2005 vs. Doe, 2005)
## disambiguate-add-year-suffix: add a suffix to the year (e.g.,
## 2007a) when there are two works by the same author published in
## the same year included in one bibliography
disambiguate =
element cs:option {
attribute name {
"disambiguate-add-givenname" | "disambiguate-add-names" | "disambiguate-add-year-suffix"
},
option-tf
}
# defines spacing between entries and between lines
# line-spacing: in units of lines; default 1
# entry-spacing: in units of line-spacing; default 1
line-formatting =
element cs:option {
attribute name { "line-spacing" | "entry-spacing" },
attribute value { xsd:integer }
}
}
## The cs:sort element
div {
all-variables = variables | cs-date-tokens | cs-names
## The sort element specifies the sort order for a citation or for the
## bibliography. If it is not added, citations are sorted according to user
## preferences, and bibliography is sorted according to order cited.
sort = element cs:sort { key+ }
key =
element cs:key {
(attribute variable { all-variables }
| attribute macro { token }),
## Default sort order is ascending
attribute sort { "ascending" | "descending" }?
}
}
## The cs:choose element
div {
## The choose elements provides a simple conditional structure.
choose = element cs:choose { if, else-if*, else? }
if = element cs:if { condition, cs-element* }
else-if = element cs:else-if { condition, cs-element* }
else = element cs:else { cs-element+ }
condition =
## If the entry is of a given type, this is true
attribute type {
list { cs-types+ }
}?,
## If a given variable exists, this is true
attribute variable {
list { all-variables+ }
}?,
## If a given variable contains numeric data, this is true
attribute is-numeric {
list { all-variables+ }
}?,
## If a given variable contains a date, this s true
attribute is-date {
list { all-variables+ }
}?,
## The position of a citation. Whenever position="ibid-with-locator"
## is true, position="ibid" is also true, and whenever position="ibid"
## is true, position="subsequent" is also true
attribute position {
list { ("first" | "subsequent" | "ibid" | "ibid-with-locator")+ }
}?,
## If text inside an <if disambiguate="true"> block can be used to
## differentiate two otherwise identical citations, it will be added.
## If the citations remain identical after its addition, it will not
## be added.
attribute disambiguate { xsd:boolean }?,
## A conditional on the locator for this specific entry
attribute locator {
list { cs-terms.locator+ }
}?,
attribute match { "all" | "any" | "none" }?
}
## variables and types; needs some more thought
div {
cs-types =
"article"
| "article-magazine"
| "article-newspaper"
| "article-journal"
| "bill"
| "book"
| "broadcast"
| "chapter"
| "entry"
| "entry-dictionary"
| "entry-encyclopedia"
| "figure"
| "graphic"
| "interview"
| "legislation"
| "legal_case"
| "manuscript"
| "map"
| "motion_picture"
| "musical_score"
| "pamphlet"
| "paper-conference"
| "patent"
| "post"
| "post-weblog"
| "personal_communication"
| "report"
| "review"
| "review-book"
| "song"
| "speech"
| "thesis"
| "treaty"
| "webpage"
}
## Formatting attributes.
div {
delimiter = attribute delimiter { text }?
## attributes are drawn directly from CSS and FO where possible
formatting =
attribute prefix { text }?,
attribute suffix { text }?,
attribute font-family { text }?,
attribute font-style { "italic" | "normal" | "oblique" }?,
attribute font-variant { "normal" | "small-caps" }?,
attribute font-weight { "normal" | "bold" | "light" }?,
attribute text-decoration { "none" | "underline" }?,
attribute vertical-align { "baseline" | "sup" | "sub" }?,
attribute text-case {
## display all text as lowercase
"lowercase"
|
## display all text as uppercase
"uppercase"
|
## capitalize first character; other characters
## displayed as is
"capitalize-first"
|
## capitalize first character of every word;
## other characters displayed lowercase
"capitalize-all"
|
## display as title case (the Chicago Manual
## of Style calls this "headline style")
"title"
|
## display as sentence case/sentence style
"sentence"
}?,
## For examples such as abstracts and notes in annotated bibliographies
## use the "block" display value. Otherwise, content is displayed inline.
attribute display { "block" | "inline-block" }?,
attribute quotes { xsd:boolean }?
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment