2010-12-29 22 views
1

重要なことはわかりませんが、BizTalk 2009を使用してXMLを生成しています。XMLスキーマを使用してXMLインスタンスのデフォルト名前空間を指定する

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

私はこのようなXSDファイルがある場合:

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

しかし、私はそれがこのようなXMLファイルを作成したい:それはこのようなXMLファイルを作成します

<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> 

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

技術的には同等ですが、コンシューマー(ベンダーAPI)は実装されていません。彼らが期待するもの。

答えて

1

私は、スキーマではなくインスタンスを生成するソフトウェアに依存すると予想します。 XSDスキーマは、インスタンスを生成するためではなく、スキーマに対してXMLインスタンスを検証するために開発されました。したがって、XMLSchemaに明示的に存在する可能性は低いです。生成ツールは、しかし、要素があったという事実(UN)を使用する接頭辞をトリガするために

elementFormDefault="(un)qualified" 

を認定することがあります。スコープでは完全に

ないが、以下は、スキーマ設計のための読書の価値がある:http://www.xfront.com/HideVersusExpose.html

1

一つの方法は、名前空間なしスキーマを定義することです。ネームスペースのない新しく定義したスキーマにBizTalkスキーマをマップします。 BizTalkの観点からは、コンシューマとの実際の契約を表すスキーマが必要です。 (つまり名前空間を使用しない)また、BizTalkはnamespace#rootnodenameを使用してmessageTypesを定義します。この例では、このアプローチの可能性の欠点は、これが1に、このスキーマ(#rootnodename)の使用を制限するだろうしている2つのスキーマ

  1. somenamespace番号のsomerootnodename
  2. #somerootnodename

を持っているでしょうインスタンスをBizTalkグループに追加します。

1

これはBizTalkがこのXMLスキーマを操作する際のデフォルトの動作です。私が知る限り、これを変更する方法はありません。

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

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

Nic Bardenは、ブログの一部としてソースコードabout this hereを提供しています。ネームスペース自体を置き換えるのではなく、ネームスペースプレフィックスの置換を行うための基礎としてサンプルを使用できます。

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

+0

このようなカスタムパイプラインコンポーネントを設定する際に助けが必要な場合はお知らせください。 –

1

のBizTalk BTMがメッセージをマッピングするたびns0プレフィックスが付加されます。 ではありません。これはまだ有効なxmlですが、これはレガシーまたは不完全なxmlパーサーを持つパートナーにメッセージを送信する際に問題になる可能性があります。

接頭辞ns0を削除して、visual map to an .xslt mapからbtmを変更して、出力メッセージのns0をデフォルトの名前空間にすることができます。

あなたが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'answer hereと同様に)より一般的な解決法も可能であり、これは有用であり得る。要素からのすべてのプレフィックスを取り除くための送信ポートマップとして配置します。しかし、出力メッセージに複数のxmlnsがある場合は、注意が必要です。

関連する問題