用于EDI的BizTalk自定义XSLT - 嵌套循环

时间:2018-05-29 15:44:48

标签: xslt biztalk edi biztalk-mapper

我很擅长为Biztalk映射器编写自定义XML,我遇到了一个需要进行嵌套循环的问题。

   <xsl:for-each select="customers">
    <xsl:for-each select="customer">
      <xsl:variable name="var:v9" select="'BY'" />
      <xsl:variable name="var:v10" select="@name" />
      <xsl:variable name="var:v11" select="'91'" />
      <xsl:variable name="var:v12" select="@accountNumber" />
      <ns0:N1Loop1>
        <ns0:N1>
          <N101>
            <xsl:value-of select="$var:v9" />
          </N101>
          <N102>
            <xsl:value-of select="$var:v10" />
          </N102>
          <N103>
            <xsl:value-of select="$var:v11" />
          </N103>
          <N104>
            <xsl:value-of select="$var:v12" />
          </N104>
        </ns0:N1>
      </ns0:N1Loop1>
      <xsl:for-each select="products">
        <xsl:for-each select="product">
          <xsl:variable name="var:v13" select="'VC'" />
          <xsl:variable name="var:v14" select="@sku" />
          <xsl:variable name="var:v15" select="'003'" />
          <xsl:variable name="var:v16" select="'208'" />
          <xsl:variable name="var:v17" select="@expirationDate" />
          <xsl:variable name="var:v19" select="'F'" />
          <xsl:variable name="var:v20" select="'RX'" />
          <xsl:variable name="var:v21" select="@description" />
          <xsl:variable name="var:v22" select="@caseSize" />
          <xsl:variable name="var:v23" select="@size" />
          <xsl:variable name="var:v24" select="'EA'" />
          <xsl:variable name="var:v25" select="'INV'" />
          <xsl:variable name="var:v26" select="@unitPrice" />
          <xsl:variable name="var:v27" select="'MF'" />
          <xsl:variable name="var:v28" select="@manufacturerName" />
          <ns0:LINLoop1>
            <ns0:LIN>
              <LIN02>
                <xsl:value-of select="$var:v13" />
              </LIN02>
              <LIN03>
                <xsl:value-of select="$var:v14" />
              </LIN03>
            </ns0:LIN>
            <ns0:G53>
              <G5301>
                <xsl:value-of select="$var:v15" />
              </G5301>
            </ns0:G53>
            <ns0:DTM_4>
              <DTM01>
                <xsl:value-of select="$var:v16" />
              </DTM01>
              <xsl:variable name="var:v18" select="userCSharp:ConvertDate(string($var:v17))" />
              <DTM02>
                <xsl:value-of select="$var:v18" />
              </DTM02>
            </ns0:DTM_4>
            <ns0:PID>
              <PID01>
                <xsl:value-of select="$var:v19" />
              </PID01>
              <PID02>
                <xsl:value-of select="$var:v20" />
              </PID02>
              <PID05>
                <xsl:value-of select="$var:v21" />
              </PID05>
            </ns0:PID>
            <ns0:PO4>
              <PO401>
                <xsl:value-of select="$var:v22" />
              </PO401>
              <PO402>
                <xsl:value-of select="$var:v23" />
              </PO402>
              <PO403>
                <xsl:value-of select="$var:v24" />
              </PO403>
            </ns0:PO4>
            <ns0:CTPLoop1>
              <ns0:CTP_2>
                <CTP02>
                  <xsl:value-of select="$var:v25" />
                </CTP02>
                <CTP03>
                  <xsl:value-of select="$var:v26" />
                </CTP03>
              </ns0:CTP_2>
            </ns0:CTPLoop1>
            <ns0:N1Loop2>
              <ns0:N1_2>
                <N101>
                  <xsl:value-of select="$var:v27" />
                </N101>
                <N102>
                  <xsl:value-of select="$var:v28" />
                </N102>
              </ns0:N1_2>
            </ns0:N1Loop2>
          </ns0:LINLoop1>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:for-each>

我创建了一个for-each,用于在N1Loop1中找到客户字段,然后依次为LINLoop1执行每个产品,以遍历N1字段下的每个产品。当我使用此代码时,我收到以下错误:

  

错误btm1046:输出验证错误:元素'X12_00401_832'中   名称空间“http://schemas.microsoft.com/BizTalk/EDI/X12/2006”有   命名空间中的无效子元素“N1Loop1”   'http://schemas.microsoft.com/BizTalk/EDI/X12/2006'。可能的清单   期望的元素:名称空间中的'LINLoop1,CTT'   'http://schemas.microsoft.com/BizTalk/EDI/X12/2006'以及'SE'。

有人能指出我正确的方向吗?所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果要根据每个客户生成多个x12数据,请确保在foreach循环之后添加这些节点CTT和SE。这基于X12_00603_832 EDI验证要求。

<foreach> <customer>
   <foreach><n1loop1></foreach>
   <foreach><linloop1></foreach>          
   <CTT>        
     <CTT01>23</CTT01>
   </CTT>
   <SE>
    <SE01>154</SE01>
    <SE02>ST02</SE02>
   </SE> </customer></foreach>