Я создаю сообщения 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?
<delimiters>
- это все, что вам нужно указать. Я предполагаю, что тег delimiters создает для вас сегмент ISA, без необходимости явно указывать его самостоятельно? - person geert3   schedule 04.12.2014000000987654321
в примере) или как сделать так, чтобы этот сегмент отображался в созданном сообщении. - person kratenko   schedule 04.12.2014?
. Я вижу много примеров, когда перед концом первого компонента есть какой-то выход. Кроме того, ISA - это сегмент фиксированной длины, и кажется, что последний символ взят, независимо (я думаю), экранирован он или нет. Итак, что произойдет, если вы оставите это там, просто убедитесь, что общая длина в порядке. - person geert3   schedule 04.12.2014