【问题标题】:I need to transform a complex xml to fixed length flat file.Please help me我需要将复杂的 xml 转换为固定长度的平面文件。请帮帮我
【发布时间】:2011-06-24 10:58:47
【问题描述】:

我有以下 XML,我需要将其转换为固定长度的平面文件

<IDataXMLCoder version="1.0">
  <record javaclass="com.wm.data.ISMemDataImpl">
    <value name="fileName">H_MonsantoNSCINVOIC</value>
    <idatacodable name="iDocList" javaclass="com.wm.adapter.sap.idoc.IDataDocumentList">
      <array name="iDocs" type="idatacodable" depth="1">
        <idatacodable javaclass="com.wm.adapter.sap.idoc.IDataDocument">
          <record name="iDocControl" javaclass="com.wm.data.ISMemDataImpl">
            <value name="TABNAM">EDI_DC40</value>
            <value name="MANDT">100</value>
            <value name="DOCNUM">0000000308010466</value>
            <value name="DOCREL">700</value>
            <value name="STATUS">30</value>
            <value name="DIRECT">1</value>
            <value name="OUTMOD">2</value>
            <value name="EXPRSS"></value>
            <value name="TEST"></value>
            <value name="IDOCTYP">INVOIC02</value>
            <value name="CIMTYP"></value>
            <value name="MESTYP">INVOIC</value>
            <value name="MESCOD">MON</value>
            <value name="MESFCT">BE</value>
            <value name="STD"></value>
            <value name="STDVRS"></value>
            <value name="STDMES">INVOIC</value>
            <value name="SNDPOR">SAPQ12</value>
            <value name="SNDPRT">LS</value>
            <value name="SNDPFC"></value>
            <value name="SNDPRN">DE_Q12_100</value>
            <value name="SNDSAD"></value>
            <value name="SNDLAD"></value>
            <value name="RCVPOR">WM_MONSANT</value>
            <value name="RCVPRT">LS</value>
            <value name="RCVPFC">LS</value>
            <value name="RCVPRN">MONSANTOBE</value>
            <value name="RCVSAD"></value>
            <value name="RCVLAD"></value>
            <value name="CREDAT">2011-06-22</value>
            <value name="CRETIM">06:23:57</value>
            <value name="REFINT"></value>
            <value name="REFGRP"></value>
            <value name="REFMES"></value>
            <value name="ARCKEY"></value>
            <value name="SERIAL">20110428112753</value>
          </record>
          <array name="segments" type="idatacodable" depth="1">
            <idatacodable javaclass="com.wm.adapter.sap.idoc.IDataSegment">
              <value name="name">E1EDK01</value>
              <record name="fields" javaclass="com.wm.data.ISMemDataImpl">
                <value name="CURCY">EUR</value>
                <value name="HWAER">EUR</value>
                <value name="WKURS">1.00000</value>
                <value name="ZTERM">F600</value>
                <value name="KUNDEUINR">ESA38362760</value>
                <value name="EIGENUINR">ESA08046799</value>
                <value name="BSART">INVO</value>
                <value name="BELNR">0098046324</value>
                <value name="NTGEW">360.000</value>
                <value name="BRGEW">371.880</value>
                <value name="GEWEI">KGM</value>
                <value name="RECIPNT_NO">0001605141</value>
                <value name="FKTYP">L</value>
              </record>
            </idatacodable>          </array>
        </idatacodable>
      </array>
    </idatacodable>
    <value name="$rfcname">IDOC_INBOUND_ASYNCHRONOUS</value>
    <value name="serverName">DE_Q12_100</value>
    <value name="$call">true</value>
    <value name="$encoding">ISO-8859-1</value>
    <value name="$tid">0AAFC4410C104E018A7D069D</value>
    <value name="$action">1</value>
    <value name="sender">DE_Q12_100</value>
    <value name="receiver">MONSANTOBE</value>
    <value name="msgType">INVOIC</value>
    <record name="transportParams" javaclass="com.wm.util.Values">
    </record>
  </record>
</IDataXMLCoder>

这是一个例子 这种类型的记录字段在原始输入中存在200次 有些值名称是相等的,有些是不同的。 请指导我,以便我可以尝试整个输入文件

输出看起来像

EDI_DC40  1000000000308010466700 3012  INVOIC02                                                    INVOIC                        MONBE        INVOICSAPQ12    LS  DE_Q12_100                                                                                           WM_MONSANTLSLSMONSANTOBE                                                                                           2011-06-2206:23:57                                                                                                                20110428112753      
E2EDK01005                    100000000030801046600000100000001    EUREUR1.00000     F600             ESA38362760         ESA08046799         INVO0098046324                         360.000           371.880           KGM                                                       0001605141                                                                    L              

只有两列。请参考输入文件 每个值都有固定长度,你可以设置任何值,之后我会改变。

