0

I have a XML that shows days and times windows an order can be serviced. If the timewindow[index=0]/Allowed/From and To is the same for different days than it needs to be displayed only once.

for example Friday = from T08H00M0.000000S to T17H00M0.000000S Monday=T08H00M0.000000S to T17H00M0.000000S Tuesday=T08H00M0.000000S to T17H00M0.000000S Wednesday=T08H00M0.000000S to T17H00M0.000000S

Than the output needs to be <FWActivityWindow EarliestTime="00:00" LatestTime="00:00" day='F,M,T,W'/>

This is the portion of the xml that I need to transform

`<WeekAgenda>
<Friday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P04DT00H00M0.000000S</From>
                <To>P04DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Friday>
<Monday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P00DT08H00M0.000000S</From>
                <To>P00DT16H30M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P00DT08H00M0.000000S</From>
                <To>P00DT16H30M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P00DT00H00M0.000000S</From>
                <To>P00DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Monday>
<Saturday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P05DT00H00M0.000000S</From>
                <To>P05DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Saturday>
<Sunday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P06DT00H00M0.000000S</From>
                <To>P06DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Sunday>
<Thursday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P03DT08H00M0.000000S</From>
                <To>P03DT16H30M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P03DT08H00M0.000000S</From>
                <To>P03DT16H30M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P03DT00H00M0.000000S</From>
                <To>P03DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Thursday>
<Tuesday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P01DT08H00M0.000000S</From>
                <To>P01DT16H30M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P01DT08H00M0.000000S</From>
                <To>P01DT16H30M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P01DT00H00M0.000000S</From>
                <To>P01DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P01DT00H00M0.000000S</From>
                <To>P01DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Tuesday>
<Wednesday>
    <TimeWindowArray>
        <TimeWindow index="0">
            <Allowed>
                <From>P02DT08H00M0.000000S</From>
                <To>P02DT16H30M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT08H00M0.000000S</From>
                <To>P02DT16H30M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="1">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="2">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="3">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
        <TimeWindow index="4">
            <Allowed>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Allowed>
            <Preferred>
                <From>P02DT00H00M0.000000S</From>
                <To>P02DT00H00M0.000000S</To>
            </Preferred>
        </TimeWindow>
    </TimeWindowArray>
</Wednesday>
</WeekAgenda>
`
<xsl:for-each select="WeekAgenda/child::node()[not((substring(substring-    after(TimeWindowArray/TimeWindow[@index=0]/Allowed/From,'T'),1,2)= substring(substring-after(preceding-sibling::*/TimeWindowArray/TimeWindow[@index=0]/Allowed/From,'T'),1,2)))]">
                <xsl:element name="FWActivityWindow" >
                    <xsl:attribute name="EarliestTime">
                        <xsl:value-of select="translate(substring(substring-after(TimeWindowArray/TimeWindow[@index=0]/Allowed/From,'T'),1,5),'HM','::')"/>
                    </xsl:attribute>
                    <xsl:attribute name="LatestTime">
                        <xsl:value-of select="translate(substring(substring-after(TimeWindowArray/TimeWindow[@index=0]/Allowed/To,'T'),1,5),'HM','::')"/>
                    </xsl:attribute>
    
                </xsl:element>
            </xsl:for-each>

This is the output im getting

<FWActivityWindow EarliestTime="00:00" LatestTime="00:00"/>
<FWActivityWindow EarliestTime="08:00" LatestTime="16:30"/>
<FWActivityWindow EarliestTime="08:00" LatestTime="16:30"/>
<FWActivityWindow EarliestTime="08:00" LatestTime="16:30"/>
<FWActivityWindow EarliestTime="08:00" LatestTime="16:30"/> 

Not sure why it is displaying  all the days..it should check all the preceding-siblings of the context nodes and display only the two below
    `<FWActivityWindow EarliestTime="00:00" LatestTime="00:00"  />`
   ` <FWActivityWindow EarliestTime="08:00" LatestTime="16:30"  />`

What am I doing wrong and any ideas on how to show the days="F,M,T,W" in the output?

djsonic
  • 1
  • 1
  • You have correctly identified the problem as *grouping*. The preferred grouping method in XSLT depends on which version of XSLT your processor supports - see: https://stackoverflow.com/tags/xslt-grouping/info. – michael.hor257k Dec 28 '22 at 05:20

1 Answers1

0

Here is a minimal example of how you can apply Muenchian grouping to your situation:

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

<xsl:key name="k1" match="TimeWindow[@index='0']/Allowed" use="concat(substring-after(From, 'T'), '|', substring-after(To, 'T'))" />

<xsl:template match="/WeekAgenda">
    <output>
        <!-- for each distinct time slot -->
        <xsl:for-each select="*/TimeWindowArray/TimeWindow[@index='0']/Allowed[count(. | key('k1', concat(substring-after(From, 'T'), '|', substring-after(To, 'T')))[1]) = 1]">
            <FWActivityWindow EarliestTime="{substring(From, 6, 5)}" LatestTime="{substring(To, 6, 5)}">
                <!-- list the days with this time slot -->
                <xsl:for-each select="key('k1', concat(substring-after(From, 'T'), '|', substring-after(To, 'T')))">
                    <xsl:value-of select="name(../../..)"/>
                    <xsl:if test="position()!=last()">, </xsl:if>
                </xsl:for-each>
            </FWActivityWindow>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

Result

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <FWActivityWindow EarliestTime="00H00" LatestTime="00H00">Friday, Saturday, Sunday</FWActivityWindow>
  <FWActivityWindow EarliestTime="08H00" LatestTime="16H30">Monday, Thursday, Tuesday, Wednesday</FWActivityWindow>
</output>
michael.hor257k
  • 113,275
  • 6
  • 33
  • 51
  • Hi Michael that's awesome.. it did the job ! if I wanted to display bits instead of strings for days that do have a time slot is there a way to do that? like Monday is a 1 Tuesday as 2 Wednesday as 3 so instead of displaying Monday, Thursday, Tuesday, Wednesday it shows 1423 – djsonic Dec 28 '22 at 14:16
  • To map a string to a number you can use `xsl:choose`. Or do something like: https://stackoverflow.com/a/32904143/3016153 – michael.hor257k Dec 28 '22 at 15:44
  • Michael had a quick question what if I had an xml with multiple WeekAgendas something like this.. | the for-each select statement above, it'll still be the same? – djsonic Jan 05 '23 at 02:11
  • This is not a good place for such discussion. I suggest you post a new question and explain in detail. – michael.hor257k Jan 05 '23 at 05:37