1

名前が processNameの 1 つの要素と、それ以外の場合は任意の要素を子として許可するように xsd を調整しようとしています。
そのために、小さなcomplexTypeを用意しました。

<complexType name="configType">
<!--    <xsd:choice> -->
    <sequence>
        <element name="processName" type="string" maxOccurs="1"/>
        <xsd:any minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
<!--    </xsd:choice> -->
</complexType>

私の問題は、 processNameの他の発生を妨げないことです:

<config>
    <process:processName></process:processName>
    <test></test>
    <test2></test2>
    <process:processName></process:processName>
</config>

選択を使用しようとしましたが、検証エラーで終了します

processName および WC[##any] (またはそれらの置換グループの要素) は、「固有粒子属性」に違反しています。このスキーマに対する検証中に、これら 2 つの粒子に対してあいまいさが生じます。

このルールは、XSD v 1.1 ではアクティブではなくなりました。しかし、私の XML ファイルはすべてバージョン 1.0 です。しかし、古いファイルを新しいスキーマ バージョンでチェックすることはできないと思います。

この特定の例は、XML スキーマ バージョン 1.1 の Unique Particle Attribute 制約に違反しなくなりました。この制約は、要素が要素粒子とワイルドカードの両方に一致する場合、要素粒子が優先されるということで曖昧さをなくしています。ただし、UPA 制約自体はバージョン 1.1 のままです。

processNameの発生を 1 回だけ強制することは可能ですか?
ヒントをありがとう。

編集:
ColdFusion からのいくつかのヒントを使用して、あいまいな宣言を許可する XSD1.1 スキーマを作成することができました。

<sequence>
    <element name="processName" type="string" minOccurs="0" maxOccurs="1"/>
    <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</sequence>

複数回のprocessNameを持つことが可能になりました。

4

2 に答える 2

1

あなたが書いた:

このルールは XSD v 1.1 ではアクティブではなくなりましたが、私の XML ファイルはすべてバージョン 1.0 です。しかし、古いファイルを新しいスキーマ バージョンでチェックすることはできないと思います。

XML のバージョンは、XML スキーマのバージョンとは関係ありません。(参照: どの XML バージョンを使用するか? )

XML 1.0 が現在主流であり、XML スキーマ v1.1 も同様です。

v1.1 スキーマが適切に機能する場合は、それを使用してください。

XSD 1.0 でのスキーマの制約をどのように表現するかについては、私にもわかりません。おそらく、仕方がありません。(そうしないと、XSD v1.1 でその UPA 制限が緩和されません)。

<xs:any>、特定の名前空間に対してのみ制約できます (これらの「その他の」要素が とは異なる名前空間からのものである場合<processName>、それは可能です)。そうでなければ、唯一の方法は、それらの他の要素がどれであるかを正確に指定することだと思います.

于 2013-08-27T01:09:24.640 に答える