我正在与客户讨论是否允许在 XSD 中有多个具有相同名称的元素。让我试着解释一下。
CreditInvoice.xsd(在 CreditInvoice 元素中包含一个 Invoice 元素)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="CreditInvoice">
<xs:complexType>
<xs:sequence>
<xs:element name="Invoice" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:element name="CreditNo" type="xs:string" />
<xs:sequence>
<xs:element name="InvoiceDate" type="xs:date" />
<xs:element name="InvoiceNo" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Invoice.xsd(包含根 Invoice 元素)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Invoice">
<xs:complexType>
<xs:sequence>
<xs:element name="InvoiceDate" type="xs:date" />
<xs:element name="InvoiceNo" type="xs:string" />
<xs:element name="InvoiceReceiver" type="xs:string" />
<xs:element name="DueDate" type="xs:date" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Main.xsd(包含其他 XSD 文档的主 XSD 文档。)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="CreditInvoice.xsd"/>
<xs:include schemaLocation="Invoice.xsd"/>
<xs:element name="Invoices">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="CreditInvoice" />
<xs:element ref="Invoice" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
当我在例如 CAM 模板编辑器 ( http://www.cameditor.org ) 中打开 Main.xsd 时,Main.xsd 中 Invoice 的元素引用使用 CreditInvoice.xsd 中定义的 Invoice 元素而不是 Invoice.xsd 中定义的元素客户正在努力实现的目标。
如果我将包含元素的顺序更改为在 CreditInvoice.xsd 之前包含 Invoice.xsd,则它可以正常工作。
客户说它是有效的 XSD。但我不知道是不是。它(Main.xsd)应该如何知道它应该引用哪个 Invoice 元素?我使用另一个工具看到了同样的错误。
但是,如果我使用 Stylus Studio XML Professional 打开 Main.xsd,它看起来还不错。
谁能告诉我哪种行为是正确的?