2011-04-13 33 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時,這是非常困難的 。