Xslt 将当前节点同级与前面的节点同级进行比较

Xslt 将当前节点同级与前面的节点同级进行比较,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图将周一的可用性开始时间度量和可用性结束时间度量与其余几天进行比较 如果星期一和星期二的开始时间和结束时间相等,我需要将天显示为“Mon-Tue” 如果所有工作日时间相同,则“周一至周五” 如果不匹配,我想显示DaysOfWeek和AvailabilityStartTimeMeasure和AvailabilityEndTimeMeasure XML: 销售额 星期一 510 1140 星期二 510 1140 星期三 510 1140 星期四 510 1140 星期五 510 1140

我试图将周一的
可用性开始时间度量
可用性结束时间度量
与其余几天进行比较

  • 如果星期一和星期二的开始时间和结束时间相等,我需要将天显示为“Mon-Tue”
  • 如果所有工作日时间相同,则“周一至周五”
  • 如果不匹配,我想显示
    DaysOfWeek
    AvailabilityStartTimeMeasure
    AvailabilityEndTimeMeasure
XML:


销售额
星期一
510
1140
星期二
510
1140
星期三
510
1140
星期四
510
1140
星期五
510
1140
星期六
600
1080
星期日
660
1080
XSLT:


现在这是印刷

星期五510 1140星期六600 1080


我只想在星期五和星期六展出。我需要如何修改前面的兄弟姐妹,以便只得到星期五和星期六。

您的方法的问题是,无论何时测试为真,您都会输出一个结果;您应该等到测试失败,然后用前一天的名称关闭字符串

也许有更好的方法可以做到这一点,但我不确定我是否理解其中的逻辑:你会每天重复这个测试吗?如果比赛是{周一、周三、周五、周日}和{周二、周四、周六}怎么办


附录

假设我们希望按可用时间对天数进行分组,而不管是否连续,下面的样式表使用Muenchian分组方法来实现这一点:

<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"/>

<xsl:key name="similarDays" 
         match="DaysOfWeek" 
         use="concat(AvailabilityStartTimeMeasure, '|', AvailabilityEndTimeMeasure)" />

<xsl:template match="/">
<table>
<xsl:for-each select="HoursOfOperation/DaysOfWeek[count(. | key('similarDays', concat(AvailabilityStartTimeMeasure, '|', AvailabilityEndTimeMeasure))[1]) = 1]">
    <tr>
        <td>
            <xsl:for-each select="key('similarDays', concat(AvailabilityStartTimeMeasure, '|', AvailabilityEndTimeMeasure))">
                <xsl:value-of select="DayOfWeekCode"/>
                <xsl:if test="position()!=last()">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
        </td>
        <td style="text-align:right;">
            <xsl:call-template name="minutes2time">
                <xsl:with-param name="minutes" select="AvailabilityStartTimeMeasure"/>
            </xsl:call-template>
            <xsl:text> - </xsl:text>
            <xsl:call-template name="minutes2time">
                <xsl:with-param name="minutes" select="AvailabilityEndTimeMeasure"/>
            </xsl:call-template>
        </td>
    </tr>
</xsl:for-each>
</table>
</xsl:template>

<xsl:template name="minutes2time">
    <xsl:param name="minutes"/>
    <xsl:param name="h" select="floor($minutes div 60)"/>
    <xsl:param name="m" select="$minutes mod 60"/>
    <xsl:param name="pad" select="substring('0', 1, $m &lt; 10)"/>
<xsl:value-of select="concat($h, ':', $pad, $m)"/>
</xsl:template>

</xsl:stylesheet>
以以下形式应用于修改后的输入:

<HoursOfOperation>
    <HoursTypeCode>Sales</HoursTypeCode>
    <DaysOfWeek>
        <DayOfWeekCode>Monday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Tuesday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Wednesday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Thursday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Friday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">600</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1200</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Saturday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Sunday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
</HoursOfOperation>

