Xpath 1.0 запрос на сортировку и извлечение минимального значения даты не работает - PullRequest
0 голосов
/ 30 апреля 2019

Мне пришлось извлечь самую старую дату между несколькими узлами и поместить ее в новый XML.

На основе другого потока (я не могу найти URL извините) Я сделал этот запрос:

substring-before(string(/*[local-name()='EmployeeUDM_Response']/*[local-name()='Return']/*[local-name()='Employee']/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='EmployementStartDate'][not(. >= following::*[local-name()='EmployementStartDate'])][not(. >= preceding::*[local-name()='EmployementStartDate'])][1]), 'T')

Ввод XML

<ns0:EmployeeUDM_Response xmlns:ns0="http://Schemas/v2/EmployeeUDM">
    <ns0:Header Type="Employee" Source="Biztalk ESB" Target="EmployeeUDMToRostarCas" Date="2019-04-29T15:24:24" />
    <ns0:Return>
        <ns0:Employee>
            <ns0:ID>f416d1cd-d13f-433c-9297-7fa724b10872</ns0:ID>
            <ns0:Number>200002</ns0:Number>
            <ns0:SagaNumber></ns0:SagaNumber>
            <ns0:SocialSecurityNumber>663993258</ns0:SocialSecurityNumber>
            <ns0:SurNameFull>Streep</ns0:SurNameFull>
            <ns0:FirstName>Meryl</ns0:FirstName>
            <ns0:Gender>Vrouw</ns0:Gender>
            <ns0:DateOfBirth>1988-02-25T00:00:00.0000000+01:00</ns0:DateOfBirth>
            <ns0:Contracts>
                <ns0:Contract>
                    <ns0:ID>9cfae674-da54-418c-9d7f-2f1dfcdc64d3</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2018-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2018-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>a584c7d8-a5a1-45a7-9cb9-4dabe9ece851</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2019-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2019-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>9a1cfe04-6d4a-4a97-9104-b2633dbb6362</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2017-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2017-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>b7f868fe-2b93-45a4-9683-d814e3b6eb4e</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2016-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2016-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>4352ead7-8888-4c94-9228-dc0245ae9388</ns0:ID>
                    <ns0:StartDate>2019-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2020-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2019-01-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate></ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>8bf2208c-9f5d-4729-83d9-f10789913a61</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2015-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2015-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
                <ns0:Contract>
                    <ns0:ID>c2d3b8e6-ccd5-4a18-b28a-f853e2bc8f0e</ns0:ID>
                    <ns0:StartDate>2018-01-01T00:00:00.0000000+01:00</ns0:StartDate>
                    <ns0:EndDate>2019-01-01T00:00:00.0000000+01:00</ns0:EndDate>
                    <ns0:EmployementStartDate>2014-02-01T00:00:00.0000000+01:00</ns0:EmployementStartDate>
                    <ns0:EmployementEndDate>2014-03-01T00:00:00.0000000+01:00</ns0:EmployementEndDate>
                </ns0:Contract>
            </ns0:Contracts>
        </ns0:Employee>
    </ns0:Return>
</ns0:EmployeeUDM_Response>

Вывод XML должен быть:

<ns0:Employee date="2019-04-30"http://SchemasMDSRequest_Schema">
    <Number>200002</Number>
    <SurNameFull>Streep</SurNameFull>
    <FirstName>Meryl</FirstName>
    <GivenName>Meryl</GivenName>
    <EmployementStartDate>2014-02-01</EmployementStartDate>
    <EmployementEndDate>2099-01-01</EmployementEndDate>
</ns0:Employee>

Но фактический вывод XML:

<ns0:Employee date="2019-04-30"http://SchemasMDSRequest_Schema">
    <Number>200002</Number>
    <SurNameFull>Streep</SurNameFull>
    <FirstName>Meryl</FirstName>
    <GivenName>Meryl</GivenName>
    <EmployementStartDate>2018-02-01</EmployementStartDate>
    <EmployementEndDate>2099-01-01</EmployementEndDate>
</ns0:Employee>

Мне пришлось использоватьXPath 1.0 в качестве BizTalk Server 2013 не поддерживает XPath 2.0.Я не знаю, что не так с запросом, я довольно новичок в XPath.

1 Ответ

0 голосов
/ 30 апреля 2019

Операторы < и > в XPath 1.0 определены только для чисел, а не для строк (или дат / времени).Если вы используете их в строках, система попытается преобразовать строки в числа, что обычно приводит к NaN < NaN сравнению, которое всегда ложно.

Для сравнения дат популярный обходной путь XPath 1.0 заключается в удалениипунктуация, а затем сравнить, скажем, 20190430 и 20190101 как числа.

...