Заменить частичные данные в элементе, используя xquery - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь заменить частичные данные элемента пустой строкой в ​​xquery. У меня есть информация о билете xml и по электронной почте, чтобы удалить xml со мной. Теперь мне нужно сформировать xquery, который изменил бы данные заявки xml, удалив идентификаторы электронной почты, которые есть в элементе EmailIdToDelete, доступном во втором xml, из элемента EmailId, доступного в первом xml и дайте мне ожидаемый результат . Используемая версия xquery не самая последняя. Я думаю, это очень старый. Нужно проверить это.

Может ли кто-нибудь помочь мне с этим?

Детали билета xml:

<TicketDetails>
<EmailInformation>
<EmailId>test1@aaa.com;test2@aaa.com;test3@aaa.com;test4@aaa.com;test5@aaa.com;test6@aaa.com;test7@aaa.com;test8@aaa.com</EmailId>
</EmailInformation>
</TicketDetails>

Email удалить xml:

<Details>
<EmailDetails>
<EmailIdToDelete>test2@aaa.com</EmailIdToDelete>
<EmailIdToDelete>test5@aaa.com</EmailIdToDelete>
<EmailIdToDelete>test8@aaa.com</EmailIdToDelete>
</EmailDetails>
</Details>

Ожидаемый результат:

<TicketDetails>
<EmailInformation>
<EmailId>test1@aaa.com;test3@aaa.com;test4@aaa.com;test6@aaa.com;test7@aaa.com;</EmailId>
</EmailInformation>
</TicketDetails>

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете tokenize на ;, а затем просто сравнить и выбрать значения без совпадения во втором документе:

<EmailId>{string-join(tokenize(TicketDetails/EmailInformation/EmailId, ';')[not(. = $remove/Details/EmailDetails/EmailIdToDelete)], ';')}</EmailId>

, где $remove - второй документ, например let $remove := doc('remove.xml') или внешний параметр:

declare variable $remove as document-node() external := document {
<Details>
<EmailDetails>
<EmailIdToDelete>test2@example.com</EmailIdToDelete>
<EmailIdToDelete>test5@example.com</EmailIdToDelete>
<EmailIdToDelete>test8@example.com</EmailIdToDelete>
</EmailDetails>
</Details>    
};


<TicketDetails>
<EmailInformation>
<EmailId>{string-join(tokenize(TicketDetails/EmailInformation/EmailId, ';')[not(. = $remove/Details/EmailDetails/EmailIdToDelete)], ';')}</EmailId>
</EmailInformation>
</TicketDetails>

https://xqueryfiddle.liberty-development.net/gWmuPs2

...