XSD 可能未在 XML 中生成抽象类型
XSD abstract type possibly not generated in XML
这是一个一般性的 XSD 验证问题。
我正在尝试使 XSD 架构适应现有 XML。
让我们有以下 XML 分支:
<briefing>
<date/>
<supplier/>
<customer/>
...
<q>question 1</q>
<a>answer 1</a>
<q>question 2</q>
<a>answer 2</a>
...
</briefing>
现在对于每个简报,我可以有 1 个客户、1 个供应商和 N 对问答:如果 a 想控制对 q+a 对,我应该创建一个元素 <qa>
具有 maxOccurs=unbounded
并包括在序列 <q>+<a>
内,每个序列都有 minOccurs=maxOccurs=1
。
但是,如果 <qa>
元素在 XML 中不可用怎么办?
我想创建一个 'abstract' <qa>
元素(或一个组),这样父抽象元素根本不会生成,但它的子元素仍然可以带有它们的属性(有点像虚拟 元素)。
不管怎样,抽象元素和组都没有以这种方式被验证,我在规范中找不到类似的东西...
那么最后,关于这些元素我们能说些什么呢?
是否强制每个 XSD 父元素出现在 finally XML 中,以便其子元素也出现在里面?
您需要做的是将 q 和 a 元素放在一个序列下,该序列具有 minOccurs 0 和 maxOccurs 设置为一个值或无界,如下所示。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="briefing">
<xs:complexType>
<xs:sequence>
<xs:element name="date" nillable="true" type="xs:date" />
<xs:element name="supplier" type="xs:string" />
<xs:element name="customer" type="xs:string" />
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="q" type="xs:string" />
<xs:element name="a" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这将非常愉快地解析
<briefing>
<date>1999-05-31</date>
<supplier>supplier_0</supplier>
<customer>customer_0</customer>
<q>question 1</q>
<a>answer 1</a>
<q>question 2</q>
<a>answer 2</a>
</briefing>
或
<briefing>
<date>1999-05-31</date>
<supplier>supplier_0</supplier>
<customer>customer_0</customer>
</briefing>
这是一个一般性的 XSD 验证问题。 我正在尝试使 XSD 架构适应现有 XML。 让我们有以下 XML 分支:
<briefing>
<date/>
<supplier/>
<customer/>
...
<q>question 1</q>
<a>answer 1</a>
<q>question 2</q>
<a>answer 2</a>
...
</briefing>
现在对于每个简报,我可以有 1 个客户、1 个供应商和 N 对问答:如果 a 想控制对 q+a 对,我应该创建一个元素 <qa>
具有 maxOccurs=unbounded
并包括在序列 <q>+<a>
内,每个序列都有 minOccurs=maxOccurs=1
。
但是,如果 <qa>
元素在 XML 中不可用怎么办?
我想创建一个 'abstract' <qa>
元素(或一个组),这样父抽象元素根本不会生成,但它的子元素仍然可以带有它们的属性(有点像虚拟 元素)。
不管怎样,抽象元素和组都没有以这种方式被验证,我在规范中找不到类似的东西...
那么最后,关于这些元素我们能说些什么呢?
是否强制每个 XSD 父元素出现在 finally XML 中,以便其子元素也出现在里面?
您需要做的是将 q 和 a 元素放在一个序列下,该序列具有 minOccurs 0 和 maxOccurs 设置为一个值或无界,如下所示。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="briefing">
<xs:complexType>
<xs:sequence>
<xs:element name="date" nillable="true" type="xs:date" />
<xs:element name="supplier" type="xs:string" />
<xs:element name="customer" type="xs:string" />
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="q" type="xs:string" />
<xs:element name="a" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这将非常愉快地解析
<briefing>
<date>1999-05-31</date>
<supplier>supplier_0</supplier>
<customer>customer_0</customer>
<q>question 1</q>
<a>answer 1</a>
<q>question 2</q>
<a>answer 2</a>
</briefing>
或
<briefing>
<date>1999-05-31</date>
<supplier>supplier_0</supplier>
<customer>customer_0</customer>
</briefing>