0

整个下午,我正在学习 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。将值映射器(扁平化) 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>

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

谢谢

编辑:下面是不正确的输出。第二个和第三个通信节点有一个地址子节点,不应该。

我在电话号码和平面输入模式中的第一个地址行上有一个循环 functoid 。这产生了三个通信节点。我在地址线上使用逻辑存在函数来抑制第一个节点中的电话信息。我在输出模式中直接与 Address 节点绑定的输出上有一个Logical Not functoid。我认为这应该关闭整个地址节点,但事实并非如此。

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

我检查了这些字段都设置为零 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>
4

3 回答 3

1

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

地址和电话字段的简单 biztalk 地图

你的模式看起来像那样吗?<Choice>如果目标模式中的 设置为 ,则此类映射生成的输出有效Max Occurs = unbounded。如果不是这种情况,并且您只能有一个联系人输出,那么您必须仅在地址不存在时输出电话,如下所示:

在此处输入图像描述

当然,这似乎有点愚蠢,因为人们希望在源 xml 中同时拥有地址和电话,而目标 xml 会阻止您同时拥有这两者。

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

于 2011-04-14T19:23:26.233 回答
0

模式上的最小和最大出现次数默认为 1。映射器在生成 XSLT 时会查看该值。尝试将 Min Occur 设置为 0。

于 2011-04-14T16:07:09.653 回答
0

解决这个问题的方法是直接使用xsl而不是内置的mapper。

使用 xsl,您可以控制选择值的时间和方式。这在使用多个循环 functoid 时非常困难。

于 2012-12-17T20:48:29.693 回答