Как определить ISA-сегмент в смоки?

Я создаю сообщения ANSI.X12 в программе Java с помощью Smooks. Я сам определяю сообщения X12, используя xml-файлы (с их http://www.milyn.org/schema/edi-message-mapping-1.2.xsd). Большинство из них работает достаточно хорошо, но у меня есть проблема с ISA-сегментом. Я определил это так:

<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.2.xsd">

    <medi:description name="Some X12 Message Definition" version="1.0" />

    <medi:delimiters segment="&#10;" field="*" 
        component="^" sub-component="~" escape="?" />

    <medi:segments xmltag="Segments">

        <medi:segment segcode="ISA" xmltag="InterchangeControlHeader">
            <medi:field xmltag="AuthorizationInformationQualifier" />
            <medi:field xmltag="AuthorizationInformation"/>
            <medi:field xmltag="SecurityInformationQualifier"/>
            <medi:field xmltag="SecurityInformation"/>
            <medi:field xmltag="InterchangeSenderQualifier"/>
            <medi:field xmltag="InterchangeSenderID"/>
            <medi:field xmltag="InterchangeReceiverQualifier"/>
            <medi:field xmltag="InterchangeReceiverID"/>
            <medi:field xmltag="InterchangeDate" type="Date" typeParameters="format=yyMMdd"/>
            <medi:field xmltag="InterchangeTime" type="Date" typeParameters="format=HHmm"/>
            <medi:field xmltag="InterchangeControlStandardsIdentifier"/>
            <medi:field xmltag="InterchangeControlVersionNumber"/>
            <medi:field xmltag="InterchangeControlNumber"/>
            <medi:field xmltag="AcknowledgmentRequested"/>
            <medi:field xmltag="UsageIndicator"/>
            <medi:field xmltag="ComponentElementSeparator"/>
        </medi:segment>
[...]

Пока я вставляю строки правильной длины, это в основном пригодно для использования. Проблема с разделителем компонентов (^ в этом случае). Сегмент ISA определяет, какие символы являются специальными символами, используемыми для разделения сегментов, элементов и т. Д. Когда я ставлю "^" как значение в ComponentElementSeparator, он становится экранированным (конечно), поскольку это специальный символ, и smooks не знает, что мой сегмент ISA - это особый сегмент ISA.

я получил

ISA*00*          *00*          *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*?^

где это должно быть

ISA*00*          *00*          *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*^

(Обратите внимание ? в конце перед ^).

Единственный обходной путь, который я получил до сих пор, - это вставить какой-то другой символ в medi:delimiters такие как <medi:delimiters segment="&#10;" field="*" component="&lt;" sub-component="~" escape="?" />, но это обязательно создаст проблемы, как только этот символ появится в данных где-то. Это особенно расстраивает, так как в сообщении даже не используются какие-либо компоненты, которые должны быть разделены.

Я не смог найти никакой информации об этом в документации smooks, но должен быть какой-то способ сделать это. В конце концов, X12 - одна из двух причин, по которым я знаю, что любой будет использовать smooks в первую очередь (другая - EDIFACT).

Кто-нибудь знает правильный способ вставить ISA в мое описание сообщения smooks?

1 ответ

Это может быть поздно, но я столкнулся с проблемой. Я определил проблему (если вы используете EJC для генерации) в том, что он добавляет следующее в конце каждого шага вывода сегмента:

writer.write(EDIUtils.concatAndTruncate(nodeTokens, DelimiterType.FIELD, delimiters));

Если в качестве последнего используется разделитель (которым является ISA.ComponentElementSeparator), он будет усечен, если только он не определен с помощью escape, что не является желаемым поведением для этого конкретного сценария. Пока не имею ответа, но хотел поднять источник вопроса.

Добавлено определение проблемы и возможные направления здесь: https://github.com/smooks/smooks/issues/114

ОБНОВЛЕНИЕ: если используется EJC, установите следующее:

 <medi:import truncatableSegments="false" ....
Другие вопросы по тегам