Тестирование XML данных для того, чтобы быть в середине недели или на выходных с XSLT-1? - PullRequest
0 голосов
/ 08 февраля 2020

Возьмите следующий 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 программно определить, является ли дата серединой недели или выходного дня (независимо от места расположения данных)?

При необходимости я должен изменить логику c мое приложение, которое создает XML для включения нового логического атрибута, указывающего, является ли это серединой недели или выходными. Но я хотел знать, легко ли было писать с условием XSL if.

1 Ответ

2 голосов
/ 08 февраля 2020

Попробуйте что-то вроде:

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 &lt; 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 &lt; 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>
...