Как определить 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=" " 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=" " field="*" component="<" 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" ....