我可以创建一个将属性放在特定复杂类型上的XSD架构吗?

时间:2013-03-28 20:34:59

标签: xml xsd xml-validation

我已经给出了

<?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中的similar question, that asks how to place an additional attribute to all complex types。答案是否定的。但是,我不是这方面的专家,从那里的答案我不能解释,如果有可能特定的复杂类型。我尝试了几件事没有成功,似乎这只能通过xsd:extension'ing或xsd:限制一个复杂的类型来实现,从而得到一个新的,这不是我想要的。我想在同一个标​​签上“合并”属性:

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

这可能吗?如何?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

您提议的内容会为“标记”添加新属性。因此改变了 XSD模型的某些消费者的类型。

话虽如此,只要您愿意在XML中添加xsi:type属性,就可以按照自己的意愿行事。鉴于o:TagType是一个空类型,你也可以这样做:

<m:Tag xsi:type="m:TagWithAttribute" m:additionalAttribute="Value" />
  • make o:TagType为抽象类型
  • 使用xs:extension创建一个新类型&#39; m:TagWithAttribute&#39;基于o:TagType

通过添加xsi:type属性,架构验证器可以区分您对&#39; Tag&#39;的使用情况。从那些希望以不同方式进行验证的人的那个。换句话说,XML Schema强制执行强类型(xs:重新定义了强类型,这就是为什么有些人不喜欢它)。