質問

レガシシステムの独自のデータモデルを変換して、XSDスキーマを定期的に作成しています。これはかなりうまくいきます。ただし、レガシーシステムでは、データタイプ(intstringなど)など、パラメーターの非常に基本的な属性のみを指定できます。

メタデータを追加して変換の詳細を提供できるメカニズムでXSL変換を強化したいと思います。 XPathに属性を割り当てるJavaプロパティ表記法のようなものを考えました。

次の例を想像してください:

レガシーシステムデータモデル(実際にはそれはきちんとしているが、デモンストレーションの目的に最適)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

メタデータ

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

結果のXSDスキーマ

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

それについてどう思いますか?メタデータをXSLスタイルシートに含める方法はありますか?

役に立ちましたか?

解決

最善の解決策は、不足しているメタデータを追加してレガシーデータを変更することです。

変更された&quot; datamodel&quot;のインスタンス語彙は次のようになります:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

新しいプロパティを別のネームスペースに置くと、すでにサポートされているプロパティと簡単に区別できます。通常、名前空間で属性を使用することは推奨されないため、これを回避する場合は、属性の代わりに(新しい名前空間に属する)サブ要素を使用できます。新しい属性を別のネームスペースに属するようにすると、レガシースキーマの検証でそれらが拒否されない場合があります。

何らかの理由でレガシーデータを変更できない場合は、XSLTスタイルシート自体に新しいプロパティを含めないことをお勧めします(たとえば、これをグローバルな< code>&lt; xsl:variable&gt; )、ただし、これらの新しいプロパティを個別のXMLファイルまたは1つ以上のXMLファイルのセットとして提供します。

XSLT document()関数を使用して、XSLT変換中に任意のXMLファイルに動的にアクセスできます。新しいプロパティを含むXMLファイルのインスタンスは次のようになります。

<newProperties xmlns:nm="my:new.meta">
    <customer>
        <firstName nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age nm:nillable="true"/>
    </customer>
</newProperties>

これがお役に立てば幸いです。

乾杯、

ディミトレ・ノヴァチェフ

他のヒント

&quot;それについてどう思いますか?&quot;

2 3つのこと。

  1. レガシーメタデータを修正します。それはXMLです。それに物を追加します。必要に応じて名前空間を追加します。

  2. レガシーメタデータを修正できない場合、XML表記ではないメタデータの2番目のセットを誰が管理しますか?メタデータを変更する二重記入を行うのは誰ですか?フォローしている人のオッズはどれくらいですか?

  3. 追加のメタデータには、疑似XPathではなくXMLを使用することを検討してください。一貫性は、あなたが何が起こっているかを理解した後に来る人々を助けます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top