3

我在 smooks 的帮助下在 java 程序中创建 ANSI.X12 消息。我正在使用 xml 文件(使用它们的http://www.milyn.org/schema/edi-message-mapping-1.2.xsd)自己定义 X12 消息。其中大部分都运行良好,但我确实对 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 消息描述中的正确方法吗?

4

1 回答 1

1

这可能会迟到,但我遇到了这个问题。我发现问题(如果您使用 EJC 生成)是它在每个段输出步骤的末尾添加以下内容:

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

如果分隔符是最后一个(ISA.ComponentElementSeparator 是),它将被截断,除非用转义符定义它,这不是此特定场景所需的行为。还没有答案,但想提出问题的根源。

在此处添加了问题定义和可能的方向:https ://github.com/smooks/smooks/issues/114

更新:如果使用 EJC,请设置以下内容:

 <medi:import truncatableSegments="false" ....
于 2016-03-28T19:00:19.933 回答