user13583928
user13583928

Reputation: 19

How to get Latest and First dates from child nodes and use in Parent Node in XSLT?

I have an XML. I want to update the value of tag <ffDate> under <rf> i.e parentnode. The logic to update the value is -

  1. Look for childnodes i.e. all the <rec> values. For each <ref> under <rec>, where there is a <ref> that has 'PS' value in it , pick the latestdate of <subDate> and update <ffDate> under that particular parent <rf>
  2. Again for all <rec> that do not have 'PS' values in it, pick the earliest filed <subDate> and update <ffDate> under that particular parent <rf>
<rfs>
  <rf id="3652">
        <adddata>
            <entry>
                <key>1</key>
                <value>1</value>
            </entry>
            <entry>
                <key>0_1</key>
                <value>2</value>
            </entry>
            <entry>
                <key>cs</key>
                <value>Open</value>
            </entry>
            <entry>
                <key>cc</key>
                <value>G</value>
            </entry>
            <entry>
                <key>at</key>
                <value>B</value>
            </entry>
            <entry>
                <key>o</key>
                <value>G</value>
            </entry>
        </adddata>
        <ref>F-320</ref>
        <ffDate>2018-05-30</ffDate>
          <recs>
            <rec id="3784">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Aband</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[3]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-09-28</subDate>
           </rec>
            <rec id="3847">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Expi</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>GV</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[5]</ref>
                <ffDate>2018-05-30</ffDate>
                <subDate>2020-12-16</subDate>
            </rec>
            <rec id="3671">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Abd</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-05-30</subDate>
            </rec>
            <rec id="5579">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Publ</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>F-320-PC</ref>
                <ffDate>2018-05-30</ffDate>
                <subDate>2021-12-13</subDate>
            </rec>
            <rec id="3735">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Abd</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[2]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-08-09</subDate>
             </rec>
            <rec id="8314">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Ab</value>
                    </entry>
                    <entry>
                        <key>Cr</key>
                        <value>F.</value>
                    </entry>
                    <entry>
                        <key>At</key>
                        <value>BA </value>
                    </entry>
                    <entry>
                        <key>O</key>
                        <value>Fi</value>
                    </entry>
                    <entry>
                        <key>Ap</key>
                        <value>Fc.</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[4]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2019-04-25</subDate>
            </rec>
        </recs>
     </rf>
   <rf id="4301">
        <adddata>
            <entry>
                <key>0_1</key>
                <value>1</value>
            </entry>
            <entry>
                <key>0_1</key>
                <value>2</value>
            </entry>
            <entry>
                <key>cs</key>
                <value>Open</value>
            </entry>
            <entry>
                <key>i</key>
                <value>Ga</value>
            </entry>
            <entry>
                <key>d</key>
                <value>Ga</value>
            </entry>
            <entry>
                <key>b</key>
                <value>G</value>
            </entry>
            <entry>
                <key>cc</key>
                <value>G</value>
            </entry>
            <entry>
                <key>at</key>
                <value>B</value>
            </entry>
            <entry>
                <key>o</key>
                <value>G</value>
            </entry>
        </adddata>
         <ref>G-18</ref>
        <ffDate>2011-12-22</ffDate>
        <recs>
            <rec id="3946">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>Be</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>Ga</value>
                    </entry>
                </adddata>
                <ref>G-18--EP</ref>
                  <ffDate>2011-12-22</ffDate>
                <subDate>2012-12-20</subDate>
              </rec>
            <rec id="4102">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>GV</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>Be</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>Ga</value>
                    </entry>
                </adddata>
                <ref>G-18-ET</ref>
                <ffDate>2011-12-22</ffDate>
                <subDate>2011-12-20</subDate>
            </rec>
            <rec id="3890">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>G-18-EE</ref>
                <ffDate>2011-12-22</ffDate>
                <subDate>2010-12-20</subDate>
            </rec>
         </recs>
    </rf>
</rfs>

With the above logic, my XML output should look like -

