0

午後になっても、私は BizTalk を学んでいて、この問題に行き詰まっています。

電話番号または住所の選択グループがあります。電話を出力するときに、住所フィールドの一部を非表示にすることができます。簡単にするために、「CityName」フィールドについて説明します。

私は次のことを試しました:

  • 入力ファイルの "City" (テキスト) ノードを出力の "CityName" にマップしました。Exists論理 Functoid を入力ノードの "Address1" ノードと出力の "CityName" ノードに接続しました。私はいつもテキストが記入された都市名を取得します。

  • 入力ファイルの "City" ノードとExists論理 Functoid をValue Mapper Functoid にマップしました。値マッパーFunctoid を出力の CityName に接続しました。address ノードで都市名を取得し (正しい)、telephone ノードで空のノードを取得します (正しくない)。

  • 入力ファイルの "City" ノードと Exists 論理 Functoid を値マッパー (フラット化) Functoid にマップしました。値マッパー (フラット化) Functoid を出力の CityName に接続しました。address ノードで都市名を取得し (正しい)、telephone ノードで空のノードを取得します (正しくない)。

最後の2つのうちの1つが機能するはずだと思いましたが、どちらも抑制されたノードではなく空のノードを提供します。空のノードには属性がありません。

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>

空のノードの作成を強制するタイプ定義に何かありますか?

ありがとう

編集: 以下は間違った出力です。2 番目と 3 番目の Communication ノードには Address Child ノードがありますが、これはすべきではありません。

電話番号とフラットな入力スキーマの最初の住所行にループ Functoid がありますこれにより、3 つの通信ノードが生成されます。アドレス行でLogical Existance Functoidを使用して、最初のノードの電話情報を抑制しています。出力スキーマの Address ノードに直接結び付けられている出力に Logical Not Functoid がありますアドレスノード全体をオフにする必要があると思いましたが、そうではありません。

論理的存在 Functoid に接続された値マッピングFunctoid を City Name および Postal code 要素に追加しようとしましたが、それらは空になりましたが、消えません。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>
4

3 に答える 3

1

サンプルの入力および出力 xml スニペットがあると役立ちます。それがなければ、xml 構造を推測できます。それらがこのように見える場合、以下のマッピングは正常に機能するはずです:

住所と電話番号フィールドの単純な Biztalk マップ

あなたのスキーマはそのように見えますか? <Choice>このようなマップによって生成される出力は、宛先スキーマの が に設定されている場合に有効ですMax Occurs = unbounded。そうでなく、連絡先の出力が 1 つしかない場合は、次のように、住所が存在しない場合にのみ電話を出力する必要があります。

ここに画像の説明を入力

もちろん、これは少しばかげているように思えます。なぜなら、ソース xml に Address と Phone の両方が含まれていることが期待され、宛先 xml では両方を保持できないからです。

これらのシナリオのいずれもあなたのものと一致しない場合は、質問を編集して詳細を提供してください。

于 2011-04-14T19:23:26.233 に答える
0

スキーマの最小および最大オカレンスはデフォルトで1です。マッパーはXSLTを生成するときにそれを確認します。MinOccurを0に設定してみてください。

于 2011-04-14T16:07:09.653 に答える
0

この問題を解決する方法は、組み込みマッパーの代わりにxsl を直接使用することです。

xsl を使用すると、いつ、どのように値を選択するかを制御できます。複数のループ Functoid を使用する場合、これは非常に困難です。

于 2012-12-17T20:48:29.693 に答える