2017-01-05 8 views
1

XMLの学習曲線を上って、list要素を使用して検証問題を説明しました。私は、特定のkeyの値をメンバーとして許可するlist要素を作成しようとしています。LIST要素の導出

以下のモデルを作成するのに役立つ小さなコンテキスト。 にはそれぞれユニークなNAMEという種類があります。 NAME形式は、simpleType要素のパターンによって制限されます。 REFDESTypeNAMEの一意性は、キーsource_keyによって適用されます。

このsource_keyを生産的に使用して関連するデータフィールドに入力制限を提供しようとする試みは、まだ意図した結果をもたらさない。 POWERSOURCEは、これらの使用目的フィールドの1つであり、要素MODEの子です。その目的は、POWERSOURCEが1つまたは複数のMSXML解析に失敗する可能性があることです。 {OK、笑いを浮かべて歓迎します。}はい、これはサードパーティのライブラリを持たないスタンドアロンのEXCEL 2013ベースのアプリ向けに開発されています。

私にはとにかく眩しいと思われる1つの問題は、REFDESTypeの木にPOWERSOURCEの2方向からです。 NAMEを通り過ぎ、再びREFDESListを通過します。うーん

解析エラー:keyref 'GEN-1 GEN-2 GEN-3 GEN-4' アイデンティティ制約 '{http://www.myCo.com} source_key' のkeyに解決しません。

確かに、listを使用するのは明らかです。さて、もし私がこの方法がどうしてうまくいかないか理解できれば。代替アプローチも歓迎されます。

ELA.XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.myCo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ela="http://www.myCo.com" elementFormDefault="qualified"> 
    <xs:element name="DB"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="ela:SOURCE" maxOccurs="unbounded"/> 
       <xs:element ref="ela:MODE" minOccurs="6" maxOccurs="13"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:key name="source_key"> 
      <xs:selector xpath="ela:SOURCE"/> 
      <xs:field xpath="ela:NAME"/> 
     </xs:key> 
    </xs:element> 
    <xs:element name="SOURCE" type="ela:SOURCEType"/> 
    <xs:element name="NAME" type="ela:REFDESType"/> 
    <xs:element name="MODE" type="ela:MODEType"/> 
    <xs:element name="POWERSOURCE" type="ela:REFDESList"> 
     <xs:keyref name="powersource_ref" refer="ela:source_key"> 
      <xs:selector xpath="."/> 
      <xs:field xpath="."/> 
     </xs:keyref> 
    </xs:element> 
    <xs:simpleType name="REFDESList"> 
     <xs:list itemType="ela:REFDESType"/> 
    </xs:simpleType> 
    <xs:simpleType name="REFDESType"> 
     <xs:restriction base="xs:string"> 
      <xs:minLength value="2"/> 
      <xs:maxLength value="9"/> 
      <xs:pattern value="[A-Z]([A-Z0-9;&#32;&#45;]){1,8}"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="MODEType"> 
     <xs:sequence> 
      <xs:element ref="ela:POWERSOURCE"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="SOURCEType" mixed="true"> 
     <xs:sequence> 
      <xs:element ref="ela:NAME"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

sample.xmlに:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ela:DB xmlns:ela="http://www.myCo.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.myCo.com ELA.xsd"> 
    <ela:SOURCE> 
     <ela:NAME>GEN-1</ela:NAME> 
    </ela:SOURCE> 
    <ela:SOURCE> 
     <ela:NAME>GEN-2</ela:NAME> 
    </ela:SOURCE> 
    <ela:SOURCE> 
     <ela:NAME>GEN-3</ela:NAME> 
    </ela:SOURCE> 
    <ela:SOURCE> 
     <ela:NAME>GEN-4</ela:NAME> 
    </ela:SOURCE> 
    <ela:MODE> 
     <ela:POWERSOURCE>GEN-1 GEN-2 GEN-3 GEN-4</ela:POWERSOURCE> 
    </ela:MODE> 
</ela:DB> 

答えて

1

