假设我们有一个元素,它既可以是叶子(包含某个值),也可以是复合(通常的复合模式)。我想模拟预期由其他实例改进的树实例,例如通过用新元素填充复合节点。我希望能够通过其结构来决定一个树实例是否符合另一个实例。是否可以将实例建模为XSD并实现符合XSD的符合其他XSD的一致性?请注意,不仅仅有两个级别 - 每个结构都可以作为元结构。
附录:为了更好地了解意图,这里有一些可能的规则。
示例:
Structure 1:
composite
0..1 "abc"
1..n "def"
0..n extensible composite "c1"
1..1 "ghi"
0..1 composite "c2"
1..1 "jkl"
Structure 2:
composite
1..1 "def"
1..1 "def"
1..1 "def"
1..1 extensible composite "c1"
1..1 "ghi"
1..n "extension"
1..n extensible composite "c1"
1..1 "ghi"
Structure 3:
composite
0..n "abc" //too many "abc"s
//"def" needed
0..1 composite "c2"
1..1 "jkl"
1..1 "mno" //forbidden extension
第二个结构符合第一个结构,第三个结构不符合第一个结构。我想也许可以用模式验证来表达。
答案 0 :(得分:1)
如果你正在发现XSD,那么首先要制作一堆XML文件,代表你想要实现的目标,将它们同时提供给一个可以生成一个(或多个)XSD文件的工具(取决于您是否使用多个名称空间)。一旦你在XSD中有了合理的基础,你就可以手动解决这个问题。
这是我根据你的澄清尝试过的。
Sample1.xml
<composite>
<abc/>
<def/>
<c1>
<ghi/>
</c1>
<c1>
<ghi/>
</c1>
<c2>
<jkl/>
</c2>
</composite>
Sample2.xml
<composite>
<def/>
<def/>
<c1>
<ghi/>
<extension/>
</c1>
<c1>
<ghi/>
</c1>
</composite>
基于以上所述,原始生成的XSD是:
<?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="composite">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="abc" type="xs:anyType" />
<xs:element maxOccurs="unbounded" name="def" type="xs:anyType" />
<xs:element maxOccurs="unbounded" name="c1">
<xs:complexType>
<xs:sequence>
<xs:element name="ghi" type="xs:anyType" />
<xs:element minOccurs="0" name="extension" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="c2">
<xs:complexType>
<xs:sequence>
<xs:element name="jkl" type="xs:anyType" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
需要进行一些调整,因为您所描述的所有基数场景都没有被XML捕获。以下是更新的图表,以便更轻松地与原始标记进行对帐。
应该更容易看出XSD如何与您所问的相匹配(未显示基数,假设(1..1) - 这是XSD中粒子的默认值。)
如何进一步定义扩展,可能通过使用其他机制(如通配符元素)或约束为基于类型,是基于进一步要求要完成的活动。如果您正在进入更复杂的场景,例如基于其他元素存在或值(共同约束)强制存在,那么XSD 1.0可能无法工作......
这应该让你开始至少为你的问题提供额外的细节......