- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在与客户讨论是否允许在 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/
我知道我以前在某个地方看到过这个,但我再也找不到它了。我需要一个从另一个 xsd 中调用 xsd 文件的示例。这在生成大量 xml 文件的情况下非常有用,但在这些 xml 文件之间存在大量公共(pub
有人知道供应商中立的 XSD 来描述关系数据库模式吗?我们的系统需要获取有关数据库结构的信息: 表 列和类型 主键和外键约束 索引 等 以独立于供应商的方式并将其存储在 XML 文件中以供以后处理。
我在 XSD 中使用 gml (3.1.1) XSD 作为我的应用程序。我想下载版本 3.1.1 中的所有 gml XSD,例如 zip 文件。换句话说:基本 xsd 是 here我想用 zip 文件
我想要一个 XSD 来验证包含具有许多别名但每个别名具有不同值的文件元素的 XML。 这是我的 XML: Document1
我看到一个 xml 架构 ( EPP ) 将 xsd:choice 与一个元素一起使用,即使我们可以使用 xsd:enumeration 代替:
我目前工作的公司将架构或契约(Contract)版本编入根节点。例如, ... 我正在寻找人们对这种设计方法的意见,因为我不相信它是合理的。例如,它要求所有使用此模式作为消息传递契约的服务都能够发
我在处理 Web 服务响应时遇到了 Apache CXF 解析错误。归结为一个空元素被返回: 元素定义如下: 现在我在 CXF 邮件列表上看到了 empty value is not allowe
XSD 可以为比较两个元素添加约束吗? 假设我在 DataRangeType 下有 Begin End 我想添加一个约束说 Begin 非常
我想声明一个要包含在复杂类型声明中的元素,并且该元素有一个强制属性:“option=MyOption”,但是“选项”属性的值可以是任何值,具体取决于上下文。 也就是说:在使用包含该元素的复杂类型的任何
我需要能够将简单元素类型设置为整数,但也可以将其设置为空。如果此示例为空且空白字段不是整数,则此示例将发送错误。我该如何解决? 最佳答案 您要做的是在同一元素上分配限制,并对其进行合并,例如以下示例
对于这个 xml: 我有这个模式,它似乎可以根据 w3 schema validation service 进行验证,并且该架构可以很好地验证上述 XML。遗憾的是,xsd.exe
我有两个 XSD 文件(源文件和目标文件)...我应该在什么基础上映射这两个文件以获得 XSLT?我知道 MapForce 如何帮助映射,但我使用示例项目..现在我想知道我应该在什么基础上映射我的客户
我有一个 .cs 文件,其中包含 XTypedElement 和 IXMetaData 的子类。微软有一个 tool that generates XSD files automatically来自托
这个问题在这里已经有了答案: XML Schema to validate XML Schemas? (3 个答案) 关闭 9 年前。 是否存在可验证其他 XML 架构的 Xml 架构? 我想做的是
假设我正在处理一个 xsd:simpleType,它是一个字符串,需要具有特定的字符集和特定的最大长度,类似于以下代码: 所以我的 xsd 类型将是一个只
JAXB 同时映射 xsd:base64Binary和 xsd:hexBinary类型为 byte[] . 鉴于我有一个架构/DOM 元素代表这些类型中的每一个,例如: ABCD对于 xsd:hexB
我非常确定我在这里遗漏了一些简单的东西。 我正在使用 netbeans 在两个单独的项目中创建一个 web jax-ws web 服务和一个客户端,并且我有一些自定义绑定(bind)已使用 net b
将字节数组表示为 XSD 架构的最佳方式是什么?我有一个字节输入,我需要解析它并将其提供给 JAXB 从 XSD 模式生成的 Java 对象以供将来验证。我输入中的每条信息都由偏移量和长度定义。我想将
我的架构的这一部分给我带来了麻烦:
我需要定义元素“MyData”的名为“DataValue”的属性。但要求是“DataValue”的类型可以动态更改,即数据值在一个实例中可以是字符串,而在其他实例中它可以是 int 或 bool。它可
我是一名优秀的程序员,十分优秀!