<rfs>
  <rf id="3652">
        <adddata>
            <entry>
                <key>1</key>
                <value>1</value>
            </entry>
            <entry>
                <key>0_1</key>
                <value>2</value>
            </entry>
            <entry>
                <key>cs</key>
                <value>Open</value>
            </entry>
            <entry>
                <key>cc</key>
                <value>G</value>
            </entry>
            <entry>
                <key>at</key>
                <value>B</value>
            </entry>
            <entry>
                <key>o</key>
                <value>G</value>
            </entry>
        </adddata>
        <ref>F-320</ref>
        <ffDate>2020-12-16</ffDate>
          <recs>
            <rec id="3784">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Aband</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[3]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-09-28</subDate>
           </rec>
            <rec id="3847">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Expi</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>GV</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[5]</ref>
                <ffDate>2018-05-30</ffDate>
                <subDate>2020-12-16</subDate>
            </rec>
            <rec id="3671">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Abd</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-05-30</subDate>
            </rec>
            <rec id="5579">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Publ</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>F-320-PC</ref>
                <ffDate>2018-05-30</ffDate>
                <subDate>2021-12-13</subDate>
            </rec>
            <rec id="3735">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Abd</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>F</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[2]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2018-08-09</subDate>
             </rec>
            <rec id="8314">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Ab</value>
                    </entry>
                    <entry>
                        <key>Cr</key>
                        <value>F.</value>
                    </entry>
                    <entry>
                        <key>At</key>
                        <value>BA </value>
                    </entry>
                    <entry>
                        <key>O</key>
                        <value>Fi</value>
                    </entry>
                    <entry>
                        <key>Ap</key>
                        <value>Fc.</value>
                    </entry>
                </adddata>
                <ref>F-320-PS[4]</ref>
                 <ffDate>2018-05-30</ffDate>
                <subDate>2019-04-25</subDate>
            </rec>
        </recs>
     </rf>
   <rf id="4301">
        <adddata>
            <entry>
                <key>0_1</key>
                <value>1</value>
            </entry>
            <entry>
                <key>0_1</key>
                <value>2</value>
            </entry>
            <entry>
                <key>cs</key>
                <value>Open</value>
            </entry>
            <entry>
                <key>i</key>
                <value>Ga</value>
            </entry>
            <entry>
                <key>d</key>
                <value>Ga</value>
            </entry>
            <entry>
                <key>b</key>
                <value>G</value>
            </entry>
            <entry>
                <key>cc</key>
                <value>G</value>
            </entry>
            <entry>
                <key>at</key>
                <value>B</value>
            </entry>
            <entry>
                <key>o</key>
                <value>G</value>
            </entry>
        </adddata>
         <ref>G-18</ref>
        <ffDate>2010-12-20</ffDate>
        <recs>
            <rec id="3946">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>Be</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>Ga</value>
                    </entry>
                </adddata>
                <ref>G-18--EP</ref>
                  <ffDate>2011-12-22</ffDate>
                <subDate>2012-12-20</subDate>
              </rec>
            <rec id="4102">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>GV</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>Be</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>Ga</value>
                    </entry>
                </adddata>
                <ref>G-18-ET</ref>
                <ffDate>2011-12-22</ffDate>
                <subDate>2011-12-20</subDate>
            </rec>
            <rec id="3890">
                <adddata>
                    <entry>
                        <key>cs</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>i</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>d</key>
                        <value>Ga</value>
                    </entry>
                    <entry>
                        <key>b</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>cc</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>at</key>
                        <value>B</value>
                    </entry>
                    <entry>
                        <key>o</key>
                        <value>G</value>
                    </entry>
                </adddata>
                <ref>G-18-EE</ref>
                <ffDate>2011-12-22</ffDate>
                <subDate>2010-12-20</subDate>
            </rec>
         </recs>
    </rf>
</rfs>

I have tried the following XSLT, but it's not letting me pick one value and also not filtering the 'PS' values.

<xsl:choose>
 <xsl:when test="contains($ref,'PS') and $firstfilingdate_rec!=''">
    <xsl:variable name="sorted_dates">
    <xsl:perform-sort select="./recs/rec/subDate[last()]">
    <xsl:sort select="."/>
    </xsl:perform-sort>
    </xsl:variable>
        
    <ffDate>
    <xsl:value-of select="$sorted_dates"/>
    </ffDate>
</xsl:when>
</xsl:choose>

I am getting the output for first example as below when I tried to print the values -

<REFERENCE_IN>FIB-320-US-PSP[3] FIB-320-US-PSP[5] FIB-320-US-PSP FIB-320-WO-PCT FIB-320-US-PSP[2] FIB-320-US-PSP[4]</REFERENCE_IN>
        <SORTED_DATE>2018-05-302018-08-092018-09-282019-04-252020-12-162021-12-13</SORTED_DATE>

whereas I should be getting as -

<REFERENCE_IN>FIB-320-US-PSP[3] FIB-320-US-PSP[5] FIB-320-US-PSP FIB-320-US-PSP[2] FIB-320-US-PSP[4]</REFERENCE_IN>
        <SORTED_DATE>2020-12-16</SORTED_DATE>

Any help would be really appreciable.

Upvotes: 1

Views: 41

Answers (1)

Marc Stroebel
Marc Stroebel

Reputation: 2357

to get the latest date, try e.g.

<xsl:variable name="latest">
  <xsl:for-each select="./recs/rec[ref[contains(text(),'PS')]]/subDate">
    <xsl:sort select="." order="descending"/>
      <xsl:if test="position()=1">
        <xsl:value-of select="."/>
      </xsl:if>
   </xsl:for-each>
</xsl:variable>

result is 2020-12-16 for the first example...

to get the non-PS values, try ...ref[not(contains(text(),'PS')

or even simpler... thanks to michael.hor257k

<xsl:variable name="latest" select="max(./recs/rec[ref[contains(text(),'PS')]]/subDate/xs:date(.))">

Upvotes: 1

Related Questions