2

私はこのような構造を持っています:

<EnumDefinitions>
    <EnumDefinition enumName="MyEnum1">
        <Values>
            <Value value="1" valueName="MyEnumValue1"/>
            <Value value="2" valueName="MyEnumValue2"/>
        </Values>
    </EnumDefinition>
    <EnumDefinition enumName="MyEnum10">
        <Values>
            <Value value="10" valueName="MyEnumValue10"/>
            <Value value="20" valueName="MyEnumValue20"/>
        </Values>
    </EnumDefinition>
</EnumDefinitions>
<EnumReference EnumName="MyEnum1" EnumValueName="MyEnumValue0"/>
<EnumReference EnumName="MyEnum1" EnumValueName="MyEnumValue10"/>

最初の EnumReference が有効であることを望みますが、2 番目の EnumReference は失敗するはずです。そのために、この一意のキー参照を試しました:

    <xs:keyref name="keyref_EnumNameValue" refer="unique_EnumNameValuePair">
        <xs:selector xpath="EnumReference"/>
        <xs:field xpath="@EnumName"/>
        <xs:field xpath="@EnumValueName"/>
    </xs:keyref>
    <xs:unique name="unique_EnumNameValuePair">
        <xs:selector xpath="EnumDefinitions/EnumDefinition"/>
        <xs:field xpath="@enumName"/>
        <xs:field xpath="Values/Value/@valueName"/>
    </xs:unique>

しかし、検証するとエラーが発生します:
ID 制約 'unique_EnumNameValuePair' のフィールド '{anonymous}' は、複数のメンバーを持つノード セットに評価されます。

これを行う可能性はありますか?

4

1 に答える 1

2

XSD の key/unique および keyref の使用: @EnumName 値の属性が既存の @enumName と一致すること、および @EnumValueName が @valueName と一致することを個別に確認できます。現在の EnumDefinition 構造 (オブジェクト指向からは理にかなっている) を考えると、両方を同時に達成することはできません。

XML を使用するプログラマーの使いやすさなど、値を EnumReference の @EnumName および @EnumValueName にコピーすることで、値を複製 (データベース用語で非正規化) することを選択できる理由がわかります。ただし、これは XML のパフォーマンスとサイズの点で悪影響があることを考慮する必要があります。特に、XML に多数の EnumReference がある場合...

リレーショナル モデルに非常によく似た別の方法として、EnumDefinition の Value 要素ごとに識別属性を単純に追加する方法があります (@aid など)。XML は次のようになります。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root>
    <EnumDefinitions>
        <EnumDefinition enumName="MyEnum1">
            <Values>
                <Value aid="a" value="1" valueName="MyEnumValue1"/>
                <Value aid="b" value="2" valueName="MyEnumValue2"/>
            </Values>
        </EnumDefinition>
        <EnumDefinition enumName="MyEnum10">
            <Values>
                <Value aid="c" value="10" valueName="MyEnumValue10"/>
                <Value aid="d" value="20" valueName="MyEnumValue20"/>
            </Values>
        </EnumDefinition>
    </EnumDefinitions>
    <EnumReference aid="a"/>
    <EnumReference aid="f"/>
</root>

制約付きの XSD は、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="EnumDefinitions">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element maxOccurs="unbounded" name="EnumDefinition">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="Values">
                                            <xsd:complexType>
                                                <xsd:sequence>
                                                    <xsd:element maxOccurs="unbounded" name="Value">
                                                        <xsd:complexType>
                                                            <xsd:attributeGroup ref="aid"/>
                                                            <xsd:attribute name="value" type="xsd:unsignedByte" use="required"/>
                                                            <xsd:attribute name="valueName" type="xsd:string" use="required"/>
                                                        </xsd:complexType>
                                                    </xsd:element>
                                                </xsd:sequence>
                                            </xsd:complexType>
                                            <xsd:key name="ValueUC">
                                                <xsd:selector xpath="Value"/>
                                                <xsd:field xpath="@value"/>
                                            </xsd:key>                                          
                                            <xsd:key name="ValueNameUC">
                                                <xsd:selector xpath="Value"/>
                                                <xsd:field xpath="@valueName"/>
                                            </xsd:key>                                          
                                        </xsd:element>
                                    </xsd:sequence>
                                    <xsd:attribute name="enumName" type="xsd:string" use="required"/>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                    <xsd:key name="EnumNameUC">
                        <xsd:selector xpath="EnumDefinition"/>
                        <xsd:field xpath="@enumName"/>
                    </xsd:key>                  
                </xsd:element>
                <xsd:element maxOccurs="unbounded" name="EnumReference">
                    <xsd:complexType>
                        <xsd:attributeGroup ref="aid"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PK">
            <xsd:selector xpath="EnumDefinitions/EnumDefinition/Values/Value"/>
            <xsd:field xpath="@aid"/>
        </xsd:key>
        <xsd:keyref name="FK" refer="PK">
            <xsd:selector xpath="EnumReference"/>
            <xsd:field xpath="@aid"/>
        </xsd:keyref>
    </xsd:element>
    <xsd:attributeGroup name="aid">
        <xsd:attribute name="aid" type="xsd:string" use="required"/>
    </xsd:attributeGroup>
</xsd:schema>

次のようになります。

ここに画像の説明を入力

その意味は:

  • あなたの相互参照はPK/FK制約に関してそこにあります
  • あなたの完全性は、UC サフィックス付きの制約によって保証されます。

構造について何もできない場合、残っている唯一の選択肢は、XSD 1.0 の上に Schematron を追加するか、XSD 1.1 プロセッサに移行することです (現時点ではそれほど普及していません。幸運にも、プラットフォーム間で優れた無料のプロセッサを見つけることができます)。

于 2013-09-26T13:31:29.183 に答える