我有这样的场景,在引用时必须限制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>
答案 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>
以上有两个模型ADType1
和ADType2
,每个模型都可用于声明名为AD
的元素。在您的情况下,您可以为AD
元素创建一个全局类型,该元素在ADConfig
元素中使用,另一种类型可以在其他地方使用。
如果您不能使用这种模型(可能AD
的类型在其他地方定义并且已修复),您可以使用Schematron注释来提供相同类型的规则驱动将由XML Schema 1.1提供的验证