如何从子节点获取最新日期和第一个日期并在XSLT的父节点中使用?



我有一个XML。我想更新标签<ffDate><rf>下的值,即parentnode。更新值的逻辑是-

  1. 查找子节点,即所有<rec>值。对于<rec>下的每个<ref>,其中有一个<ref>具有"PS"值,选择<subDate>的最新日期并更新<ffDate>下的特定父<rf>
  2. 对于所有没有'PS'值的<rec>,选择最早提交的<subDate>并在特定父<rf>下更新<ffDate>
<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>
使用上面的逻辑,我的XML输出应该看起来像-
<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>

我已经尝试了下面的XSLT,但是它不让我选择一个值,也不过滤'PS'值。

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

我得到的第一个例子的输出如下所示,当我试图打印值-

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

而我应该得到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>

任何帮助都是非常感激的。

要获取最新日期,请尝试如下操作:

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

结果是2020-12-16对于第一个例子…

获取非ps值,试试...ref[not(contains(text(),'PS')

或者更简单…感谢michael.hor257k

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

最新更新