xml - 在 XML XSD 中定义递归代数数据类型

标签 xml xsd algebraic-data-types

假设我有一个递归的 algebraic data type像这样(Haskell 语法):

data Expr = Zero
          | One
          | Add Expr Expr
          | Mul Expr Expr

我想用 XML 表示它,并且我想要它的 XSD 架构。

我已经想出了如何实现这个语法:

<Expr>
  <Add>
    <Expr>
      <Zero/>
    </Expr>
    <Expr>
      <Mul>
        <Expr>
          <One/>
        </Expr>
        <Expr>
          <Add>
            <Expr>
              <One/>
            </Expr>
            <Expr>
              <One/>
            </Expr>
          </Add>
        </Expr>
      </Mul>
    </Expr>
  </Add>
</Expr>

使用此架构:

<xs:complexType name="Expr">
  <xs:choice minOccurs="1" maxOccurs="1">
    <xs:element minOccurs="1" maxOccurs="1" name="Zero" type="Zero" />
    <xs:element minOccurs="1" maxOccurs="1" name="One" type="One" />
    <xs:element minOccurs="1" maxOccurs="1" name="Add" type="Add" />
    <xs:element minOccurs="1" maxOccurs="1" name="Mul" type="Mul" />
  </xs:choice>
</xs:complexType>
<xs:complexType name="Zero">
  <xs:sequence>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="One">
  <xs:sequence>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Add">
  <xs:sequence>
    <xs:element minOccurs="2" maxOccurs="2" name="Expr" type="Expr" />
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Mul">
  <xs:sequence>
    <xs:element minOccurs="2" maxOccurs="2" name="Expr" type="Expr" />
  </xs:sequence>
</xs:complexType>

但我真正想要的是这种语法:

<Add>
  <Zero/>
  <Mul>
    <One/>
    <Add>
      <One/>
      <One/>
    </Add>
  </Mul>
</Add>

这可能吗?

谢谢!

最佳答案

使用替换组:

  <xs:element name="Expr" abstract="true"/>

  <xs:element name="Zero" substitutionGroup="Expr">
    <xs:complexType/>
  </xs:element>

  <xs:element name="One" substitutionGroup="Expr">
    <xs:complexType/>
  </xs:element>

  <xs:element name="Add" substitutionGroup="Expr">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="2" maxOccurs="2" ref="Expr" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="Mul" substitutionGroup="Expr">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="2" maxOccurs="2" ref="Expr" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

关于xml - 在 XML XSD 中定义递归代数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511079/

相关文章:

data-structures - 数据结构差异化,直觉构建

xml - Spark Dataset write()方法返回错误

ios - 关于从网络数据中提取信息的建议(Swift)

xml - 将数据表导出到 xml

java - 从架构中检索根元素

xml - 一系列值的 XSD 枚举

scala ADTs via sealed traits - 有没有办法以通用方式从字符串反序列化

C# - 在标签/元素之外读取 XML

java - 我可以更改 typesafeEnumMemberName 生成的 bij cxf-xjc-plugin 吗?

Haskell - 使用递归方案的泛型多态代数数据类型的仿函数实例