如何在smooks中定义ISA-Segment?

时间:2014-11-07 14:26:05

标签: java smooks x12

我在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*^

(请注意?之前的^}。

到目前为止我唯一的解决方法是将一些不同的char添加到medi:delimiters <medi:delimiters segment="&#10;" field="*" component="&lt;" sub-component="~" escape="?" />中,但是只要该char出现在某个地方的数据中,就会产生问题。这特别令人沮丧,因为消息甚至不使用任何必须分离的组件。

我在smooks的文档中找不到任何关于它的信息,但必须以某种方式来做到这一点。毕竟,X12是我所知道的两个原因之一,任何人都会首先使用smooks(另一个是EDIFACT)。

任何人都知道在我的smooks消息描述中插入ISA的正确方法吗?

1 个答案:

答案 0 :(得分:0)

这可能会迟到,但我遇到了这个问题。我已经确定了问题(如果你使用EJC生成)是在每个段输出步骤结束时添加以下内容:

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

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

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

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

 <medi:import truncatableSegments="false" ....