C# biztalk中复杂重复结构的扁平化

C# biztalk中复杂重复结构的扁平化,c#,map,biztalk,biztalk-2010,C#,Map,Biztalk,Biztalk 2010,我有一个与此类似的xml实例: <outerElementList> <outerElement> <outerID>1</outerID> <outerName>test1</outerName> <innerElementList> <innerElement> <innerID>10&

我有一个与此类似的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>

1.
测试1
10
测试10
20
测试20
2.
测试2
30
测试30
40
测试40

我需要以这样的方式结束:

<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>

1.
测试1
2.
测试2
10
1.
测试10
20
1.
测试20
30
2.
测试30
40
2.
测试40

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

这个问题是一个衍生问题
basvo为最初的问题提供了一个很好的答案,即内部和外部结构都只包含一个ID。不幸的是,它不容易应用于更复杂的结构

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

这将产生下面的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>

1.
测试1
2.
测试2
10
1.
测试10
20
1.
测试20
30
2.
测试30
40
2.
测试40
那么这很容易映射

导致

<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>

1.
测试1
2.
测试2
10
1.
测试10
20
1.
测试20
30
2.
测试30
40
2.
测试40

注意:另一种选择当然是通过定制XSLT来实现。

除了DijkGraaf非常有说服力的回答之外,这就是我们使用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并将输出附加到elementlist