xsd ограничение по значению

Народ, нужна ваша помощь в следующем. мой xml выглядит так:

    <Images>
    <Image ImageId="1" ImageFile="a.png"/>
    <Image ImageId="2" ImageFile="b.png"/>
    <Image ImageId="3" ImageFile="c.png"/>
    <Image ImageId="4" ImageFile="d.png"/>
    <Image ImageId="5" ImageFile="e.png"/>
</Images>
<Banners>
    <Banner BannerId="1" ImageId="2"/>
    <Banner BannerId="43" ImageId="3"/>
    <Banner BannerId="45" ImageId="4"/>
    <Banner BannerId="596" ImageId="2"/>
    <Banner BannerId="6" ImageId="2"/>
</Banners>

мне нужно создать xsd, который ограничит значения ImageId в элементах баннера теми, которые появляются в изображениях. Является ли это возможным?


person atarno    schedule 14.03.2013    source источник


Ответы (1)


Да; компоненты XML-схемы, которые вам нужны, это key/keyref:

<?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="sample">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Images">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element maxOccurs="unbounded" name="Image">
                                <xsd:complexType>
                                    <xsd:attribute name="ImageId" type="xsd:unsignedByte" use="required"/>
                                    <xsd:attribute name="ImageFile" type="xsd:string" use="required"/>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="Banners">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element maxOccurs="unbounded" name="Banner">
                                <xsd:complexType>
                                    <xsd:attribute name="BannerId" type="xsd:unsignedShort" use="required"/>
                                    <xsd:attribute name="ImageId" type="xsd:unsignedByte" use="required"/>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="PK">
            <xsd:selector xpath="Images/Image"/>
            <xsd:field xpath="@ImageId"/>
        </xsd:key>
        <xsd:keyref name="FK" refer="PK">
            <xsd:selector xpath="Banners/Banner"/>
            <xsd:field xpath="@ImageId"/>       
        </xsd:keyref>
    </xsd:element>
</xsd:schema>

Пример сообщения об ошибке:

The key sequence '8' in Keyref fails to refer to some key.
xsd-restriction-by-value.xml is XSD 1.0 invalid.
person Petru Gardea    schedule 14.03.2013
comment
спасибо, это работает. моя первоначальная ошибка заключалась в попытке использовать ./Banner и ./Image вместо полного пути. - person atarno; 15.03.2013