2

次の(不十分に設計された?)XMLドキュメントを検討してください。

<?xml version="1.0" ?>
<command_result>
<param name="protocol_version" value="3"/>
<param name="player_state" value="navigator"/>
</command_result>

私がやりたいのは、value属性の実際の値に基づいて属性のデータ型を指定するXMLスキーマ(XSD形式)を作成することnameです。

例(擬似コード):

if (param name = "protocol_version") then (param value type="xs:integer")
if (param name = "player_state") then (param value type="xs:string")

ソースXMLを変更せずに、スキーマファイルにそのような条件付きステートメントを導入する方法はありますか?私はさまざまな解決策を見てきましたが、それらはすべて、何らかの方法でソースを変更する必要がありました(たとえば、xsi:typeの設定)。

編集

私の現在のスキーマ:

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="command_result">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="param" minOccurs="2" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="name" type="xs:string" use="required"/>
                        <!-- the following line needs to be modified somehow -->
                        <xs:attribute name="value" type="xs:string" use="optional"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
4

2 に答える 2

2

これは不可能だと思います。私が考えることができる唯一の方法は次のようなものです:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema"
    xmlns:tns="http://www.example.org/schema" elementFormDefault="qualified">

    <element name="command_result">
        <complexType>
            <sequence>
                <choice>
                    <element name="param" type="tns:protocol_version_type" />
                    <element name="param" type="tns:player_state_type" />
                </choice>
            </sequence>
        </complexType>
    </element>

    <complexType name="protocol_version_type">
        <attribute name="name" type="string" fixed="protocol_version" />
        <attribute name="value" type="integer" />
    </complexType>

    <complexType name="player_state_type">
        <attribute name="name" type="string" fixed="player_state" />
        <attribute name="value" type="string" />
    </complexType>
</schema>

しかし、どうやらこれは許可されていません。Eclipseでこのスキーマを検証すると、次のエラーが発生します。

  • cos-nonambig: "http://www.example.org/schema":paramおよび"http://www.example.org/schema":param(またはそれらの置換グループの要素)は、 "UniqueParticleAttribution"に違反しています。このスキーマに対する検証中に、これら2つのパーティクルにあいまいさが生じます。
  • cos-element-consistent:タイプ'#AnonType_command_result'のエラー。異なるタイプの「param」という名前の複数の要素がモデルグループに表示されます。

ご覧のとおり、同じ名前でタイプが異なる2つの要素を使用することはできません。しかし、これはXMLに必要なものです。

編集:次のような単純なスキーマを定義することもできません。

<element name="command_result">
    <complexType>
        <sequence>
            <element name="param" type="tns:proptocol_version_type" />
            <element name="param" type="tns:type2" />
        </sequence>
    </complexType>
</element>

このバージョンでは、no<choice>が指定されています。つまり、パラメーターは指定された順序で表示される必要があります。ただし、これによりエラーは削除されnonambigますが、element-consistentエラーは残ります。

于 2012-10-25T15:10:12.123 に答える
1

XSD 1.1バリデーターにアクセスできる場合は、条件付き型の割り当てを使用して、属性paramの値に基づいて要素に異なるバインディングを指定できます。name(バインドするさまざまな複合型は、value属性にさまざまな型を割り当てる点でほとんど異なります。)

しかし、一般的には正しいです。すべての要素に同じ要素名を使用することは、パラメーターを検証する試みを無駄にすることを犠牲にして、いくつかのことを単純化する設計上の選択です。

于 2012-10-25T19:54:47.197 に答える