请帮忙.....

【问题讨论】:

    标签: sap xslt-2.0 idoc


    【解决方案1】:

    这不是一个普通的文件...是 EDIfact 发票。也许this 可以提供帮助...您可以做的最好的事情是尝试对 XML 文件进行 XSLT...

    【讨论】:

    • 我需要将其转换为平面文件
    • 这是来自 SAP 系统的 idoc 文件
    【解决方案2】:

    这是一个完成这项工作的 XSLT 1.0“模板”脚本 ;-)

    我(已经开始)为每个字段添加所需数量的填充空间的方式有点乏味,但它确实有效 ;-) 事实上,如果我必须编写整个 XSLT ,我可能会写一个 XSLT 来写 XSLT ;-)

    如果您需要更多帮助来“完成”脚本,请告诉我……

    另一方面,如果有人有其他方法来添加所需数量的填充空格,请告诉我们!编写 XSLT 通常是一个迭代练习,这只是我的第一次工作迭代;-)

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text" encoding="ISO-8859-1"/>
      <xsl:template match="/">
        <!-- EDI_DC40 -->
        <xsl:for-each select="IDataXMLCoder/record/idatacodable/array/idatacodable/record/value">
          <xsl:value-of select="text()"/>
          <xsl:choose>
            <!-- TABNAM (10) -->
            <xsl:when test="@name = 'TABNAM'">
              <xsl:choose>
                <xsl:when test="string-length(text()) = 0">
                  <xsl:text>          </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 1">
                  <xsl:text>         </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 2">
                  <xsl:text>        </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 3">
                  <xsl:text>       </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 4">
                  <xsl:text>      </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 5">
                  <xsl:text>     </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 6">
                  <xsl:text>    </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 7">
                  <xsl:text>   </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 8">
                  <xsl:text>  </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 9">
                  <xsl:text> </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) &gt; 10">
                  <xsl:message terminate="yes">ERROR: The maximum length of "TABNAM" is 10 characters.</xsl:message>
                </xsl:when>
                <xsl:otherwise/>
              </xsl:choose>
            </xsl:when>
            <!-- MANDT (3)-->
            <xsl:when test="MANDT">
              <xsl:choose>
                <xsl:when test="string-length(text()) = 0">
                  <xsl:text>   </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 1">
                  <xsl:text>  </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 2">
                  <xsl:text> </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) &gt; 3">
                  <xsl:message terminate="yes">ERROR: The maximum length of "MANDT" is 3 characters.</xsl:message>
                </xsl:when>
                <xsl:otherwise/>
              </xsl:choose>
            </xsl:when>
            <!-- DOCNUM (16) -->
            <!-- DOCREL (4) -->
            <!-- STATUS (4) -->
            <!-- etc. -->
          </xsl:choose>
        </xsl:for-each>
        <xsl:text>&#x0D;&#x0A;</xsl:text>
        <!-- E1EDK01 -->
        <xsl:for-each select="IDataXMLCoder/record/idatacodable/array/idatacodable/array/idatacodable/record/value">
          <xsl:value-of select="text()"/>
          <xsl:choose>
            <!-- ACTION (3) -->
            <xsl:when test="@name = 'ACTION'">
              <xsl:choose>
                <xsl:when test="string-length(text()) = 0">
                  <xsl:text>   </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 1">
                  <xsl:text>  </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) = 2">
                  <xsl:text> </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) &gt; 3">
                  <xsl:message terminate="yes">ERROR: The maximum length of "ACTION" is 3 characters.</xsl:message>
                </xsl:when>
                <xsl:otherwise/>
              </xsl:choose>
            </xsl:when>
            <!-- KZABS (1)-->
            <xsl:when test="KZABS">
              <xsl:choose>
                <xsl:when test="string-length(text()) = 0">
                  <xsl:text> </xsl:text>
                </xsl:when>
                <xsl:when test="string-length(text()) &gt; 1">
                  <xsl:message terminate="yes">ERROR: The maximum length of "KZABS" is 1 character.</xsl:message>
                </xsl:when>
                <xsl:otherwise/>
              </xsl:choose>
            </xsl:when>
            <!-- CURCY (3) -->
            <!-- HWAER (3) -->
            <!-- WKURS (12) -->
            <!-- etc. -->
          </xsl:choose>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    

    如果有帮助请告诉我...

    【讨论】:

    • 感谢示例方法,尽管这将是一场噩梦。我会将填充放在一个函数中,该函数采用文本和所需长度并将填充的文本输出到所需长度。 .
    【解决方案3】:

    这可能会有所帮助: http://www.stylusstudio.com/SSDN/default.asp?action=9&read=3179&fid=47 带有一个非常方便的带有填充模板的 xsl 转换文件: http://www.stylusstudio.com/SSDN/upload/csv-to-fixed.xsl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多