xml - 是否允许在 XSD 中有多个同名元素?

标签 xml xsd

我正在与客户讨论是否允许在 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,它看起来没问题。

谁能告诉我哪种行为是正确的?

最佳答案

客户说它是有效的 XSD。但我不知道是不是。

它不是有效的 XSD,因此不符合 XSD,但不是出于您询问的原因。

为局部元素指定的复杂类型 Invoice CreditInvoice.xsd 中的元素无效:它有一个 xsd:element 元素作为 xsd:complexType 的子元素。我认为这是您为将示例缩小到可管理的大小所做的任何操作所导致的错字。如果将 CreditNo 的声明移到 xsd:sequence 元素中,架构文档将变得有效,并且由您提供的三个架构文档定义的架构将成为一个一致的架构。

关于本地元素与顶级/全局元素同名的问题,您的客户毫无疑问是正确的。它是合法的,它是合法的,它是 XSD 设计的重要组成部分。 (@Augusto 可能是正确的,它可能会造成混淆;设计人员在使用此功能时当然应该小心。但它绝对符合要求。)

它 (Main.xsd) 应该如何知道应该引用哪个 Invoice 元素?我在使用其他工具时看到同样的错误。

你说“同样的错误”,但你没有描述错误信息。也许你的意思是另一个工具似乎也采用了 <xs:element ref="Invoice" />在 Main.xsd 中作为对 CreditInvoice.xsd 中定义的发票的引用,而不是作为对 Invoice.xsd 中定义的发票的引用。

对元素的任何引用,例如 <xs:element ref="Invoice" />在 Main.xsd 中,是对具有匹配名称的顶级(也称为全局)元素的引用。在一致模式中,将始终最多有一个这样的元素。因此,当根据示例中各种模式文档中的声明构造模式时,任何符合标准的处理器都会知道 Invoice可以作为 Invoices 的子元素出现的元素是顶级Invoice Invoice.xsd 中声明的元素。它不能是 Invoice CreditInvoice.xsd 中声明的元素,因为该元素是 CreditInvoice 的复杂类型的本地元素元素。与任何本地元素一样,它可以在声明的地方使用,不能在其他地方使用。

如果您说您提到的工具将 Main.xsd 中的元素引用视为对 CreditInvoice.xsd 中 CreditInvoice 本地声明的 Invoice 的引用是正确的,那么您刚刚发现了这些工具中的错误。如果您关心这些工具并且对供应商有任何善意,您应该报告问题以便他们解决。

但是,如果我使用 Stylus Studio XML Professional 打开 Main.xsd,它看起来没问题。

谁能告诉我哪种行为是正确的?

规范可以告诉你;靠谱的书可以告诉你;可靠的工具可以告诉您(比阅读规范要省力得多)。

关于xml - 是否允许在 XSD 中有多个同名元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18612359/

相关文章:

java - 使用stax解析器仅从xml获取特定元素节点

java - 从布局中包含的 ListView 接收字符串。安卓

android - XSD 字段 "No resource type specified"上的 Eclipse 错误

java - 根据 JSON 验证 XML

java - 编码对象列表而不影响现有列表

asp.net - 使用 ASP.NET 如何从网站读取外部 XML?

更新到 3.0.1 版本后,Android Studio 不显示布局

c++ - 使用 XSD 的单元测试 xml 生成器

xml - 创建一个可以导入到 EXCEL 的 XSD,具有基于元素值的限制

mysql - XSD 到 MySQL 架构