我在尝试在xsd中进行此架构验证时遇到问题。
有效案例
<root>
<groups>
<group/>
</groups>
</root>
Valid case
<root>
<groups/>
</root>
无效案例
<root>
<group/>
</root>
如何确保特定子元素只能存在于某个父元素下,而不是单独存在于xml到xsd中?
在这例如 组不能单独存在,但当组是父级时可以存在...
有人回答说,不要将组元素全局化,即在组元素中包含它......
但可能有一个案例, 其中group不是父母的直接子女。 例如 有效案例
<groups>
<class>
<group>
</class>
</groups>
在那种情况下应该做些什么......因为班级也需要引用群组......
答案 0 :(得分:1)
根据你的问题,听起来更像是你希望课程和小组可以互换。为此,您希望使用递归模式元素,如此...
<xsd:element name="Groups">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="BranchType"/>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="BranchType">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="Class" type="BranchType" minOccurs="0" maxOccurs="1"/>
<xsd:element name="Group" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
我们基本上定义了一个BranchType,它可以包含任何Group元素或其自身的混合(通过Class元素)。然后我们将顶级组定义为BranchType类型。我使用一个选择序列,以便Class和Group元素可以以任何顺序出现,可以任意次数出现在任何嵌套级别。
答案 1 :(得分:0)
如果您不希望元素单独显示,则必须在定义其父元素的复杂类型中声明它。
下面是一个由工具生成的简单“修复”;在学习时,它可能是一种快速启动XSD的好方法,至少可以使语法正确...
更新:如果您不断添加内容,则需要更新架构。如果元素不是全局的,那么解决方案是相同的:在其父级中定义。如果内容模型相同,则将其定义为全局类型,并在元素的定义中引用它(在这种情况下,它将代替anyType)。
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="groups">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element name="group" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="groups">
<xs:complexType>
<xs:sequence>
<xs:element name="class">
<xs:complexType>
<xs:sequence>
<xs:element name="group" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>