Нужен способ передать узел любого типа пользовательской функции из механизма правил BizTalk

#c# #xpath #biztalk #biztalk-rule-engine

#c# #xpath #biztalk #biztalk-механизм правил

Вопрос:

Я работаю над приложением BizTalk.

Я настроил свои словари и начал писать правила в rule composer.

После оценки правила я создал функцию с именем AddValidationError, которая записывает ошибку проверки в проверяемый XML-документ. Метод AddValidationError вызывается из раздела Action правила.

Я хочу передать узел, который оценивается, методу AddValidationError, чтобы я мог определить XPath к этому узлу и включить его как часть сообщения об ошибке.

Я думал, что у меня может быть параметр типа TTypedXmlDocument, но это не позволяет мне передавать узлы, которые определены как что-либо отличное от TTypedXmlDocument, такие как string, int, datetime и т.д. Я заметил, что механизм правил имеет метод с именем Exists, который принимает узел любого типа и преобразует его в XPath, что мне и нужно.

Я не хочу копировать текст XPath в метод AddValidationError, поскольку это кажется запутанным, а также любой BA должен иметь возможность создавать новые правила простым перетаскиванием узлов и методов на экран, т. е. им не обязательно знать, что вам нужно скопировать XPath к узлу в метод AddValidationError, чтобы он работал.

Я надеюсь, что это имеет смысл.

Итак, возвращаясь к методу Exists predicate, я могу передать ему любой узел, и, похоже, он автоматически обрабатывает XPath, как я могу получить эту функциональность? или, что еще лучше, как я могу передать узел типа, отличного от TTypedXmlDocument, методу, а затем определить XPath для переданного узла?

Я думал о том, чтобы иметь два определения для каждого узла, одно из которых представляет значение, строку, int, datetime и т.д., А другое для того же узла, но из TTypedXmlDocument. Хотя это и работает, но также немного попахивает, поэтому хотелось бы чего-нибудь получше.

Ответ №1:

То, что вы просите конкретно, невозможно. Compose не видит фактический XPath как артефакт, только то, что он разрешает.

Хотя вы можете увидеть XPath в предикате Exists, на самом деле это не то, что оценивается. Результат XPath, как и любой другой параметр, проверяется на null.

Если бы мне пришлось сделать что-то подобное, я бы, вероятно, создал элемент словаря с «путем» (но не обязательно допустимым XPath) к узлу / полю, проверяемому в правиле.