3

我尝试使用 Biztalk 2010 将分层 XML 文件转换为平面文件架构。

它工作正常。每个文件都被映射。但是等级制度被破坏了。

我的输入 xml 结构如下所示:

<root>
    <node>
        <element1></element1>
        <element2></element2>
        <subnode1>
            <element1></element1>
            <element2></element2>
        </subnode1>
        <subnode2>
            <element1></element1>
            <element2></element2>
        </subnode2>
    </node>
</root>

平面文件架构如下所示:

<root>
    <node>
        <element1></element1>
        <element2></element2>
    </node>
    <subnode1>
        <element1></element1>
        <element2></element2>
    </subnode1>
    <subnode2>
        <element1></element1>
        <element2></element2>
    </subnode2>
</root>

我的输入是这样的:

<root>
    <node>
        <element1>Test1</element1>
        <element2>Test2</element2>
        <subnode1>
            <element1>Sub11</element1>
            <element2>Sub12</element2>
        </subnode1>
        <subnode2>
            <element1>Sub21</element1>
            <element2>Sub22</element2>
        </subnode2>
    </node>
    <node>
        <element1>Test3</element1>
        <element2>Test4</element2>
        <subnode1>
            <element1>Sub31</element1>
            <element2>Sub32</element2>
        </subnode1>
        <subnode2>
            <element1>Sub41</element1>
            <element2>Sub42</element2>
        </subnode2>
    </node>
</root>

我期望的输出是:

Test1;Test2
Sub11;Sub12
Sub21;Sub22
Test3;Test4
Sub31;Sub32
Sub41;Sub42

但我得到的是:

Test1;Test2
Test3;Test4
Sub11;Sub12
Sub21;Sub22
Sub31;Sub32
Sub41;Sub42

有什么想法可以让 Biztalk 保持层次结构吗?

4

1 回答 1

4

我现在手头没有 BizTalk Mapper,所以我只能提供 Xslt 解决方案,但基本上它会说明您需要您的地图迭代您的node元素以保留结构。

如果您想使用纯 BizTalk 映射实现此目的,您需要在平面输出结构中使用一个分组节点来连接您的源node元素,这将强制映射创建for-each循环,如下面的 Xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="text" indent="no" />

    <xsl:template match="/">
        <xsl:for-each select="root/node">
            <xsl:value-of select="element1" />
            <xsl:text>;</xsl:text>
            <xsl:value-of select="element2" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:value-of select="subnode1/element1" />
            <xsl:text>;</xsl:text>
            <xsl:value-of select="subnode1/element2" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:value-of select="subnode2/element1" />
            <xsl:text>;</xsl:text>
            <xsl:value-of select="subnode2/element2" />
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

&#xA;您可能需要根据输出模式的需要调整换行符 ( )。

于 2012-06-25T07:47:52.573 回答