无法抑制BizTalk映射中的节点

时间:2011-04-13 21:52:21

标签: biztalk biztalk-mapper

下午所有, 我正在学习BizTalk,并坚持这个问题。

有一个选择组,有电话或地址。 输出电话时,我可以得到一些要抑制的地址字段。 为了简单起见,我将只讨论“CityName”字段。

我尝试了以下内容:

  • 将输入文件中的“City”(文本)节点映射到输出中的“CityName”。将 Exists 逻辑functoid连接到输入节点中的“Address1”节点和输出中的“CityName”。我总是得到一个填写了文字的城市名称。

  • 将输入文件中的“City”节点和 Exists 逻辑functoid映射到 Value Mapper functoid。将 Value Mapper functoid连接到输出中的CityName。我在地址节点(正确)中获取城市名称,在电话节点中获得一个空节点(不正确)。

  • 将输入文件中的“City”节点和Exists逻辑functoid映射到 Value Mapper(Flattening) functoid。将 Value Mapper(Flattening) functoid连接到输出中的CityName。我在地址节点(正确)中获取城市名称,在电话节点中获得一个空节点(不正确)。

我认为最后两个中的一个应该有效,但两者都给出一个空节点而不是一个被抑制的节点。空节点没有属性。

CityName节点由此架构类型描述:

<xsd:complexType name="NameType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
            <xsd:attribute name="languageID" type="xsd:language" use="optional">
            </xsd:attribute>
            <xsd:attribute name="sequence" type="IntegerNumericType">
            </xsd:attribute>
            <xsd:attribute name="sequenceName" type="StringType" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="IntegerNumericType">
    <xsd:restriction base="xsd:integer" />
</xsd:simpleType>

<xsd:simpleType name="StringType">
    <xsd:restriction base="xsd:string" />
</xsd:simpleType>

类型定义中是否存在强制创建空节点的内容?

由于

编辑:以下是不正确的输出。第二个和第三个通信节点有 一个Address Child节点,不应该。

我在电话号码上有一个循环functoid ,在平面输入模式中有第一个地址行。这将生成三个Communications节点。我在地址线上使用 Logical Existance functoid来抑制第一个节点中的电话信息。我在输出上有一个 Logical Not functoid,它直接绑定到输出模式中的Address节点。我认为应该关闭整个地址节点,但事实并非如此。

我尝试将连接到逻辑存在 functoid的值映射 functoid添加到城市名称和邮政编码元素中,这使它们变空,但他们不会去远。 ARG!

我检查过并且字段都设置为零MinOccurs,我不相信它们被赋予了默认值。

<ns0:Communication>
    <ns0:Address>
        <ns0:AddressLine sequence="1">1234 My St</ns0:AddressLine>
        <ns0:AddressLine sequence="2">Apt. 2</ns0:AddressLine>
        <ns0:CityName>Kansas City</ns0:CityName>
        <ns0:CountrySubDivisionCode name="State">MO</ns0:CountrySubDivisionCode>
        <ns0:CountrySubDivisionCode name="County">Jackson</ns0:CountrySubDivisionCode>
        <ns0:CountryCode>US</ns0:CountryCode>
        <ns0:PostalCode>64099</ns0:PostalCode>
    </ns0:Address>
</ns0:Communication>
<ns0:Communication sequence="1">
    <ns0:ChannelCode>Telephone</ns0:ChannelCode>
    <ns0:UseCode>Personal</ns0:UseCode>
    <ns0:DialNumber>1234567890</ns0:DialNumber>
    <ns0:Address>
        <ns0:CityName />
        <ns0:CountryCode />
        <ns0:PostalCode>64099</ns0:PostalCode>
    </ns0:Address>
</ns0:Communication>
<ns0:Communication sequence="2">
    <ns0:ChannelCode>Telephone</ns0:ChannelCode>
    <ns0:UseCode>Business</ns0:UseCode>
    <ns0:DialNumber>0987654321</ns0:DialNumber>
    <ns0:Address>
        <ns0:CityName />
        <ns0:CountryCode />
        <ns0:PostalCode>64099</ns0:PostalCode>
    </ns0:Address>
</ns0:Communication>

3 个答案:

答案 0 :(得分:1)

有样本输入和输出xml片段会很有帮助。没有它,我可以猜测xml结构。如果它们看起来像这样,那么下面的映射应该可以正常工作:

simple biztalk map of address and phone fields

你的架构看起来像那样吗?如果目标架构中的<Choice>设置为Max Occurs = unbounded,则此类映射生成的输出有效。如果不是这种情况,并且如果你只能有一个Contact输出,那么如果地址不在那里你就必须输出Phone,如下所示:

enter image description here

当然,这看起来有点傻,因为人们希望在源xml中同时拥有一个地址和一个电话,而目标xml会阻止你同时拥有这两者。

如果这些情况都不符合您的情况,请编辑您的问题以提供更多详细信息。

答案 1 :(得分:0)

min&amp;架构上的最大出现次数默认为1.映射器在生成XSLT时查看它。尝试将Min Occur设置为0.

答案 2 :(得分:0)

解决此问题的方法是使用xsl directly而不是内置映射器。

使用xsl,您可以控制选择值的时间和方式。那很难 当使用多个循环functoid。