0

我给了

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  targetNamespace="AdditionalAttribute.OtherXSD"
  xmlns:o="AdditionalAttribute.OtherXSD" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="Tag" type="o:TagType" />
  <xs:complexType name="TagType" />
</xs:schema>

我想写

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  targetNamespace="AdditionalAttribute.MyXSD" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <!-- ? -->
</xs:schema>

所以这成为有效的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<o:Tag
  xmlns:o="AdditionalAttribute.OtherXSD"
  xmlns:m="AdditionalAttribute.MyXSD"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    AdditionalAttribute.OtherXSD AdditionalAttribute.OtherXSD.xsd 
    AdditionalAttribute.MyXSD AdditionalAttribute.MyXSD.xsd
  "
  m:AdditionalAttribute="Value"
/>

我知道一个类似的问题,询问如何在另一个 XSD 中为所有复杂类型放置一个附加属性。答案是否定的。但是,我不是这方面的专家,从那里的答案中我无法推断出特定复杂类型是否可能。我尝试了几件事但没有成功,似乎这只能通过 xsd:extension'ing 或 xsd:restriction'ing 复杂类型来实现,从而派生出一个新类型,这不是我想要的。我想在同一个标​​签上“合并”属性:

  <o:Tag o:...=...           />
+ <o:Tag           m:...=... />
= <o:Tag o:...=... m:...=... />

这可能吗?如何?

4

2 回答 2

0
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:o="AdditionalAttribute.OtherXSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="AdditionalAttribute.MyXSD" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="AdditionalAttribute.OtherXSD" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="AdditionalAttribute.MyXSD" />
  <xs:element name="Tag">
    <xs:complexType>
      <xs:attribute ref="m:AdditionalAttribute" use="required" />
    </xs:complexType>
  </xs:element>
</xs:schema>
于 2013-03-28T20:37:56.493 回答
0

我认为您的问题是您试图在 XML Schema 中一些故意施加的约束之外进行操作。

  • 标记由限定名称 ( QName ) 标识,该名称由名称和命名空间组成。
  • 标签的类型定义了其允许的内容

您所提议的将为“标签”添加一个新属性,从而为 XSD 模型的某些消费者更改其类型。

话虽如此,只要您愿意将 xsi:type 属性添加到 XML,您就可以做您想做的事。鉴于 o:TagType 是一个空类型,您不妨这样做:

<m:Tag xsi:type="m:TagWithAttribute" m:additionalAttribute="Value" />
  • 使 o:TagType 成为抽象类型
  • 使用 xs:extension 创建基于 o:TagType 的新类型 'm:TagWithAttribute'

通过添加 xsi:type 属性,模式验证器可以将您对“标签”的使用与其他希望对其进行不同验证的人区分开来。换句话说,XML Schema 正在强制执行强类型(xs:redefines 绕过了强类型,这就是为什么有些人不喜欢它)。

于 2015-11-13T17:36:04.067 回答