2

非常に複雑な入力メッセージがあり、XSL スタイルシートを使用してブラウザーでドキュメントを表示するかのように、ノード名と値を (名前空間情報なしで) 出力に逆流させる必要があります。個々のソース XML 要素を対応するターゲット要素にマップする必要はありません。出力はフラットファイル アセンブラに渡され、単純なテキスト メッセージとしてコンシューマに送信されます。

簡単にするために、このスタイルシートでは名前空間のほとんどを削除し、接頭辞を変更しました。これにより、希望する出力が正確に生成されます。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:abcd="http://abcd.whatever.net/abcd/1.0.1" xmlns:info="http://info.sumthin.net/1.0.0" xmlns:wxyz="http://wxyz.widgetwonks.net/wxyz/3.0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:output method="text" />

<xsl:template match="abcd:Message">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="info:SpecialText">
    <xsl:text> </xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#010;</xsl:text>
</xsl:template>

<xsl:template match="wxyz:PersonSSN">
    <xsl:text> SSN: </xsl:text>
    <xsl:value-of select="substring(., 0, 4)"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="substring(., 4, 2)"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="substring(., 6, 4)"/>
    <xsl:text>&#010;</xsl:text>
</xsl:template>

<xsl:template match="*">
    <xsl:if test="string-length(normalize-space(text()))=0">
        <xsl:text>&#010;</xsl:text>
        <xsl:value-of select="local-name()"/>
    <xsl:text>&#010;</xsl:text>
    </xsl:if>

    <xsl:if test="not(string-length(normalize-space(text()))=0)">
        <xsl:text> </xsl:text>
        <xsl:value-of select="local-name()"/>: <xsl:value-of select="normalize-space(text())"/>
    </xsl:if>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()|@*">
    <xsl:if test="string-length(normalize-space(.)) != 0">
        <xsl:text>&#010;</xsl:text>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

BizTalk では、マップ グリッドの「カスタム XSL パス」プロパティでこのスタイルシートを参照しました。マップをテストすると、正しい出力が得られます。

しかし、この出力をターゲット スキーマにマップするにはどうすればよいでしょうか。 スタイルシートの出力は、多くの x0D x0A (cr / lf) が散りばめられた非常に長いテキスト ストリームです。BizTalk がスタイルシート出力の受け皿として許可するスキーマを考案できませんでした。

-マーク

4

2 に答える 2

2

私は最終的に次のように自分の質問を解決しました。

入力メッセージを通常の XML ドキュメントに変換するために、次の XSL スタイルシートを開発しました。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 ScriptNS0" version="1.0" xmlns:s0="http://abcd.whatever.net/abcd/1.0.1" xmlns:ScriptNS0="http://schemas.microsoft.com/BizTalk/2003/ScriptNS0" xmlns:info="http://info.sumthin.net/1.0.0" xmlns:wxyz="http://wxyz.widgetwonks.net/wxyz/3.0.3">

<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />

<xsl:template match="/">
    <Message>
        <xsl:apply-templates />
    </Message>
</xsl:template>
<!-- <xsl:template match="/s0:Message" /> -->
<xsl:template match="info:CaveatText">
    <xsl:element name="TextField">
        <xsl:text>  </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#010;</xsl:text>
    </xsl:element>
</xsl:template>

<xsl:template match="wxyz:PersonSSNID/wxyz:ID">
    <xsl:element name="TextField">
        <xsl:text>    SSN: </xsl:text>
        <xsl:value-of select="substring(., 0, 4)"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(., 4, 2)"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="substring(., 6, 4)"/>
        <xsl:text>&#010;</xsl:text>
    </xsl:element>
</xsl:template>

<xsl:template match="*">
    <xsl:if test="string-length(normalize-space(text()))=0">
        <xsl:element name="TextField">
            <xsl:text>&#010;</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>&#010;</xsl:text>
        </xsl:element>
    </xsl:if>

    <xsl:if test="not(string-length(normalize-space(text()))=0)">
        <xsl:element name="TextField">
            <xsl:text>    </xsl:text>
            <xsl:value-of select="local-name()"/>: <xsl:value-of select="normalize-space(text())"/>
        </xsl:element>
    </xsl:if>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()|@*">
    <xsl:if test="string-length(normalize-space(.)) != 0">
        <xsl:element name="TextField">
            <xsl:text>&#010;</xsl:text>
        </xsl:element>
    </xsl:if>
