Reputation: 19
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 -
<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>
<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
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