あなたのkeyrefは、全体としての値(つまり「GEN-1 GEN-2 GEN-3 GEN-であることを述べています4 ")は、キー値と一致しなければなりません。

リスト内の各項目が整合性制約を個別に満たさなければならないIDREFSタイプと同じ効果を達成する方法はないと思います。これにはXSD 1.1アサーションを使用する必要があります。

1

個々のリストメンバーをキーと照合することはできません。完全なリストのみを照合することはできません。 XMLファイルでは、<ela:POWERSOURCE>の値は4つの項目のリストです。ただし、その値に一致する<ela:NAME>はありません(同じ4項目のリスト)。

スキーマのもう1つの問題は、xs:keyrefが祖先で定義されているxs:keyを参照していることです。これは許可されていません。参照されるキーは、同じ要素宣言、または要素の子孫で定義されている必要があります。キーとkeyref

現代のソリューションは、キー制約と可能な解決策は、各リスト項目のための専用の要素を使用することです:スキーマで

<ela:MODE> 
    <ela:POWERSOURCE> 
     <ela:NAME>GEN-1</ela:NAME> 
     <ela:NAME>GEN-2</ela:NAME> 
     <ela:NAME>GEN-3</ela:NAME> 
     <ela:NAME>GEN-4</ela:NAME> 
    </ela:POWERSOURCE> 
</ela:MODE> 

、あなたは、単ににREFDESListタイプを変更することができます:

<xs:complexType name="REFDESList"> 
    <xs:sequence> 
     <xs:element ref="ela:NAME" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

とキーと同じ要素にkeyrefを移動:

<xs:element name="DB"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="ela:SOURCE" maxOccurs="unbounded"/> 
      <xs:element ref="ela:MODE" minOccurs="1" maxOccurs="13"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:key name="source_key"> 
     <xs:selector xpath="ela:SOURCE"/> 
     <xs:field xpath="ela:NAME"/> 
    </xs:key> 
    <xs:keyref name="powersource_ref" refer="ela:source_key"> 
     <xs:selector xpath="ela:MODE/ela:POWERSOURCE/ela:NAME"/> 
     <xs:field xpath="."/> 
    </xs:keyref> 
</xs:element> 

レガシーIDを有する溶液とIDREFS

挙げ@Michael Kayとして、xs:IDxs:IDREFSタイプを使用してレガシー機構 があります。

<xs:simpleType name="REFDESType"> 
    <xs:restriction base="xs:ID"> <!-- Restrict legacy ID type --> 
     <xs:minLength value="2"/> 
     <xs:maxLength value="9"/> 
     <xs:pattern value="[A-Z]([A-Z0-9;&#32;&#45;]){1,8}"/> 
    </xs:restriction> 
</xs:simpleType> 

は今、<ela:NAME>要素の値は、IDのサブタイプである、との値によって参照することができます、あなたのスキーマに適用xs:keyxs:keyref要素を削除し、REFDESTypeのスーパータイプを置き換えるために IDREFまたはIDREFSを入力してください:

<xs:element name="POWERSOURCE" type="xs:IDREFS"/> <!-- List of ID references --> 

調整されたXSDは、使用されたツールが標準に準拠している場合、XMLファイルを検証する必要があります。しかしなお、標準recommends that ID and IDREFS are only used for attributes、すなわち

<ela:NAME id="GEN-1"/> 
... 
<ela:POWERSOURCE ref="GEN-1 GEN-2 GEN-3 GEN-4"/> 
+0

TY @Mayerと@Michaelケイセット。 ListObjectテーブルへのインポート/エクスポート時のExcel固有のmaxOccursの制限のために、私はマルチPOWERSOURCE要素を改善することを試みていました。つまり、それらを単一の要素 'list'に集約し、モデルの残りの部分に適用します。悲しいかな、XSD 1.0バージョンに拘束されるという制約。一口... – IronX

+0

私は私のOPの追加レビューが必要だと思います。理由は、W3Cサイトの['list'] [1]の例は、USStatesという名前の' list'の実装における一意の値の使用を具体的に示しているということです。 W3Cの例のUSStatesリストは、USState要素から派生しています。この要素には、50個の一意の状態略語がすべて列挙されます。 [1]:http://www.w3.org/TR/xmlschema-0/#ListDt – IronX

+0

あなたのご意見が分かりますか分かりません。 リストには、スペースで区切られた項目が含まれています。 リスト項目は単純な種類であり、そのように制限することができます。 これは、キー制約または一意性とは関係ありません。 キー制約は、個々のリスト項目ではなく、* whole *リストにのみ一致します。 – Meyer

0

@Michaelケイ、@Meyer。

私は何か欠けている(をし、それは私がだったことが判明した)場合を除き、それはIDREFSの提案は、すべての後にMSXMLで動作しないことが判明(あなたは単純内のリスト要素を処分しない限り、完全に )。 XMLSpy開発ツールでうまく動作しますが、スキーマがSchemaCollection.Addメソッド経由でExcel 2013に読み込まれると、このエラーがスローされます。

List datatype must be derived from an atomic datatype or a union of atomic datatypes.

このエラーメッセージは、

The name of a built-in data type or simpleType element defined in this schema (or another schema indicated by the specified namespace). The simpleType element containing the list element is derived from the simple type specified by the list value. The list value must be a qualified name (QName). The use of the simpleType element child and the itemType attribute is mutually exclusive.

が、私は私のスキーマは、LISTの要件を満たしていると信じて...ある itemTypeのための「報告」MSXML LIST要素の定義に矛盾しているようです。 "SOURCENAMEType"は、LISTシンプルタイプ "IDREFListType"が導出される元のシンプルタイプです。 ORIGINAL XML:を私はこれを再度書いている汎用のXMLとしてそれができるように:実際に動作 AZ {1,8} "/>

<xs:simpleType name="IDREFListType"> 
    <xs:list itemType="xs:IDREFS"/> 
</xs:simpleType> 

<xs:element name="SOURCELIST" type="ela:IDREFListType"/> 

改訂版xs:list要素が実際にどのように機能するのかにかかわらず、myLISTTypeにはxs:list要素が含まれていないことに注意してください。コレクション要素MSXMLでは、リスト要素を宣言することで、W3Cに準拠しないリストのパーサーとしてパーザがそれを解釈しないようにすることは明らかです。 (広範なテストに基づいた私の仮定)問題は、どこにも書かれていない、この小さなニュアンスが見つかりません。 Augh !!!

<xs:schema targetNamespace="http://www.myCo.com" xmlns:pfx="http://www.myCo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="IDNAME" type="pfx:myIDNAMEType" maxOccurs="unbounded"/> 
       <xs:element name="myLIST" type="pfx:myLISTType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="myIDNAMEType"> 
     <xs:restriction base="xs:ID"> 
      <xs:pattern value="[A-Z]([A-Z0-9;&#32;&#45;]){1,8}"/> 
      <!-- pattern for illustrative purposes only, not req'd --> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="myLISTType"> 
     <xs:restriction base="xs:IDREFS"> 
      <xs:minLength value="1"/> 
      <xs:maxLength value="4"/> 
      <!-- min/max for illustrative purposes only, not req'd --> 
      <!-- defines limits for # of members permitted in list --> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

XML:

<pfx:IDNAME>BOGUS-1</pfx:IDNAME> 
<pfx:IDNAME>BOGUS-2</pfx:IDNAME> 
<pfx:IDNAME>BOGUS-3</pfx:IDNAME> 
<pfx:IDNAME>BOGUS-4</pfx:IDNAME> 
<pfx:myLIST>BOGUS-1 BOGUS-2 BOGUS-3 BOGUS-4</pfx:myLIST> 

検証は、(図示するように制限ファセットに基づいて)次のエラーを検出する:リストのメンバーの

  • 数量超え。最小/最大制限が正当メンバーとして認識されない
  • リスト部材ファセット参照、例えば、BOGUS-9ない IDNAMEでは
関連する問題