XSLT Помогите отфильтровать дочерний элемент по датам? - PullRequest
0 голосов
/ 01 ноября 2019

Я работаю над требованием фильтровать дочерние элементы для каждого родительского элемента на основе поля даты. Для каждого элемента Report_Entry мне нужно вернуть ВСЕ узлы 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

1 Ответ

0 голосов
/ 01 ноября 2019

Если я правильно понимаю ваше объяснение, каждое FEIN_CHANGE действует до тех пор, пока оно не будет прекращено последующим. И вы хотите показать все FEIN_CHANGE, которые не были прерваны до 1 января 2019 года.

Если это так, вы можете сделать:

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>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Демонстрация: https://xsltfiddle.liberty -development.net / ejivdH9

...