1

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

変換の詳細を提供するために、メタデータを追加できるメカニズムで 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 スタイルシートにメタデータを含める方法はありますか?

4

2 に答える 2

2

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

変更された「データモデル」語彙のインスタンスは、次のようになります。

<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スタイルシート自体に新しいプロパティを含めないことをお勧めします(これは、たとえば、これをグローバルのコンテンツとして定義するなど、完全に可能です<xsl:variable>)。これらの新しいプロパティを、個別の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>

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

乾杯、

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

于 2008-11-13T04:38:02.373 に答える
1

"それについてどう思いますか?"

2 つの3 つのこと。

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

  2. レガシー メタデータを修正できない場合、XML 表記ではない 2 番目のメタデータ セットを維持するのは誰でしょうか? メタデータの変更を行う二重入力は誰が行いますか? 誰かがフォロースルーする確率は?

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

于 2008-11-11T12:12:32.987 に答える