取以下 XML 示例:
<Meeting BookmarkId="0" PageBreak="0" NumberClasses="1" SpecialEvent="1">
<Date ThisWeek="W20200406" NextWeek="W20200413">April 6-12</Date>
<SpecialEvent>
<Event>Memorial</Event>
<Location>Address goes here</Location>
<Date Day="7" DayShort="Tue" DayFull="Tuesday" Month="4" MonthShort="Apr" MonthFull="April" Year="2020">07/04/2020</Date>
</SpecialEvent>
</Meeting>
请记住,此 XML 内容是为大约 50 种语言自动创建的,因此一周中几天使用的区域设置明显不同。
是否可以使用 XSLT-1 以编程方式确定日期是周中还是周末(无论数据的区域设置如何(?
如果需要,我将更改创建 XML 的应用程序的逻辑,以包含一个新的布尔属性,说明它是周中还是周末。但我想知道使用 XSLif
条件是否容易发短信。
尝试类似操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SpecialEvent/Date">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:variable name="day-of-week">
<xsl:call-template name="day-of-week">
<xsl:with-param name="year" select="@Year"/>
<xsl:with-param name="month" select="@Month"/>
<xsl:with-param name="day" select="@Day"/>
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="Weekend">
<xsl:value-of select="$day-of-week < 2"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template name="day-of-week">
<!-- http://en.wikipedia.org/wiki/Zeller%27s_congruence -->
<xsl:param name="year" />
<xsl:param name="month"/>
<xsl:param name="day"/>
<!-- m is the month (3 = March, 4 = April, 5 = May, ..., 14 = February) -->
<xsl:variable name="a" select="$month < 3"/>
<xsl:variable name="m" select="$month + 12*$a"/>
<xsl:variable name="y" select="$year - $a"/>
<xsl:variable name="K" select="$y mod 100"/>
<xsl:variable name="J" select="floor($y div 100)"/>
<!-- h is the day of the week (0 = Saturday, 1 = Sunday, 2 = Monday, ..., 6 = Friday) -->
<xsl:variable name="h" select="($day + floor(13*($m + 1) div 5) + $K + floor($K div 4) + floor($J div 4) - 2*$J) mod 7"/>
<xsl:value-of select="$h"/>
</xsl:template>
</xsl:stylesheet>
新增:
我如何调整它以将星期一视为一周的第一天,将星期日视为第七天
您可以在输出之前简单地移动结果。而不是:
<xsl:value-of select="$h"/>
使模板输出:
<xsl:value-of select="($h + 5) mod 7 + 1"/>