XML Schema需要具有可选相关值的显式值

时间:2016-06-26 18:55:55

标签: xml xsd

我想构建一个XSD来验证下面简化的XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<Ldf
  xmlns="http://www.en-argentina.com.ar/ldf"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.en-argentina.com.ar/ldf
  http://www.en-argentina.com.ar/ldf/ldf8.xsd">
  <Languages>
    <LanguageDetails>
      <Language>
        <name>French</name>
      </Language>
    </LanguageDetails>
  </Languages>
  <Languages>
    <LanguageDetails>
      <Language>
        <name>English</name>
        <Dialect>American English</Dialect>
        <Dialect>British English</Dialect>
      </Language>
    </LanguageDetails>
  </Languages>
</Ldf>

在XSD中,我想对各种语言及其可能的方言进行硬编码,以限制XML中的内容。

每条记录都需要指定一种语言,并且语言可以有一个可选的Dialect,其中可以指定零或更多明确定义的值。语言和方言的总体清单相对较小。

我想也许使用<xsd:restriction>这样的东西可以让我指定语言,然后在第一个语句中有第二个<xsd:restriction>来处理方言,但是我从来没有找到像这样的结构的任何例子在寻找答案的同时

我遇到的另一个问题是必须将文件导入Drupal,即无论选择何种语言(和可选的方言),都能从单个通用层次结构中识别语言和一个或多个方言至关重要。

任何提示/帮助/指针都将不胜感激!

2 个答案:

答案 0 :(得分:0)

我是否正确地想要说:“如果语言是英语,那么方言必须是美国英语或英国英语”?

这是一个共现约束 - 一个元素的值取决于另一个元素的值。因此,它无法在XSD 1.0中表示,但需要XSD 1.1中的断言功能。

答案 1 :(得分:0)

它应该运行良好但仅适用于模式1.1

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
    <xsd:simpleType name="language_type">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="english"/>
            <xsd:enumeration value="ukrainian"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="language">
        <xsd:attribute name="type" type="language_type" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="language_english">
        <xsd:complexContent>
            <xsd:extension base="language">
                <xsd:sequence>
                    <xsd:element name="Dialect" maxOccurs="unbounded">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:string">
                                <xsd:enumeration value="value_11"/>
                                <xsd:enumeration value="value_12"/>
                                <xsd:enumeration value="value_13"/>
                                <xsd:enumeration value="value_14"/>
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>

    </xsd:complexType>

    <xsd:complexType name="language_ukrainian">
        <xsd:complexContent>
            <xsd:extension base="language">
                <xsd:sequence>
                    <xsd:element name="Dialect" maxOccurs="unbounded">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:string">
                                <xsd:enumeration value="value_21"/>
                                <xsd:enumeration value="value_22"/>
                                <xsd:enumeration value="value_23"/>
                                <xsd:enumeration value="value_24"/>
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>


    <xsd:element name="Language">
        <xsd:alternative test="@type = 'english'" type="language_english"/>
        <xsd:alternative test="@type = 'ukrainian'" type="language_ukrainian"/>
    </xsd:element>

    <xsd:element name="Languages">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Language" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

结果xml

<?xml version="1.0" encoding="UTF-8"?>
<Languages xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Language type="english">
        <Dialect>value_11</Dialect>
        <Dialect>value_11</Dialect>
    </Language>
    <Language type="ukrainian">
        <!-- <Dialect>value_11</Dialect> is not valid here-->
        <Dialect>value_21</Dialect>
        <Dialect>value_21</Dialect>
    </Language>
</Languages>