在biztalk中展平复杂的重复结构

时间:2014-02-28 08:11:23

标签: c# map biztalk biztalk-2010

我有一个与此类似的xml实例:

<outerElementList>
   <outerElement>
       <outerID>1</outerID>
       <outerName>test1</outerName>
       <innerElementList>
           <innerElement>
               <innerID>10</innerID>
               <innerName>test10</innerName>
           </innerElement>
           <innerElement>
               <innerID>20</innerID>
               <innerName>test20</innerName>
           </innerElement>
       </innerElementList>
   </outerElement>
   <outerElement>
       <outerID>2</outerID>
       <outerName>test2</outerName>
       <innerElementList>
           <innerElement>
               <innerID>30</innerID>
               <innerName>test30</innerName>
           </innerElement>
           <innerElement>
               <innerID>40</innerID>
               <innerName>test40</innerName>
           </innerElement>
       </innerElementList>
   </outerElement>

我最终需要这样的事情:

<ElementList>
   <Element>
       <ID>1</ID>
       <Name>test1</Name>          
   </Element>
   <Element>
       <ID>2</ID>
       <Name>test2</Name>              
   </Element>
   <Element>
       <ID>10</ID>
        <SuperID>1</SuperID>
       <Name>test10</Name>         
   </Element>
   <Element>
       <ID>20</ID>
       <SuperID>1</SuperID>            
       <Name>test20</Name> 
   </Element>
   <Element>
       <ID>30</ID> 
       <SuperID>2</SuperID>
       <Name>test30</Name> 
   </Element>
   <Element>
       <ID>40</ID> 
       <SuperID>2</SuperID>
       <Name>test40</Name> 
   </Element>

内部元素的SuperID是ID和封闭的外部元素。 我意识到我需要使用循环functoid,但我似乎无法让我正确。

此问题是22035260 的衍生产品 basvo为原始问题提供了一个很好的答案,其中内部结构和外部结构仅由一个ID组成。不幸的是,它不容易应用于更复杂的结构。

2 个答案:

答案 0 :(得分:0)

您可能需要做的是创建一个包含两种记录类型和两种映射的中间模式。第一张地图如下所示。

Intermediate map

这导致以下XML。

<ElementList>
  <ElementRoot>
    <ID>1</ID>
    <Name>test1</Name>
  </ElementRoot>
  <ElementRoot>
    <ID>2</ID>
    <Name>test2</Name>
  </ElementRoot>
  <Element>
    <ID>10</ID>
    <SuperID>1</SuperID>
    <Name>test10</Name>
  </Element>
  <Element>
    <ID>20</ID>
    <SuperID>1</SuperID>
    <Name>test20</Name>
  </Element>
  <Element>
    <ID>30</ID>
    <SuperID>2</SuperID>
    <Name>test30</Name>
  </Element>
  <Element>
    <ID>40</ID>
    <SuperID>2</SuperID>
    <Name>test40</Name>
  </Element>
</ElementList>

然后这很容易映射

Second Map

导致

<ElementList>
  <Element>
    <ID>1</ID>
    <Name>test1</Name>
  </Element>
  <Element>
    <ID>2</ID>
    <Name>test2</Name>
  </Element>
  <Element>
    <ID>10</ID>
    <SuperID>1</SuperID>
    <Name>test10</Name>
  </Element>
  <Element>
    <ID>20</ID>
    <SuperID>1</SuperID>
    <Name>test20</Name>
  </Element>
  <Element>
    <ID>30</ID>
    <SuperID>2</SuperID>
    <Name>test30</Name>
  </Element>
  <Element>
    <ID>40</ID>
    <SuperID>2</SuperID>
    <Name>test40</Name>
  </Element>
</ElementList>

注意:另一种选择当然是通过自定义XSLT来完成。

答案 1 :(得分:0)

除了Dijkgraafs非常称职的答案之外,这就是我们使用XSLT解决问题的方法。

<ftns17:outerElementList xmlns:ftns17="http://[Parent-Scheme]" xmlns:ftns19="http://[Element-Scheme]">
  <xsl:for-each select="/*[local-name() = 'Parent']/*[local-name() = 'outerElementList'][1]/*[local-name() = 'outerElement']">
    <xsl:variable name="id" select="*[local-name() = 'ID']/text()" />
    <ftns17:outerElement>
      <ftns19:ID>
        <xsl:value-of select="$id" />
      </ftns19:ID>
      <ftns19:Name>
        <xsl:value-of select="*[local-name() = 'Name']/text()" />
      </ftns19:Name>
    </ftns17:outerElement>
    <xsl:for-each select="*[local-name() = 'innerElementList']/*[local-name() = 'innerElement']">
      <ftns17:innerElement>
        <ftns19:ID>
          <xsl:value-of select="*[local-name() = 'ID']/text()" />
        </ftns19:ID>
        <ftns19:SuperID>
          <xsl:value-of select="$id" />
        </ftns19:SuperID>
        <ftns19:Name>
          <xsl:value-of select="*[local-name() = 'Name']/text()" />
        </ftns19:Name>      
    </ftns17:innerElement>    
  </xsl:for-each>  
</xsl:for-each>
</ftns17:outerElementList>

在脚本functoid中使用内联XSLT并将输出附加到元素列表。