0

わかりましたので、基本的に私が現在持っているものは次のとおりです。

XSD:

<?xml version="1.0"?>
<xsd:schema xmlns="test"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="test"
            elementFormDefault="qualified">

    <xsd:complexType name="fields">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="text">
                <xsd:complexType>
                    <xsd:attribute name="id" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="group">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="fields" type="fields"/>
                    </xsd:sequence>
                    <xsd:attribute name="id" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:choice>
    </xsd:complexType>

    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="fields" type="fields" minOccurs="0" maxOccurs="unbounded">
                    <xsd:key name="fieldId">
                        <xsd:selector xpath=".//*"/>
                        <xsd:field xpath="@id"/>
                    </xsd:key>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">

    <fields>
        <text id="asd"/>
        <text id="sdf"/>
        <group id="dfg">
            <fields>
                <text id="asd"/>
                <text id="sdf"/>
            </fields>
        </group>
    </fields>

</root>

重複する ID があるため、明らかに XML は XSD に従って有効ではありませんが、問題は、ID を独自のスコープでのみ検証することです。つまり、これは失敗するはずです。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">

    <fields>
        <text id="asd"/>
        <text id="asd"/>
    </fields>

</root>

これは合格するはずですが:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">

    <fields>
        <text id="asd"/>
        <group id="sdf">
            <fields>
                <text id="asd"/>
            </fields>
        </group>
    </fields>

</root>

明確にするために、XMLを解析するときに親IDを子IDに追加することを計画しているため、達成できるようにしたいので、ネストされたIDが同じスコープにないときに重複することは気にしません同様の結果:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test">

    <fields>
        <group id="eventA_time">
            <fields>
                <text id="hour"/>
                <text id="minute"/>
                <text id="second"/>
            </fields>
        </group>
        <group id="eventB_time">
            <fields>
                <text id="hour"/>
                <text id="minute"/>
                <text id="second"/>
            </fields>
        </group>
    </fields>

</root>
4

3 に答える 3

0

相対検索できるようにするには:

変化する:

<xsd:key name="fieldId">
    <xsd:selector xpath=".//*"/>
    <xsd:field xpath="@id"/>
</xsd:key>

に:

<xsd:key name="fieldId">
    <xsd:selector xpath="*"/>
    <xsd:field xpath="@id"/>
</xsd:key>
于 2013-03-22T14:03:20.310 に答える
0

必要に応じて正確に機能する回答が得られていないため、必要に応じて機能する XSD のバージョン バージョンを投稿しますが、一部の部分が重複しているため見苦しく見えます。

<?xml version="1.0"?>
<xsd:schema xmlns="test"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="test"
            elementFormDefault="qualified">

    <xsd:complexType name="fields">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="text">
                <xsd:complexType>
                    <xsd:attribute name="id" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="group">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="fields" type="fields" minOccurs="0" maxOccurs="unbounded">
                            <xsd:key name="innerFieldId">
                                <xsd:selector xpath="*"/>
                                <xsd:field xpath="@id"/>
                            </xsd:key>
                        </xsd:element>
                    </xsd:sequence>
                    <xsd:attribute name="id" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:choice>
    </xsd:complexType>

    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="fields" type="fields" minOccurs="0" maxOccurs="unbounded">
                    <xsd:key name="fieldId">
                        <xsd:selector xpath="*"/>
                        <xsd:field xpath="@id"/>
                    </xsd:key>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>
于 2013-08-21T14:59:02.467 に答える
0

セレクターを.//*から*(またはtext) に変更するだけです。

于 2013-03-22T14:36:59.687 に答える