0

BizTalk 2009に、一部のデータをXMLドキュメントに変換して別のシステムに送信するマップがあります。ターゲットスキーマには、xml:lang属性を持ついくつかの要素が含まれています。BizTalkはそれらをとして生成しns1:langます。ターゲットシステムでは、プレフィックスxmlを使用する必要があります。

これは、BizTalkが実行していることを示す簡単な例です。

sample.xsd

<xs:schema targetNamespace="http://example.com/"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="common.xsd"
             namespace="http://www.w3.org/XML/1998/namespace" />
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute ref="xml:lang" />
    </xs:complexType>
  </xs:element>
</xs:schema>

common.xsd

<xs:schema xmlns:xml="http://www.w3.org/XML/1998/namespace"
           targetNamespace="http://www.w3.org/XML/1998/namespace"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="lang" type="xs:language" />
</xs:schema>

マップ出力の例

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />

xmlプレフィックスを使用するようにBizTalkを説得する方法はありますか?

4

3 に答える 3

4

私の知る限り、これを達成するための組み込みの方法はありません。

ただし、私が見ることができる2つの解決策があります。

カスタム XML スタイルシートを使用する

マップを右クリックして、生成された xsl スタイルシートを注意深く見ると、次のような XML 名前空間宣言が表示されます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns1="http://www.w3.org/XML/1998/namespace"
                ...
                >
...
<xsl:attribute name="ns1:lang">
...

これは BizTalk マッパーの既定の動作であり、何もすることはできません。ただし、生成された XSLT の抽出に進み、これをマップのバックエンドとして使用する場合は、この宣言を変更して、期待される結果に一致させることができます。

  • まず、スタイルシートをプロジェクトの場所にコピーします。
  • このスタイルシートをファイルとして BizTalk プロジェクトに含めます
  • 名前空間の宣言と一致する属性接頭辞が正しくなるように、スタイルシートを更新してください。

結果の xsl スタイルシートは次のようになります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xml="http://www.w3.org/XML/1998/namespace"
                ...
                >
...
<xsl:attribute name="xml:lang">
...

これで、このカスタム スタイルシートをマップのバックエンドとして使用できます。

  • Visual Studio でマップを開きます。
  • BizTalk デザイナー画面の空白の任意の場所をクリックします。
  • マップ プロパティで、カスタム XSL パスを見つけて、カスタム スタイルシートの場所を指定します。

カスタム BizTalk マッパー XSL パス

カスタム パイプライン コンポーネントを使用する

あなたが求めているのは、メッセージがターゲット受信者にとって正しいということです。そのため、BizTalk の外部にメッセージを送信する際に、問題のある名前空間プレフィックスを変更することを考えています。変換は、送信パイプラインの処理中に発生します。

Nic Bardenはブログで、これに関するソース コードを提供しています。名前空間自体を置き換えるのではなく、名前空間プレフィックスの置き換えを実行するための基礎として、彼のサンプルを使用できます。

彼が作成したストリーミング パイプライン コンポーネントの開発に関する一連の投稿をすべてチェックすることを強くお勧めします。Nic は、堅牢でエンタープライズ クラスのパイプライン コンポーネントを作成するために必要なすべてを説明する、広範かつ徹底的な作業を行いました。

于 2011-01-03T10:52:41.457 に答える
1

それを実行してすべてを機能させる簡単な方法は、このようにスキーマ定義の先頭に名前空間宣言を追加することです。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xml="http://www.w3.org/XML/1998/namespace">
  <xs:import schemaLocation="xml.xsd" namespace="http://www.w3.org/XML/1998/namespace" />
于 2015-04-14T03:56:35.647 に答える
0

マキシムの提案に加えて、私が見つけた他の可能性は次のとおりです。

それを無視して、ベンダーの API がそれを取ることを願っています。

これはうまくいかないと思います。マップをテストすると、BizTalk で次のエラーが表示されます。

Output validation error: Prefix 'ns1' cannot be mapped to namespace name reserved for "xml" or "xmlns".

こんにちは、BizTalk!? ns1 を使用することに決めたのはあなたです。私にそれについて文句を言わないでください !

出力を強制するには、XSL ベースのスクリプト Functoid を使用します。

これは、BizTalk フォーラムで受け取った提案に基づいています。Functoid によって xml:lang 属性に置き換えられるダミー属性を使用するように、出力スキーマをごまかす必要があります。

検索/置換式を追加する

マップを呼び出すオーケストレーションを取得し、ベンダーに送信する XML を取得する式をその後に追加し、検索/置換正規表現を実行して名前空間プレフィックスを修正します。

于 2011-01-03T20:17:35.073 に答える