Накопление элементов даты по иерархиям на карте BizTalk

(Пожалуйста, проверьте мое всплывающее примечание внизу этого вопроса, прежде чем отмечать меня. Спасибо!)

У меня есть проблема в BizTalk, когда я могу достичь желаемого отображения только за несколько шагов и хотел бы получить результат, используя одну карту.

Пример моего входного XML выглядит следующим образом:

<Books>
    <Book><Title>The BFG</Title><ISBN>0-224-02040-4</ISBN></Book>
    <Book><Title>The Hobbit</Title><ISBN>978-0261102217</ISBN></Book>
    <Book><Title>BizTalk Server 2010 Unleashed</Title><ISBN>978-0-672-33118-7</ISBN></Book> 
</Books>
<Revisions>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>1</Version><Published>1970-08-22T00:00:00</Published></Revision>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>2</Version><Published>1975-09-25T00:00:00</Published></Revision>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>3</Version><Published>1990-09-16T00:00:00</Published></Revision>
    <Revision><ISBN>978-0-672-33118-7</ISBN><Version>1</Version><Published>2010-03-28T00:00:00</Published></Revision>
    <Revision><ISBN>978-0261102217</ISBN><Version>1</Version><Published>1960-09-25T00:00:00</Published></Revision>
    <Revision><ISBN>978-0-672-33118-7</ISBN><Version>2</Version><Published>2011-09-16T00:00:00</Published></Revision>
<Revisions>

Мой желаемый выходной XML для этого примера: -

<HistoricBooks>
    <FirstIssue><ISBN>0-224-02040-4</ISBN><Title>The BFG</Title><FirstPublished>1970-08-22T00:00:00</FirstPublished><FirstIssue>
    <FirstIssue><ISBN>978-0261102217</ISBN><Title>The Hobbit</Title><FirstPublished>1960-09-25T00:00:00</FirstPublished><FirstIssue>
    <FirstIssue><ISBN>978-0-672-33118-7</ISBN><Title>BizTalk Server 2010 Unleashed</Title><FirstPublished>2010-03-28T00:00:00</FirstPublished><FirstIssue>
</HistoricBooks>

Первая проблема, с которой я столкнулся, заключается в том, что функтоиды BizTalk Minimum и CumulativeMinimum требуют ввода числовых значений и не работают с датами. Поэтому первая часть моего вопроса...

Как лучше всего выполнить минимальные и максимальные функции для элементов даты на карте BizTalk?

Вторая проблема, с которой я столкнулся, связана с тем, как кумулятивные функтоиды понимают масштаб. Параметр области действия указывает глубину накопления (весь документ, родитель, дедушка и бабушка и т. д.), но в этом случае нецелесообразно просто брать минимум по всем дочерним элементам <revisions>. Мне нужно быть более избирательным. Поэтому вторая часть моего вопроса...

Какой функтоид следует использовать для выборочного накопления дат в моих иерархиях XML и как этого добиться?

Я знаю, что это двойной вопрос. Я также знаю, что есть несколько способов получить ответы, но многие из них приведут к сложному, неопрятному и плохо работающему коду. Я хочу избежать этого. Я также знаю, что этого можно легко добиться, изменив исходную или конечную схемы или не используя BizTalk. Эти маршруты для меня не открыты. Поэтому этот вопрос требует примеров, показывающих простое и элегантное решение проблемы с помощью BizTalk. Если вы не желаете давать ответ, пожалуйста, не наказывайте человека, который желает улучшить свои знания и навыки.


person Quorfee    schedule 05.09.2016    source источник
comment
Во-первых, это совершенно законный вопрос BizTalk. Во-вторых, я думаю, что вы слишком, слишком много думаете о некоторых вещах. Пожалуйста, подтвердите одну вещь, все, что вы хотите сделать, это объединить данные Title и FirstPublished, используя ISBN в качестве ключа?   -  person Johns-305    schedule 06.09.2016
comment
Привет, Джонс, да, это точно. И очень вероятно, что я слишком много думаю или упускаю что-то действительно очевидное, поскольку моя интуиция подсказывает мне, что это должно быть хлебом с маслом для карты BizTalk.   -  person Quorfee    schedule 06.09.2016


Ответы (2)


В вашем общем решении нет ничего плохого. Есть одна вещь, которую я бы сделал по-другому.

Да, используйте Script Functoid для преобразования даты, но вместо разницы просто возьмите свойство .Ticks DateTime в качестве входных данных для совокупного минимума. Это возвращается как Long. Тогда вы не зависите ни от какой даты, а вывод является детерминированным.

Важно! Нет абсолютно ничего плохого в использовании решения с двумя картами. Это вполне приемлемый шаблон в BizTalk Dev.

Вероятно, вы могли бы сделать это в одной карте, но для этого потребуются встроенные шаблоны Xslt. В этом тоже нет ничего плохого. Но решение Two Map позволяет использовать только встроенные Functoids.

Не беспокойтесь о «производительности», если вы не можете доказать, что вам это нужно. Разница в производительности между одной или двумя картами будет едва заметна.

person Johns-305    schedule 06.09.2016

Для справки: я работал над обеими частями моего вопроса, но общее решение не идеально, и я бы пока не рекомендовал это как хороший ответ.

Совокупный минимум элементов даты

Вы можете добавить скриптовый функтоид, который использует встроенный C# для возврата интервала между элементом даты и фиксированной датой. Представьте этот интервал в днях, и у вас будет числовое значение, которое можно передать в ваш кумулятивный минимальный функтоид. Затем просто используйте другой скриптовый функтоид, чтобы добавить минимальный интервал обратно к фиксированной дате.

Например, если мы выбрали фиксированную дату 01.01.2016, а наши элементы даты содержали бы 03.01.2016, 04.01.2016 и 05.01.2016, то наши интервалы составили бы 2, 3 и 4 дня соответственно. Совокупный минимум будет равен 2, и если мы добавим 2 дня назад к нашей фиксированной дате 01.01.2016, то наша кумулятивная минимальная дата будет 03.01.2016.

Выполнение кумулятивных функций в разных иерархиях

Это чит, который не полностью отвечает на вопрос, но моя помощь другим читателям StackOverflow!

Мой очень неуклюжий обходной путь включает в себя промежуточную схему сообщений с узлами <Revisions> в качестве дочерних элементов каждого узла <Book>.

На шаге 1 я сопоставляю свою исходную схему с моей промежуточной схемой, копируя данные узла <revisions> в каждый узел <Book> (здесь я также сохраняю рассчитанный числовой интервал для удобства).

Затем на шаге 2 я сопоставляю свою промежуточную схему с моей выходной схемой, используя мой минимальный функтоид и мой скриптовый функтоид для преобразования моего интервала обратно в дату.

Примечание. Это двухэтапное решение означает, что я не могу использовать DateTime.Today в качестве фиксированной даты, поскольку существует риск, что эти два этапа могут быть выполнены в разные дни!

person Quorfee    schedule 05.09.2016
comment
Вероятно, это неважно, но ваше написание ‹Revisions› непоследовательно. Разный корпус. - person Mr Lister; 17.09.2016