Извиняюсь за запутанный заголовок, но я не уверен, как лучше это описать. По сути, у меня есть запись в исходной схеме, которая зацикливается для создания 5 разных записей в целевой схеме.
Каждая из этих записей создается на основе значения поля в исходной схеме, чтобы каждая из них могла быть сопоставлена с правильной информацией. В данном случае это адресная информация о покупателе, поставщике и т.д.
Каждая запись в схеме назначения также имеет контактную запись с такими полями, как имя, телефон и т. д.
Моя задача состоит в том, чтобы сопоставить поля из исходной схемы с записью контакта для покупателя в схеме назначения, но не с контактными данными покупателя в исходной схеме.
Структура покупателя (схема назначения)
Структура записи в исходной схеме, которая зацикливается. Я пометил поле, значение которого проверяется перед созданием различных записей в схеме назначения, синим цветом вверху, а запись, содержащую контактные данные, синим цветом внизу.
Причина, по которой я не могу просто отобразить их, как обычно, заключается в том, что CTALoop1 находится внутри области действия текущей отображаемой записи. Поэтому, когда покупатель сопоставляется, я не могу получить доступ к контактным данным из другого NADLoop1, поскольку они не находятся внутри области цикла.
Мой входной файл содержит следующее:

Как видите, только NADLoop1 с NAD01 = PO содержит контактные данные, и они не сопоставляются с покупателем, поскольку находятся вне области действия.
Как я могу сопоставить детали CTALoop1 из другой записи, отличной от той, которая зацикливается на схеме назначения? Я не буду использовать сценарии XSLT, но следует сказать, что цикл в настоящее время выполняется с помощью визуального преобразователя, и я знаю, что это может вызвать проблемы при добавлении XSLT.





Мне удалось решить это с помощью следующего встроенного XSLT:
<Contact>
<Name>
<xsl:value-of select = "/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='CTA']/*[local-name()='C056']/*[local-name()='C05602']"/>
</Name>
<Telephone>
<xsl:value-of select = "/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='COM']/*[local-name()='C076'][*[local-name()='C07602'] = 'TE']/*[local-name()='C07601']"/>
</Telephone>
<Email>
<xsl:value-of select = "/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='COM']/*[local-name()='C076'][*[local-name()='C07602'] = 'EM']/*[local-name()='C07601']"/>
</Email>
</Contact>