XSLT 帮助根据日期过滤子元素?
XSLT Help to filter child element based on dates?
我正在处理基于日期字段过滤每个父元素的子元素的要求。对于每个 Report_Entry 元素,我需要 return ALL FEIN_CHANGE 一个人在 2019 年活跃于任何公司的节点。我添加了示例 XML 和所需的输出帮助理解需求。非常感谢任何帮助或伪代码。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/CR-TAX_REPORTING_UNIT">
<wd:Report_Entry>
<wd:PERSON_NUMBER>2128984</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2002-06-03-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>Columbia</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2011-10-28-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>CBS Records</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:PERSON_NUMBER>2169797</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2008-05-05-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>RCA</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:PERSON_NUMBER>2181815</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2014-10-10-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>ACTIVISION</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2016-10-10-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>BLIZZARD</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2019-04-01-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>Virgin ecords</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
</wd:Report_Data>
预期输出:
2128984|2011-10-28|CBS Records
2169797|2008-05-05|RCA
2181815|2016-10-10|BLIZZARD
2181815|2019-04-01|Virgin Records
如果我对你的解释理解正确,每个 FEIN_CHANGE
都有效,直到它被后续的终止。并且您想显示 2019 年 1 月 1 日之前未终止的所有 FEIN_CHANGE
。
如果是这样,你可以这样做:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="urn:com.workday.report/CR-TAX_REPORTING_UNIT">
<xsl:output method="text"/>
<xsl:template match="/Report_Data">
<xsl:for-each select="Report_Entry/FEIN_CHANGE[not(following-sibling::FEIN_CHANGE[xs:date(EFFECTIVE_DATE) lt xs:date('2019-01-01')])]">
<xsl:value-of select="../PERSON_NUMBER, xs:date(EFFECTIVE_DATE), COMPANY" separator="|"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我正在处理基于日期字段过滤每个父元素的子元素的要求。对于每个 Report_Entry 元素,我需要 return ALL FEIN_CHANGE 一个人在 2019 年活跃于任何公司的节点。我添加了示例 XML 和所需的输出帮助理解需求。非常感谢任何帮助或伪代码。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/CR-TAX_REPORTING_UNIT">
<wd:Report_Entry>
<wd:PERSON_NUMBER>2128984</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2002-06-03-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>Columbia</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2011-10-28-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>CBS Records</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:PERSON_NUMBER>2169797</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2008-05-05-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>RCA</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:PERSON_NUMBER>2181815</wd:PERSON_NUMBER>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2014-10-10-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>ACTIVISION</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2016-10-10-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>BLIZZARD</wd:COMPANY>
</wd:FEIN_CHANGE>
<wd:FEIN_CHANGE>
<wd:EFFECTIVE_DATE>2019-04-01-07:00</wd:EFFECTIVE_DATE>
<wd:COMPANY>Virgin ecords</wd:COMPANY>
</wd:FEIN_CHANGE>
</wd:Report_Entry>
</wd:Report_Data>
预期输出:
2128984|2011-10-28|CBS Records
2169797|2008-05-05|RCA
2181815|2016-10-10|BLIZZARD
2181815|2019-04-01|Virgin Records
如果我对你的解释理解正确,每个 FEIN_CHANGE
都有效,直到它被后续的终止。并且您想显示 2019 年 1 月 1 日之前未终止的所有 FEIN_CHANGE
。
如果是这样,你可以这样做:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="urn:com.workday.report/CR-TAX_REPORTING_UNIT">
<xsl:output method="text"/>
<xsl:template match="/Report_Data">
<xsl:for-each select="Report_Entry/FEIN_CHANGE[not(following-sibling::FEIN_CHANGE[xs:date(EFFECTIVE_DATE) lt xs:date('2019-01-01')])]">
<xsl:value-of select="../PERSON_NUMBER, xs:date(EFFECTIVE_DATE), COMPANY" separator="|"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>