XSD 重用选择的元素而不包装它
XSD reuse a choice of elements without wrapping it
我需要为 XML 编写一个 XSD,其中包含这样的递归表达式树:
<binary op="plus">
<var>X</var>
<const>5</const>
</binary>
其中操作数始终可以是 var、const、call、unary、binary 中的任何一个,因此例如这些也是有效的:
<binary op="divide">
<const>2</const>
<const>2</const>
</binary>
<binary op="plus">
<call>f</call>
<binary op="minus">
<var>Y</var>
<var>Y</var>
</binary>
</binary>
我想以某种方式在一个地方定义 const、var、call、一元、二进制之间的选择,以限制冗余。我可以使用命名类型来做到这一点,但只能使用额外的 wrapping/nesting,例如:
<binary op="plus">
<operand><call>f</call></operand>
<operand><var>Y</var></operand>
</binary>
这不是必需的。是否可以为原始格式定义一个conciseXSD,即没有<operand />
的附加层级?
使用 element substitution group...
XSD
此 XSD 将成功验证您的所有三个示例 XML 文档,没有 operand
换行,根据要求:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="binary" substitutionGroup="TermSubGroup">
<xs:complexType>
<xs:sequence>
<xs:element ref="TermSubGroup"
minOccurs="2" maxOccurs="2"/>
</xs:sequence>
<xs:attribute name="op" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="TermSubGroup" abstract="true"/>
<xs:element name="var" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:element name="const" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:element name="call" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:simpleType name="TermGroup">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
我需要为 XML 编写一个 XSD,其中包含这样的递归表达式树:
<binary op="plus">
<var>X</var>
<const>5</const>
</binary>
其中操作数始终可以是 var、const、call、unary、binary 中的任何一个,因此例如这些也是有效的:
<binary op="divide">
<const>2</const>
<const>2</const>
</binary>
<binary op="plus">
<call>f</call>
<binary op="minus">
<var>Y</var>
<var>Y</var>
</binary>
</binary>
我想以某种方式在一个地方定义 const、var、call、一元、二进制之间的选择,以限制冗余。我可以使用命名类型来做到这一点,但只能使用额外的 wrapping/nesting,例如:
<binary op="plus">
<operand><call>f</call></operand>
<operand><var>Y</var></operand>
</binary>
这不是必需的。是否可以为原始格式定义一个conciseXSD,即没有<operand />
的附加层级?
使用 element substitution group...
XSD
此 XSD 将成功验证您的所有三个示例 XML 文档,没有 operand
换行,根据要求:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="binary" substitutionGroup="TermSubGroup">
<xs:complexType>
<xs:sequence>
<xs:element ref="TermSubGroup"
minOccurs="2" maxOccurs="2"/>
</xs:sequence>
<xs:attribute name="op" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="TermSubGroup" abstract="true"/>
<xs:element name="var" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:element name="const" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:element name="call" type="TermGroup" substitutionGroup="TermSubGroup"/>
<xs:simpleType name="TermGroup">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>