</xsl:template>

スタイルシートによって作成されたサンプル XML ドキュメントは、テキスト エディターで次のように表示されます。

<Message xmlns:{namespaces galore...}><TextField>
Message
</TextField><TextField>
HeaderArea
</TextField><TextField>    KeyText: PQ</TextField><TextField>
</TextField><TextField>    HeaderText: XYXY1010Z</TextField><TextField>
</TextField><TextField>
ResponseDataSection
</TextField><TextField>  **TEST**THIS RESPONSE IS FROM ABCD TEST SYSTEM.
</TextField><TextField>
PersonName
</TextField><TextField>    PersonGivenName: JACK</TextField><TextField>
</TextField><TextField>    PersonMiddleName: DANIEL</TextField><TextField>
</TextField><TextField>    PersonSurName: WEBBER</TextField><TextField>
</TextField><TextField>    PersonBirthDateText: 1975-01-31</TextField><TextField>
</TextField><TextField>
PersonAssignedIDDetails
</TextField><TextField>
PersonSSNID
</TextField><TextField>    SSN: 123-98-7654
</TextField><TextField>
PersonOtherID
</TextField><TextField>    ID: XT-01020304050</TextField><TextField>
</TextField><TextField>
PersonPhysicalDetails
</TextField><TextField>    PersonSexCode: M</TextField><TextField>
</TextField><TextField>    PersonRaceCode: W</TextField><TextField>
</TextField><TextField>
PersonAbcdID
</TextField><TextField>    ID: Z123456789</TextField><TextField>
</TextField><TextField>    ExpandedBirthDateSearch: 1</TextField><TextField>
</TextField><TextField>    ExpandedNameSearchIndicator: false</TextField><TextField>
</TextField><TextField>
VehicleID
</TextField><TextField>    ID: ASDFASDFASDFASDFA</TextField><TextField>
</TextField><TextField>    VehicleMakeText: DODG</TextField><TextField>
</TextField><TextField>
VehicleRegistrationPlateID
</TextField><TextField>    ID: ABC123</TextField><TextField>
</TextField><TextField>    IDJurisdictionText: AZ</TextField><TextField>
</TextField><TextField>
PrimaryResponse
</TextField><TextField>
PersonAlias
</TextField><TextField>
PersonAlternateName
</TextField><TextField>    PersonGivenName: JACK</TextField><TextField>
</TextField><TextField>    PersonMiddleName: ALLEN</TextField><TextField>
</TextField><TextField>    PersonSurName: DANIEL</TextField><TextField>
</TextField><TextField>
PersonAlternateName
</TextField><TextField>    PersonGivenName: JACKIE</TextField><TextField>
</TextField><TextField>    PersonSurName: DANIEL</TextField><TextField>
</TextField><TextField>
PersonAlternateName
</TextField><TextField>    PersonGivenName: JD</TextField><TextField>
</TextField><TextField>    PersonSurName: DANIEL</TextField><TextField>
</TextField><TextField>    PersonBirthDateText: 1967-01-01</TextField><TextField>
</TextField><TextField>    PersonBirthDateText: 1968-01-01</TextField><TextField>
</TextField><TextField>
PersonAssignedIDDetails
</TextField><TextField>
PersonSSNID
</TextField><TextField>    SSN: 234-00-0001
</TextField><TextField>
PersonSSNID
</TextField><TextField>    SSN: 345-00-0002
</TextField><TextField>
PersonSSNID
</TextField><TextField>    SSN: 456-00-0003
</TextField><TextField>
PersonSSNID
</TextField><TextField>    SSN: 567-00-0004
</TextField><TextField>
PersonOtherID
</TextField><TextField>    ID: XZ1234DE</TextField><TextField>
</TextField><TextField>
PersonOtherID
</TextField><TextField>    ID: YZE6241</TextField><TextField>
</TextField><TextField>
</Message>