根据我对您问题的理解,如果
$StartTime
$EndTime
与循环中当前的
可用性starttimemeasure
可用性endtimemeasure
不匹配,您可能希望显示
DayofWeekCode
。下面的代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:variable name="StartTime" select="/HoursOfOperation/DaysOfWeek[1]/AvailabilityStartTimeMeasure[1]"/>
    <xsl:variable name="EndTime" select="/HoursOfOperation/DaysOfWeek[1]/AvailabilityEndTimeMeasure[1]"/>
    <xsl:template match="HoursOfOperation">
        <xsl:for-each select="DaysOfWeek">  
            <xsl:if test="position() &gt; 1">
                <xsl:choose>
                    <xsl:when test="($StartTime != AvailabilityStartTimeMeasure) and ($EndTime != AvailabilityEndTimeMeasure)">
                        <xsl:choose>
                            <xsl:when test="position()!=last()">
                                <xsl:value-of select="DayOfWeekCode"/><xsl:text> </xsl:text>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="DayOfWeekCode"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

因为它们与
$StartTime
$EndTime

不匹配,如果匹配的是{周一、周三、周五、周日}和{周二、周四、周六},我不知道怎么做。现在我正在尝试在otherwise循环中捕获前面的节点名,但我得到了所有节点值(节点名称、开始时间、结束时间)。很抱歉,我不理解您的评论。我的问题是(现在仍然是)这里的最终目标是什么?如果您注意到我的XML从周一到周五的可用性StartTimeMeasure和AvailabilityEndTimeMeasure是相同的,而周六、周日的计时是不同的,那么我想显示周一到周五的可用性StartTimeMeasure可用性EndTimeMeasure Sat可用性StartTimeMeasure可用性EndTimeMeasure Sun可用性开始测量AvailabilityEndTimeMeasure@user2962780我仍然不太清楚这里的模式是什么,什么仅仅是巧合。现在,我添加了一个通用方法,可以将任何具有匹配可用时间的日期分组;如果提前知道分组(例如,周一到周五总是相同的)如果你需要将连续的几天(例如周二、周三、周四)折叠成周二、周四,那么这就更简单了然后这需要更复杂-也许更复杂。我想打印的最终输出是周一至周五上午8:30-晚上7点周六上午10点-下午6点周日上午11点至下午6点。我可以进行时间转换,但唯一的问题是我无法对具有相同时间的日期进行分组。
<?xml version="1.0" encoding="utf-8"?>
<table>
  <tr>
    <td>Monday, Tuesday, Wednesday, Thursday, Friday</td>
    <td style="text-align:right;">8:30 - 19:00</td>
  </tr>
  <tr>
    <td>Saturday</td>
    <td style="text-align:right;">10:00 - 18:00</td>
  </tr>
  <tr>
    <td>Sunday</td>
    <td style="text-align:right;">11:00 - 18:00</td>
  </tr>
</table>
Monday, Tuesday, Wednesday, Thursday, Friday     8:30 - 19:00
Saturday                                        10:00 - 18:00
Sunday                                          11:00 - 18:00
<HoursOfOperation>
    <HoursTypeCode>Sales</HoursTypeCode>
    <DaysOfWeek>
        <DayOfWeekCode>Monday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Tuesday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Wednesday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Thursday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">510</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1140</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Friday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">600</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1200</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Saturday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
    <DaysOfWeek>
        <DayOfWeekCode>Sunday</DayOfWeekCode>
        <AvailabilityStartTimeMeasure unitCode="minute">660</AvailabilityStartTimeMeasure>
        <AvailabilityEndTimeMeasure unitCode="minute">1080</AvailabilityEndTimeMeasure>
    </DaysOfWeek>
</HoursOfOperation>
Monday, Tuesday, Thursday       8:30 - 19:00
Wednesday, Saturday, Sunday    11:00 - 18:00
Friday                         10:00 - 20:00
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:variable name="StartTime" select="/HoursOfOperation/DaysOfWeek[1]/AvailabilityStartTimeMeasure[1]"/>
    <xsl:variable name="EndTime" select="/HoursOfOperation/DaysOfWeek[1]/AvailabilityEndTimeMeasure[1]"/>
    <xsl:template match="HoursOfOperation">
        <xsl:for-each select="DaysOfWeek">  
            <xsl:if test="position() &gt; 1">
                <xsl:choose>
                    <xsl:when test="($StartTime != AvailabilityStartTimeMeasure) and ($EndTime != AvailabilityEndTimeMeasure)">
                        <xsl:choose>
                            <xsl:when test="position()!=last()">
                                <xsl:value-of select="DayOfWeekCode"/><xsl:text> </xsl:text>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="DayOfWeekCode"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
Saturday Sunday