1

XSD ファイルを次のように定義したい場合:

<state id="1" name="S1">
<state id="2" name="S2">
<state id="3" name="S3">

<transition fromState="1" toState="2">

fromStateXSD ファイルで属性を制限し、要素toStateで宣言された値のみを取得するにはどうすればよいですか?stateid

XSD 定義にはそのような機能はないようですが、Android XML レイアウトを使用すると、Eclipse Android XML エディターはコンテンツ アシスト リストに入れる ID を何らかの形で認識します。

4

1 に答える 1

2

推奨される方法は、unique/key/keyref コンストラクトを使用することです。この変更された XML を考慮して (ドキュメント要素を追加するため):

<Document>
    <state id="1" name="S1"/>
    <state id="2" name="S2"/>
    <state id="3" name="S3"/>

    <transition fromState="1" toState="2"/>
</Document>

ここに画像の説明を入力

この 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="Document">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="state">
                    <xsd:complexType>
                        <xsd:attribute name="id" type="xsd:unsignedByte" use="required"/>
                        <xsd:attribute name="name" type="xsd:string" use="required"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="transition">
                    <xsd:complexType>
                        <xsd:attribute name="fromState" type="xsd:unsignedByte" use="required"/>
                        <xsd:attribute name="toState" type="xsd:unsignedByte" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PKStates">
            <xsd:selector xpath="state"/>
            <xsd:field xpath="@id"/>
        </xsd:key>
        <xsd:keyref name="FKTransitionToStatesFrom"  refer="PKStates">
            <xsd:selector xpath="transition"/>
            <xsd:field xpath="@fromState"/>
        </xsd:keyref>
        <xsd:keyref name="FKTransitionToStatesTo" refer="PKStates">
            <xsd:selector xpath="transition"/>
            <xsd:field xpath="@toState"/>
        </xsd:keyref>
    </xsd:element>
</xsd:schema>

ここに画像の説明を入力

図を見ると、セレクターがどのように機能するかをより簡単に視覚化できます。これを使用することに決め、XSD にターゲット名前空間があり、要素や属性を修飾する場合は、必ず targetNamespace のプレフィックスを宣言し、XPath でそのプレフィックスを使用してください。

一般に、関連する XSD に基づいて XML 編集を容易にするために、この情報 (キー/キー参照) を使用してコンテンツ アシスト リストを作成する方法を知っているツールは多くありません。通常、特殊な性質を持つエディターは、XSD のみからの推論ではなく、ハードワイヤードの実装に基づいてそれを行います。

于 2013-04-03T13:13:31.323 に答える