如何在引用元素时限制复杂类型的元素

时间:2010-09-26 16:47:02

标签: xsd

我有这样的场景,在引用时必须限制complextype元素中的少数元素。例如,在ADConfig中引用元素AD下面时,我只想要引用元素domainName,userName,password而不是hostName,portNumber。

    <element name="AD">
        <complexType>
            <sequence>
                <element name="hostName" type="string"/>
                <element name="portNumber" type="string"/>
                <element name="domainName" type="string"/>
                <element name="userName" type="string"/>
                <element name="password" type="string"/>
            </sequence>
        </complexType>
    </element>

    <element name="ADConfig">
    <complexType>
        <sequence>
            <element ref="tns:AD"/>
        </sequence>
    </complexType>
</element>

1 个答案:

答案 0 :(得分:0)

就实例文档而言,我认为您希望AD元素是ADConfig元素的子元素,它们只包含一系列domainName,userName和passsword。在其他地方,在这个实例文档中,您可以拥有一个AD元素,其中包含上面列出的所有五个子元素。

假设我有这个正确的,我担心在当前版本的XSD中根本无法满足您的确切要求。我相信XML Schema 1.1可以解决您的问题。但是,如果可以稍微重写您的架构,那么这就成为可能。通过创建两个复杂类型,您可以为具有相同名称的元素(在不同的上下文中)使用两个模型。例如,

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">


    <xs:complexType name="ADType1">
        <xs:sequence>
            <xs:element name="hostName" type="xs:string"/>
            <xs:element name="portNumber" type="xs:string"/>
            <xs:element name="domainName" type="xs:string"/>
            <xs:element name="userName" type="xs:string"/>
            <xs:element name="password" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ADType2">
        <xs:sequence>
            <xs:element name="domainName" type="xs:string"/>
            <xs:element name="userName" type="xs:string"/>
            <xs:element name="password" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>


    <xs:element name="ADTest">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ADConfig1"/>
                <xs:element ref="ADConfig2"/>
                </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:element name="ADConfig1">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="ADType1" name="AD"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="ADConfig2">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="ADType2" name="AD"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


</xs:schema>

以上有两个模型ADType1ADType2,每个模型都可用于声明名为AD的元素。在您的情况下,您可以为AD元素创建一个全局类型,该元素在ADConfig元素中使用,另一种类型可以在其他地方使用。

如果您不能使用这种模型(可能AD的类型在其他地方定义并且已修复),您可以使用Schematron注释来提供相同类型的规则驱动将由XML Schema 1.1提供的验证