C# biztalk中复杂重复结构的扁平化
我有一个与此类似的xml实例: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&
<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