XSD:具有不同类型的同名<elements>的随机顺序= IMPOSSIBLE </elements>

时间:2011-06-03 19:50:51

标签: xml xsd xml-validation

搜索并试验,研究并绞尽脑汁(昨晚梦见它)。

尝试构建XSD架构,以根据标记的约束验证以下示例XML,具体取决于标记的值。

<data>
  <dataSet>
    <title>mediaType</title>
    <value>FullLength</value>
  </dataSet>
  <dataSet>
    <title>available</title>
    <value>true</value>
  </dataSet>
  <dataSet>
    <title>country</title>
    <value>Canada</value>
  </dataSet>
</data>

关于单个dataSet的约束的模式

<xs:complexType name="typeAvailable">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="available" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:boolean" />
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeMediaType">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="mediaType" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="FullLength|Clip" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeCountry">
    <xs:sequence>
        <xs:element name="title">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="typeCountry" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="value">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="Canada|US" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

我能想到的最好的方法是不验证dataSet的故障(它们将会出现故障)

<xs:complexType name="typeData">
    <xs:all>
        <xs:element name="dataSet" type="typeMediaType" />
        <xs:element name="dataSet" type="typeAvailable" />
        <xs:element name="dataSet" type="typeCountry" />
    </xs:all>
</xs:complexType>

当然,我坚持使用我得到的数据,但没有说我无法用XSLT将其转换成什么,我不知道。我希望有一个优雅的XSD解决方案,唉,我担心这是不可能的。

任何人都可以证明我错了吗?这是我很长一段时间内的第一个模式项目。

更新

你知道吗,我想我要验证它的结构,阅读&lt; data&gt;部分w / LINQ并通过XSLT将其转换为

<data>
    <mediaType>FullLength</mediaType>
    <available>true</available>
    <country>Canada</country>
</data>

无论如何,我可能有理由这样做,因为在验证后的数据与&lt; title&gt;&lt; value&gt;中的数据一起变得很糟糕。如何配对。

2 个答案:

答案 0 :(得分:1)

XML Schema无法实现“条件”约束。键有很少的技巧,但它们非常有限。考虑使用Schematron,它具有更丰富的验证功能。

通常,XML Schema更多地是关于结构和类型,它的约束能力非常有限。

答案 1 :(得分:0)

Element Declarations Consistent约束不允许使用具有不同类型的相同命名元素。