Это чисто решение XSLT 1.0 :
Можно использовать модуль таблиц стилей datetime_lib.xsl
от Martin Rowlinson, который поставляется с XSelerator (отличная среда XSLT, недавно сделанная свободно доступной SourceForge). Вам нужно будет скачать и установить это приложение, тогда вы найдете множество дополнительных библиотек и примеры передовых методов и решений.
Файл datetime_lib.xsl
можно найти (для обычной установки) в:
C: \ Program Files \ Marrowsoft \ Xselerator25 \ Samples \ Libraries \
Из этой библиотеки вот шаблон с именем "номер недели":
<xsl:template name="week-number">
<xsl:param name="year"/>
<xsl:param name="month"/>
<xsl:param name="day"/>
<!-- or -->
<xsl:param name="date" select="''"/> <!-- format: yyyymmdd or yyyy-mm-dd -->
<!-- or -->
<xsl:param name="julian-day" select="''"/>
<!-- trim down date -->
<xsl:variable name="tdate" select="translate($date,'-','')"/>
<!-- decide which params were passed -->
<xsl:variable name="yyyy">
<xsl:choose>
<xsl:when test="string-length($date) > 0"><xsl:value-of select="substring($tdate,1,4)"/></xsl:when>
<xsl:when test="string-length($julian-day) > 0">
<xsl:variable name="jdate">
<xsl:call-template name="julian-day-to-date">
<xsl:with-param name="julian-day" select="$julian-day"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="substring($jdate,1,4)"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- get the julian day number -->
<xsl:variable name="jd">
<xsl:choose>
<xsl:when test="string-length($julian-day) > 0"><xsl:value-of select="$julian-day"/></xsl:when>
<xsl:otherwise>
<xsl:call-template name="date-to-julian-day">
<xsl:with-param name="year" select="$year"/>
<xsl:with-param name="month" select="$month"/>
<xsl:with-param name="day" select="$day"/>
<xsl:with-param name="date" select="$date"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- get the julian day number for the first working day of next year -->
<xsl:variable name="fyjd">
<xsl:call-template name="first-day-of-year">
<xsl:with-param name="year" select="$yyyy+1"/>
<xsl:with-param name="as-julian-day" select="true()"/>
</xsl:call-template>
</xsl:variable>
<!-- decide which the 'working' year for this date is -->
<xsl:variable name="start-jd">
<xsl:choose>
<xsl:when test="$jd >= $fyjd"><xsl:value-of select="$fyjd"/></xsl:when>
<xsl:otherwise>
<xsl:call-template name="date-to-julian-day">
<xsl:with-param name="date">
<xsl:call-template name="first-day-of-year">
<xsl:with-param name="year" select="$yyyy"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- final calc output -->
<xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/>
</xsl:template>
Вот простое преобразование XSLT с использованием шаблона "номер недели":
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:import href=
"C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:call-template name="week-number">
<xsl:with-param name="date" select="'2008-11-16'"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
При применении к любому исходному XML-документу (не используется), получается желаемый результат:
46
Надеюсь, что на этот раз ответ был действительно более полезным.
Приветствия
Димитр Новатчев.