0

假设我们有一个元素,它要么是叶子(包含一些值),要么是复合(通常的复合模式)。我想对预计将由其他实例细化的树实例进行建模,例如通过用新元素填充复合节点。我希望能够通过其结构来确定一个树实例是否符合另一个实例。是否可以将实例建模为 XSD 并将一致性实现为符合其他 XSD 的 XSD?请注意,不仅仅是两个级别 - 每个结构都可以用作元结构。

附录:为了更好地了解意图,这里有一些可能的规则。

  • “这种复合材料不可扩展(已修复)。”
  • “您可以在此合成的末尾添加元素。”
  • “这个组合包含一个可选的叶子 1 和一个强制性的叶子 2。”
  • “这个复合材料包含该复合材料的任意数量的出现。”

例子:

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

第二个结构符合第一个,第三个不符合。我想也许这可以用模式验证来表达。

4

1 回答 1

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 可能无法工作......

这应该让您至少开始为您的问题提供更多详细信息......

于 2013-04-26T17:16:17.230 回答