【问题标题】:How to create a Biztalk Map that transforms hierarchical XML to flat file如何创建将分层 XML 转换为平面文件的 Biztalk 映射
【发布时间】:2012-06-23 21:09:32
【问题描述】:

我尝试使用 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 保持层次结构吗?

【问题讨论】:

    标签: xml biztalk flat-file biztalk-2010 biztalk-mapper


    【解决方案1】:

    我现在手头没有 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>
    

    您可能需要根据输出架构需要调整换行符 (&amp;#xA;)。

    【讨论】:

    • +1 - 掌握 XSLT 将节省数小时的挫败感和使用映射器(无论如何都会转换为 XSLT)在除了最琐碎的地图之外的所有事情。请参阅此处,了解如何将现有地图转移到 XSLT stackoverflow.com/questions/3716608/…
    • 编辑 XSLT 似乎是最好的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多