Having set you off down this road, I don't particularly want to abandon you,
but it's not clear to me where you are stuck. You seem to be asking how to
divide the code you need to write between two templates/functions, when both
options you present are perfectly viable.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: Bruce D'Arcus [mailto:bdarcus(_at_)myrealbox(_dot_)com]
Sent: 21 September 2004 04:09
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] date formatting function
I'm about to integrate the configuration code that Wendell helped me
out with last week, but I'd like to work out one detail
related to date
formatting before doing so.
My configuration file currently has code like this for
specifying date
formatting:
<date>
<year>
<prefix>(</prefix>
<suffix>)</suffix>
</year>
</date>
So here I would end up with (YYYY).
I'm still struggling with how to specify rendering for MM-DD
or MM, and
I think I'd like to make the decision based on the XSLT code
that would
actually render the dates. So, I'd like to go back to this
suggestion
from Mike Kay on how to handle dates that could either be YYYY,
YYYY-MM, or YYYY-MM-DD.
If you do want to use the gYearMonth data type, you can
write your own
function f:format-gYearMonth which converts the value to a date:
xs:date(concat($gYM, '-01'))
and then applies format-date() to it.
Basically, what I want to be able to do is to specify a config option
something like:
<date>
<month-day/>
</date>
This would apply, for example, to the issue date in a
periodical, where
a complete citation -- with both year at the beginning and
month later
are both drawn from the same mods:dateIssued content -- would look
like:
Doe, J. (2000) Some Title, Some Periodical, v2, n3,
January, pp. 23-34.
.... or:
Smith, S. (1999) Some Other Title, Different
Periodical, v2, n3, March
15, pp. 23-34.
So I want the function to do the proper thing whether the date is in
the form YYYY, YYYY-MM, or YYYY-MM-DD, where in the first
case, nothing
would be rendered, in the second I'd get only the month, and
the third
the month and day. I also want there to be a parameter that
specifies
either the full month or abbreviated.
The function would then get invoked, I assume, within the
template that
maps the config file to the source data something vaguely like:
<xsl:template match="cs:month-day">
<xsl:param name="source"/>
<xsl:apply-templates select="bib:format-month-day{mods:mods)">
<xsl:with-param name="prefix" select="cs:prefix"/>
<xsl:with-param name="suffix" select="cs:suffix"/>
</xsl:apply-templates>
</xsl:template>
The date in this case can be either of these:
mods:relatedItem/mods:originInfo/mods:dateIssued
mods:relatedItem/mods:part/mods:date
I understand conceptually I need to have a choose option in
which I am
testing if the string is castable as xs:gYearMonth or
xs:date, and that
if the former I need to concat the -01 to it but to ignore the day in
formatting, but I'm not really clear how I put it all together.
Here's where I'm at now:
<xsl:function name="bib:format-month-day" as="xs:integer">
<xsl:param name="mods" as="element(mods:mods)" />
<xsl:variable name="date" as="element(mods:dateIssued)"
select="$mods/mods:originInfo/mods:dateIssued" />
<!-- need above to work for mods:part/mods:date also -->
<xsl:choose>
<xsl:when test="$date castable as xs:date">
...
</xsl:when>
<xsl:when test="$date castable as xs:gYearMonth">
...
</xsl:when>
<xsl:when test="$date castable as xs:gYear">
...
</xsl:when>
</xsl:choose>
</xsl:function>
Or is this the wrong approach, and I need to do the testing and
formatting from within the cs:month-day template, with this function
only creating the proper date format?
Bruce
--+------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--