1

問題があるかどうかはわかりませんが、BizTalk 2009 を使用して XML を生成しています。

生成された XML インスタンスがターゲット名前空間をデフォルトの名前空間として使用する必要があることを XML スキーマで指定する方法はありますか?

次のような xsd ファイルがあるとします。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/">
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType>
  </xs:element>
</xs:schema>

次のような XML ファイルを作成します。

<ns0:example value="something" xmlns:ns0="http://example.com/" />

しかし、次のような XML ファイルを作成する必要があります。

<example value="something" xmlns="http://example.com/" />

それらが技術的に同等であることは知っていますが、コンシューマー (ベンダー API) の実装が不十分であり、彼らが期待するものを提供したいと考えています。

4

4 に答える 4

1

1つの方法は、名前空間なしでスキーマを定義することです。BizTalkスキーマを、名前空間なしで新しく定義されたスキーマにマップします。BizTalkの観点からは、コンシューマーとの実際の契約を表すスキーマがあります。(つまり、名前空間なし)また、BizTalkはnamespace#rootnodenameを使用してmessageTypesを定義します。この例では、2つのスキーマがあります

  1. somenamespace#somerootnodename
  2. #somerootnodename

このアプローチで考えられる欠点は、このスキーマ(#rootnodename)の使用がBizTalkグループの1つのインスタンスに制限されることです。

于 2010-12-30T14:10:27.503 に答える
1

スキーマではなく、インスタンスを生成するソフトウェアに依存すると思います。XSD スキーマは、スキーマからインスタンスを生成するためではなく、スキーマに対して XML インスタンスを検証するために開発されました。そのため、XMLSchema に明示的に存在する可能性は低いです。ただし、生成ツールは、要素修飾された (修飾されていない) という事実を使用する場合があります。

elementFormDefault="(un)qualified" 

プレフィックスをトリガーします。

完全に範囲内ではありませんが、スキーマ設計のために以下を読む価値があります: http://www.xfront.com/HideVersusExpose.html

于 2010-12-29T22:41:57.220 に答える
1

これは、この XML スキーマを操作する BizTalk の既定の動作であり、私の知る限り、これを変更する組み込みの方法はありません。

ただし、実際に必要なのは、送信メッセージが BizTalk で使用される形式よりもクリーンで自由度の高い形式に準拠することです。これを行うには、カスタム パイプライン コンポーネント (およびカスタム送信パイプライン) を使用して、BizTalk を離れる前に送信メッセージを処理します。

BizTalk の外部にメッセージを送信する際に、名前空間のプレフィックスを変更するという考え方です。変換は、送信パイプラインの処理中に発生します。

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

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

于 2011-01-03T11:18:58.863 に答える
0

ns0BizTalk btm がメッセージをマップするたびに、プレフィックスが追加されます。これはまだ有効な xml であるため問題にはなりませんが、レガシーまたは不完全な xml パーサーを使用してパートナーにメッセージを送信する場合に問題になる可能性があります

btm をビジュアル マップから map に変更ns0することで、プレフィックスを削除し、代わりに出力メッセージで既定の名前空間を作成できます。ns0.xslt

たとえば、マップを xslt に変換したら、xslt を次のように変更します。

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl s0"
                version="1.0"
                xmlns:ns0="http://targetns"
                xmlns:s0="http://sourcens"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="s0:FromRoot" />
  </xsl:template>
  <xsl:template match="s0:FromRoot">
    <ns0:ToRoot>
      <xsl:for-each select="s0:FromElement">
        <ns0:ToElement>
          <xsl:value-of select="text()"/>
        </ns0:ToElement>
      </xsl:for-each>
    </ns0:ToRoot>
  </xsl:template>
</xsl:stylesheet>

に:

<?xml version="1.0" encoding="utf-16"?>
<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 s0"
                version="1.0"
                xmlns="http://targetns"
                xmlns:s0="http://sourcens"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="s0:FromRoot" />
  </xsl:template>
  <xsl:template match="s0:FromRoot">
    <ToRoot>
      <xsl:for-each select="s0:FromElement">
        <ToElement>
          <xsl:value-of select="text()"/>
        </ToElement>
      </xsl:for-each>
    </ToRoot>
  </xsl:template>
</xsl:stylesheet>

つまり、デフォルトの xmlns を変更してから、ns0 プレフィックスを自動的に削除します。

より一般的なソリューションも可能です (たとえば、ここでの Firras の回答に似ています)。これは、要素からすべてのプレフィックスを削除する送信ポート マップとして配置するなどに役立ちます。ただし、出力メッセージに複数の xmlns がある場合は注意が必要です。

于 2012-09-01T07:36:09.337 に答える