我想构建一个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,即无论选择何种语言(和可选的方言),都能从单个通用层次结构中识别语言和一个或多个方言至关重要。
任何提示/帮助/指针都将不胜感激!
答案 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>