上記の (...break to next line...) シーケンスは、スタイルシートの部分によって生成された CR/LF です。

上記のメッセージのスキーマは単純です。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xsi={application-specific namespace} xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
      <b:schemaInfo root_reference="Message" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="false" early_terminate_optional_fields="false" allow_message_breakup_of_infix_root="false" compile_parse_tables="false" standard="Flat File" />
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="Message">
    <xs:annotation>
      <xs:appinfo>
        <b:recordInfo structure="delimited" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:annotation>
          <xs:appinfo>
            <b:groupInfo sequence_number="0" />
          </xs:appinfo>
        </xs:annotation>
        <xs:element maxOccurs="unbounded" name="TextField" type="xs:string">
          <xs:annotation>
            <xs:appinfo>
              <b:fieldInfo sequence_number="1" justification="left" />
            </xs:appinfo>
          </xs:annotation>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Visual Studio のスキーマ エディター ツリーは、スキーマが実際にいかに単純であるかを示しています。

<Schema>                (Schema Editor Extensions is set to Flat File Extension)
    Message         (a record with no default properties)
        TextString      (a child element defined as unbounded)

BizTalk マッピング: 1. カスタム XSLT ファイルを使用して、上記のターゲット スキーマを使用してメッセージを生成するため、マップ上に Functoid はありません。2. Validate Map を使用して、カスタム拡張 XML ファイルを生成しました。3. カスタム拡張 XML とスタイルシート ファイルをプロジェクトに追加しました。4. マップ デザイン サーフェイスで、上記のファイルに移動して、カスタム拡張 XML およびカスタム XSL パス プロパティを設定します。

ターゲット スキーマを使用して、フラット ファイル アセンブラーを含む BizTalk パイプラインを作成しました。

ソリューションをデプロイしました。

新しい送信パイプラインを使用するように送信ポートを構成しました。

最終的な出力は、次のようなフラット ファイルです。

Message

HeaderArea
    TransactionKeyText: PQ
    TransactionHeaderText: XYXY1010Z

ResponseDataSection
  **TEST**THIS RESPONSE IS FROM ABCD TEST SYSTEM.

PersonName
    PersonGivenName: JACK
    PersonMiddleName: DANIEL
    PersonSurName: WEBBER
    PersonBirthDateText: 1975-01-31

PersonAssignedIDDetails

PersonSSNID
    SSN: 123-98-7654

PersonOtherID
    ID: XT-01020304050

PersonPhysicalDetails
    PersonSexCode: M
    PersonRaceCode: W

PersonAbcdID
    ID: Z123456789
    ExpandedBirthDateSearch: 1
    ExpandedNameSearchIndicator: false

VehicleID
    ID: ASDFASDFASDFASDFA
    VehicleMakeText: DODG

VehicleRegistrationPlateID
    ID: ABC123
    IDJurisdictionText: AZ

PrimaryResponse

PersonAlias

PersonAlternateName
    PersonGivenName: JACK
    PersonMiddleName: ALLEN
    PersonSurName: DANIEL

PersonAlternateName
    PersonGivenName: JACKIE
    PersonSurName: DANIEL

PersonAlternateName
    PersonGivenName: JD
    PersonSurName: DANIEL
    PersonBirthDateText: 1967-01-01
    PersonBirthDateText: 1968-01-01

PersonAssignedIDDetails

PersonSSNID
    SSN: 234-00-0001

PersonSSNID
    SSN: 345-00-0002

PersonSSNID
    SSN: 456-00-0003

PersonSSNID
    SSN: 567-00-0004

PersonOtherID
    ID: XZ1234DE

PersonOtherID
    ID: YZE6241
于 2012-07-11T21:08:49.200 に答える
0

単一の文字列要素で出力スキーマを定義します。次に、xsl 変換を変更して、出力をCDATAセクションにラップします。出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<MyOutputSchema>
<MyOutputString>
<![CDATA[<sender>Your output goes here</sender>]]>
</output-junk-drawer>
</MyOutputString>

CDATA では、無効な文字を xml メッセージに入れることができます。その後、BizTalk で出力を処理できます。

于 2012-07-10T19:45:52.547 に答える