Проверка и определение рефлексивной схемы - PullRequest
0 голосов
/ 27 марта 2012

Может кто-нибудь помочь мне в том, как определить xsd для этого.

Я также хочу применить проверку на уровне схемы, чтобы на основе заданного значения атрибута отображались только соответствующие дочерние теги (возвратные на основе значения атрибута).

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <sample-tag type="one">
    <one></one>
</sample-tag>
<sample-tag type="two">
    <two></two>
</sample-tag>
<sample-tag type="three">
    <three></three>
</sample-tag>
<sample-tag type="onetwo">
    <one></one>
    <two></two>
</sample-tag>
</root>

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Если я возьму ваш пример XML в качестве приблизительного значения, то, строго говоря, есть один способ добиться желаемого эффекта: он называется xsi: type . Мне лично не нравится xsi: type, поэтому я считаю этот ответ скорее академическим упражнением.

Если вы согласны с этим XML:

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <sample-tag xsi:type="one"> 
        <one></one> 
    </sample-tag> 
    <sample-tag xsi:type="two"> 
        <two></two> 
    </sample-tag> 
    <sample-tag xsi:type="three"> 
        <three></three> 
    </sample-tag> 
    <sample-tag xsi:type="onetwo"> 
        <one></one> 
        <two></two> 
    </sample-tag> 
</root> 

... тогда этот XSD даст вам то, что вы хотите:

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="sample-tag" type="sample-tag"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="sample-tag" abstract="true"/>
    <xsd:complexType name="one">
        <xsd:complexContent>
            <xsd:extension base="sample-tag">
                <xsd:sequence>
                    <xsd:element name="one"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="two">
        <xsd:complexContent>
            <xsd:extension base="sample-tag">
                <xsd:sequence>
                    <xsd:element name="two"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="three">
        <xsd:complexContent>
            <xsd:extension base="sample-tag">
                <xsd:sequence>
                    <xsd:element name="three"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="onetwo">
        <xsd:complexContent>
            <xsd:extension base="sample-tag">
                <xsd:sequence>
                    <xsd:element name="one"/>
                    <xsd:element name="two"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

Если xsi: type вне вопроса и XSD 1.1, то вам нужно ответить @ Pangea.

0 голосов
/ 27 марта 2012

Невозможно с XSD. Проверьте, возможно ли это с Schematron .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...