【发布时间】:2022-01-23 11:43:12
【问题描述】:
我正在尝试为此示例 XML 创建一个验证模式。我已经尝试过使用递归定义,但找不到合适的方法。请注意,IF 和 ELSE 元素可以嵌套任意次数,而 ACTIONx 元素可以以任意顺序出现。另请注意,每个元素都有自己可能不同的属性。
<?xml version="1.0" encoding="utf-8"?>
<KEYPRESS Buffer="1">
<ACTION1 Index="15" />
<IF Condition="0">
<IF Condition="1">
<ACTION1 Index="14" />
<ELSE>
<ACTION2 Measure="whatever" />
</ELSE>
</IF>
<IF Condition="2">
<IF Condition="5">
<ACTION2 Measure="whatelse" />
<ACTION3 Type="Flag" />
</IF>
<ELSE>
<ACTION1 Index="0" />
<ACTION3 Type="Other" />
<IF Condition="1">
<ACTION3 Type="Flag" />
</IF>
</ELSE>
</IF>
</IF>
</KEYPRESS>
任何帮助将不胜感激。
*** 编辑 *** 非常感谢Michael Kay,很好的解决方案! 我在这里发布生成的架构,以防有人感兴趣。
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2021 (https://www.liquid-technologies.com) -->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="INSTRUCTION" abstract="true"/>
<xs:element name="ACTION1" substitutionGroup="INSTRUCTION">
<xs:complexType>
<xs:attribute name="Index" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="ACTION2" substitutionGroup="INSTRUCTION">
<xs:complexType>
<xs:attribute name="Index" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="ACTION3" substitutionGroup="INSTRUCTION">
<xs:complexType>
<xs:attribute name="Type" type="xs:string" use="required" />
<xs:attribute name="Index" type="xs:string" use="required" />
<xs:attribute name="Value" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="IF" substitutionGroup="INSTRUCTION">
<xs:complexType>
<xs:sequence>
<xs:element ref="INSTRUCTION" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="ELSE" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="Type" type="xs:string" use="required" />
<xs:attribute name="Index" type="xs:string" use="required" />
<xs:attribute name="Condition" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="KEYPRESS" >
<xs:complexType>
<xs:sequence>
<xs:element ref="INSTRUCTION" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="KeySeq" type="xs:string" use="required" />
<xs:attribute name="Buffer" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="ELSE" >
<xs:complexType>
<xs:sequence>
<xs:element ref="INSTRUCTION" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
【问题讨论】:
标签: xml xsd-validation