2011-04-13 50 views
0

全部下午, 我正在学习BizTalk,并且陷入了这个问题。无法在BizTalk映射中抑制节点

有一个电话或地址选择组。 当输出电话时,我可以得到一些地址字段被抑制。 为了使事情更简单,我将讨论“CityName”字段。

我已经试过如下:

  • 映射“城市”(文本)在输出的输入文件,以“城市名”节点。已连接存在逻辑functoid到输入节点中的“Address1”节点和输出中的“CityName”。我总是得到一个城市的名称以文本填写。

  • 映射“城市”节点输入文件和已存在逻辑的functoid到值映射器的functoid。将Value Mapper functoid连接到输出中的CityName。我在地址节点(Correct)中获得城市名称,在电话节点中获得空节点(错误)。

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

我认为最后两个之一应该已经工作,但都给一个空的节点,而不是抑制节点。空节点没有属性。

<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> 

有什么在多数民众赞成迫使空节点要创建的类型定义:

的CITYNAME节点由这种模式类型描述?

谢谢

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

我有一个循环functoid在电话号码和平面输入架构中的第一个地址线。这产生三个通信节点。我正在使用地址线上的逻辑存在 functoid来抑制第一个节点中的电话信息。我有一个逻辑不是 functoid的输出,直接绑定到输出模式中的地址节点。我认为应该关闭整个地址节点,但它不会。

我尝试添加一个值映射的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> 

回答

0

在架构默认为1分钟&最大值出现生成XSLT时映射器着眼于这一点。尝试将最小出现设置为0.

+0

没有帮助。将其全部设置为minOccurs 0. – Jay 2011-04-15 14:31:12

1

这将有助于获得样本输入和输出xml片段。没有这个,我可以猜测xml结构。如果他们是这个样子,那么下面的映射应该很好地工作:

simple biztalk map of address and phone fields

做你的架构看起来像吗?如果目标模式中的<Choice>设置为Max Occurs = unbounded,则由此映射生成的输出有效。如果不是这种情况,如果你只能有一个触点输出,那么你就必须只输出的电话,如果地址是不存在的,就像这样:

enter image description here

当然,这似乎是一个有点傻,因为人们希望在源xml中同时拥有一个地址和一个电话,并且目标xml可以阻止你拥有这两者。

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

+0

编辑原始问题以包含您询问的详细信息。感谢您的帮助 – Jay 2011-04-14 20:58:04

0

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

使用xsl,您可以控制何时以及如何选择值。当使用多个循环functoids时,这是非常困难的 。