zotero/chrome/content/zotero/updateCSL.xsl
2011-03-30 17:07:43 +00:00

448 lines
19 KiB
XML

<xsl:stylesheet xmlns:cs="http://purl.org/net/xbiblio/csl" xmlns="http://purl.org/net/xbiblio/csl"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" exclude-result-prefixes="cs">
<xsl:output indent="yes" method="xml" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<!-- * xml:lang is no longer allowed on cs:style to eliminate confusion with
the default-locale attribute. If xml:lang was set, its value is
transferred to the default-locale attribute.
* cs:style now indicates CSL version compatibility via the version
attribute. -->
<xsl:template match="/cs:style">
<xsl:copy>
<xsl:copy-of select="@*[not(name()='xml:lang')]"/>
<xsl:choose>
<xsl:when test="@xml:lang and not(@xml:lang='en' or @xml:lang='en-US' or @xml:lang='en-us')">
<xsl:attribute name="default-locale">
<xsl:value-of select="@xml:lang"/>
</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:attribute name="version">1.0</xsl:attribute>
<xsl:attribute name="demote-non-dropping-particle">sort-only</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- Elements that themselves can be copied verbatim but whose child nodes
might require modification. -->
<xsl:template
match="cs:choose|cs:else|cs:info|cs:names|cs:substitute|cs:macro|cs:layout">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- Elements that can be copied verbatim together with any child nodes. -->
<xsl:template match="cs:sort|cs:number|comment()">
<xsl:copy-of select="."/>
</xsl:template>
<!-- Child elements of cs:info that can be copied verbatim. -->
<xsl:template
match="cs:author|cs:contributor|cs:id|cs:issn|cs:published|cs:rights|cs:source|cs:summary|cs:title|cs:updated">
<xsl:copy-of select="."/>
</xsl:template>
<!-- For the rel attribute on cs:link, "documentation" will be used instead of
"homepage", and "source" has been renamed to "independent-parent". The
URL of a dependent style is now accompanied with a rel value of "self". -->
<xsl:template match="cs:link">
<xsl:variable name="rel-value">
<xsl:choose>
<xsl:when test="@rel='documentation' or @rel='homepage'">documentation</xsl:when>
<xsl:when test="@rel='template'">template</xsl:when>
<xsl:when test="@rel='source'">independent-parent</xsl:when>
<xsl:otherwise>self</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="href">
<xsl:value-of select="@href"/>
</xsl:attribute>
<xsl:attribute name="rel">
<xsl:value-of select="$rel-value"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
<!-- The citation-format and field attributes have replaced the term attribute
on cs:category, and the "in-text" category has been removed. Styles with
the "in-text" category are assigned the "numeric" citation-format if the
"citation-number" variable is used in citations, and the "author-date"
format in all other cases. -->
<xsl:template match="cs:category">
<xsl:choose>
<xsl:when test="@term='in-text'">
<xsl:choose>
<xsl:when test="/cs:style/cs:citation//cs:text[@variable='citation-number']">
<xsl:copy>
<xsl:attribute name="citation-format">numeric</xsl:attribute>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="citation-format">author-date</xsl:attribute>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="@term='author-date' or @term='numeric' or @term='label' or @term='note'">
<xsl:copy>
<xsl:attribute name="citation-format">
<xsl:value-of select="@term"/>
</xsl:attribute>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="field">
<xsl:value-of select="@term"/>
</xsl:attribute>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- The hierarchy cs:terms/cs:locale/cs:term has been replaced by
cs:locale/cs:terms/cs:term. -->
<xsl:template match="cs:terms/cs:locale">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:element name="terms">
<xsl:copy-of select="cs:term"/>
</xsl:element>
</xsl:copy>
</xsl:template>
<!-- Citation-specific CSL options are now set as attributes on cs:citation,
instead of via cs:option elements. -->
<xsl:template match="cs:citation">
<xsl:copy>
<xsl:for-each select="cs:option">
<xsl:attribute name="{@name}">
<xsl:value-of select="@value"/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates select="cs:layout|cs:sort"/>
</xsl:copy>
</xsl:template>
<!-- * Bibliography-specific CSL options are now set as attributes on
cs:bibliography, instead of via cs:option elements.
* second-field-align now uses the value "flush" instead of "true". -->
<xsl:template match="cs:bibliography">
<xsl:copy>
<xsl:for-each select="cs:option">
<xsl:choose>
<xsl:when test="@name='second-field-align' and @value='true'">
<xsl:attribute name="second-field-align">flush</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="{@name}">
<xsl:value-of select="@value"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:apply-templates select="cs:layout|cs:sort"/>
</xsl:copy>
</xsl:template>
<!-- CSL 1.0 eliminates item type fallback behavior in conditionals
("article", "book" and "chapter" used to be type archetypes, e.g.
"article-journal" would be a subtype of "article", see
http://docs.google.com/View?id=dg6h9k72_64hzmsmqgb). For the conversion,
each archetype is replaced by all subtypes of that archetype (while
making sure that "song" is only present once in the attribute string, as
"song" is a subtype of both "article" and "book"). If an archetype is
replaced by its subtypes, the match attribute is set to "any", unless
match was set to "none". This is done as "type='chapter' match='all'" can
test true, but "type='chapter paper-conference' match='all' can not (each
item is of a single type). cs:if and cs:if-else elements that, in
addition to the type conditional, test with match="all" (the default
attribute value) and carry additional conditionals are split into a
nested conditional (an example of this case is given at
http://forums.zotero.org/discussion/11960/item-type-testing-in-csl-10-and-fallbacks/#Comment_58392
). -->
<xsl:template match="cs:if|cs:else-if">
<xsl:copy>
<xsl:choose>
<xsl:when test="contains(@type,'book') or (contains(@type,'article') and not(contains(@type,'article-'))) or contains(@type,'chapter')">
<xsl:choose>
<xsl:when test="(not(@match='any') and not(@match='none')) and (@variable or @is-numeric or @position or @disambiguate)">
<xsl:call-template name="fallback-replacement"/>
<xsl:attribute name="match">any</xsl:attribute>
<xsl:element name="choose">
<xsl:element name="if">
<xsl:copy-of select="@*[not(name()='type')]"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@*"/>
<xsl:call-template name="fallback-replacement"/>
<xsl:if test="not(@match='none')">
<xsl:attribute name="match">any</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
<xsl:template name="fallback-replacement">
<xsl:choose>
<xsl:when test="contains(@type,'book')">
<xsl:attribute name="type">
<xsl:call-template name="book-sans-space"/>
<xsl:call-template name="article"/>
<xsl:call-template name="chapter"/>
</xsl:attribute>
</xsl:when>
<xsl:when test="contains(@type,'article') and not(contains(@type,'article-'))">
<xsl:attribute name="type">
<xsl:call-template name="article-sans-space"/>
<xsl:call-template name="book"/>
<xsl:call-template name="chapter"/>
</xsl:attribute>
</xsl:when>
<xsl:when test="contains(@type,'chapter')">
<xsl:attribute name="type">
<xsl:call-template name="chapter-sans-space"/>
<xsl:call-template name="article"/>
<xsl:call-template name="book"/>
</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="book-sans-space">
<xsl:text>bill book graphic legal_case motion_picture report song</xsl:text>
</xsl:template>
<xsl:template name="article-sans-space">
<xsl:choose>
<xsl:when test="contains(@type,'article') and not(contains(@type,'article-')) and contains(@type,'book')">article-journal article-magazine article-newspaper broadcast interview manuscript map patent personal_communication speech thesis webpage</xsl:when>
<xsl:when test="contains(@type,'article') and not(contains(@type,'article-'))">article-journal article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="chapter-sans-space">
<xsl:text>chapter paper-conference</xsl:text>
</xsl:template>
<xsl:template name="book">
<xsl:choose>
<xsl:when test="contains(@type,'book')"> bill book graphic legal_case motion_picture report song</xsl:when>
<xsl:otherwise>
<xsl:if test="contains(@type,'bill')"> bill</xsl:if>
<xsl:if test="contains(@type,'graphic')"> graphic</xsl:if>
<xsl:if test="contains(@type,'legal_case')"> legal_case</xsl:if>
<xsl:if test="contains(@type,'motion_picture')"> motion_picture</xsl:if>
<xsl:if test="contains(@type,'report')"> report</xsl:if>
<xsl:if test="contains(@type,'song')"> song</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="article">
<xsl:choose>
<xsl:when test="contains(@type,'article') and not(contains(@type,'article-')) and contains(@type,'book')"> article-journal article-magazine article-newspaper broadcast interview manuscript map patent personal_communication speech thesis webpage</xsl:when>
<xsl:when test="contains(@type,'article') and not(contains(@type,'article-'))"> article-journal article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage</xsl:when>
<xsl:otherwise>
<xsl:if test="contains(@type,'article-journal')"> article-journal</xsl:if>
<xsl:if test="contains(@type,'article-magazine')"> article-magazine</xsl:if>
<xsl:if test="contains(@type,'article-newspaper')"> article-newspaper</xsl:if>
<xsl:if test="contains(@type,'broadcast')"> broadcast</xsl:if>
<xsl:if test="contains(@type,'interview')"> interview</xsl:if>
<xsl:if test="contains(@type,'manuscript')"> manuscript</xsl:if>
<xsl:if test="contains(@type,'map')"> map</xsl:if>
<xsl:if test="contains(@type,'patent')"> patent</xsl:if>
<xsl:if test="contains(@type,'personal_communication')"> personal_communication</xsl:if>
<xsl:if test="contains(@type,'speech')"> speech</xsl:if>
<xsl:if test="contains(@type,'thesis')"> thesis</xsl:if>
<xsl:if test="contains(@type,'map')"> map</xsl:if>
<xsl:if test="contains(@type,'webpage')"> webpage</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chapter">
<xsl:choose>
<xsl:when test="contains(@type,'chapter')"> chapter paper-conference</xsl:when>
<xsl:otherwise>
<xsl:if test="contains(@type,'paper-conference')"> paper-conference</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- * The class attribute on cs:group has been removed in favor of the
display attribute.
* The " by " prefix on cs:group is removed if the element encloses a
cs:names element calling the container-author variable and including a
label. This is done to prevent duplication of "by" as a result of the
new verb-short container-author term in CSL 1.0 locale files. -->
<xsl:template match="cs:group">
<xsl:copy>
<xsl:choose>
<xsl:when test="@prefix=' by ' and cs:names/@variable='container-author' and cs:names/cs:label">
<xsl:copy-of select="@*[not(name()='class' or name()='prefix')]"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@*[not(name()='class')]"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- * The text-case attribute can no longer be used on cs:name. In cases
where text-case was used on cs:name, the attribute and its value are
transferred to the "family" and "given" cs:name-part children.
* The Zotero and Mendeley CSL 0.8.1 processors ignored name-as-sort-order
when sort-separator was not set. In CSL 1.0, name-as-sort-order always
takes effect, with a default value of ", " for sort-separator. To
correct for this change in behavior, the name-as-sort-order attribute
is dropped from cs:name when sort-separator was absent. -->
<xsl:template match="cs:name">
<xsl:copy>
<xsl:choose>
<xsl:when test="@name-as-sort-order and not(@sort-separator)">
<xsl:copy-of select="@*[not(name()='text-case' or name()='name-as-sort-order')]"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@*[not(name()='text-case')]"/>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="@text-case">
<xsl:element name="name-part">
<xsl:attribute name="name">family</xsl:attribute>
<xsl:attribute name="text-case">
<xsl:value-of select="@text-case"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="name-part">
<xsl:attribute name="name">given</xsl:attribute>
<xsl:attribute name="text-case">
<xsl:value-of select="@text-case"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:copy>
</xsl:template>
<!-- * In CSL 1.0, abbreviated terms are defined with periods, if applicable,
and the include-period attribute has replaced the strip-periods
attribute. For the conversion, strip-periods is set to "true" for any
cs:label element with form="short" or "verb-short", except when
include-period was set to "true".
* plural on cs:label now uses "always"/"never" instead of "true"/"false". -->
<xsl:template match="cs:label">
<xsl:copy>
<xsl:copy-of select="@*[not(name()='include-period')]"/>
<xsl:choose>
<xsl:when test="(@form='short' or @form='verb-short') and not(@include-period='true')">
<xsl:attribute name="strip-periods">true</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="@plural='false'">
<xsl:attribute name="plural">never</xsl:attribute>
</xsl:when>
<xsl:when test="@plural='true'">
<xsl:attribute name="plural">always</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:copy>
</xsl:template>
<!-- The "event" date variable has been renamed to "event-date" to eliminate
the name conflict with the 'standard' "event" variable. -->
<xsl:template match="cs:date">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:choose>
<xsl:when test="@variable='event'">
<xsl:attribute name="variable">event-date</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- In CSL 1.0, abbreviated terms are defined with periods, if applicable,
and the include-period attribute has replaced the strip-periods
attribute. For the conversion, strip-periods is set to "true" for any
"month" cs:date-part element with form="short", except when
include-period was set to "true". -->
<xsl:template match="cs:date-part">
<xsl:choose>
<xsl:when test="@name='year' or @name='month' or @name='day'">
<xsl:copy>
<xsl:copy-of select="@*[not(name()='include-period')]"/>
<xsl:choose>
<xsl:when
test="@form='short' and @name='month' and not(@include-period='true')">
<xsl:attribute name="strip-periods">true</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:copy>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- * In CSL 1.0, abbreviated terms are defined with periods, if applicable,
and the include-period attribute has replaced the strip-periods
attribute. For the conversion, strip-periods is set to "true" for any
cs:text element with form="short" or "verb-short", except when
include-period was set to "true".
* A special case is the "ibid" term. "ibid" is not defined as a
short-form term, but is an abbreviation, and should carry a period
("ibid."). This period, absent in CSL 0.8 locale files, will be
included in CSL 1.0 locale files. To prevent double periods, suffix="."
will be removed from any cs:text element calling the "ibid" term.
* The CSL 0.8 en-US locale file only included the "long" form of the
"no date" term, with a value of "n.d.". In the CSL 1.0 locale file, the
value has been changed to "no date", and a "short" form ("n.d.") has
been introduced. For the conversion, any cs:text element that called
the "long" form of the "no date" term will now call the "short" form,
unless the "long" form had been redefined in the style. -->
<xsl:template match="cs:text">
<xsl:choose>
<xsl:when test="@term='ibid' and @suffix='.'">
<xsl:copy>
<xsl:copy-of select="@*[not(name()='suffix')]"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:copy-of select="@*[not(name()='include-period')]"/>
<xsl:choose>
<xsl:when
test="(@form='short' or @form='verb-short') and not(@include-period='true' or @term='no date') and @term">
<xsl:attribute name="strip-periods">true</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="@term='no date' and not(/cs:style/cs:terms/cs:locale/cs:term/@name='no date')">
<xsl:attribute name="form">short</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>