是否可以通过额外的XSD为元素定义XML属性?

时间:2012-10-02 11:24:24

标签: xml xsd xsi

假设我有类似这样的XML:

<root xmlns="default" xmlns:add="additional">
    <element foo="fromDefault" />
    <add:element foo="fromDefault" add:bar="fromAdditional" />
</root>

我想要做的是合并两个element定义以避免重复,如下所示:

<root xmlns="default" xmlns:add="additional">
    <element foo="fromDefault" add:bar="fromAdditional" />
</root>

但我甚至不确定这是否可能。

我觉得它可能是可行的,因为我们对根元素使用了一些类似的符号,如:

<root xmlns:xsi="..."
         xsi:schemaLocation="...">

不幸的是我无法找到任何有关此问题的文档/参考/教程/任何内容,有人可以帮我澄清我想做的事情是否可能(或不是)并与我分享一些链接?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的东西:

<强> additional.xsd

<xs:schema 
  targetNamespace="additional"
  elementFormDefault="qualified"
  xmlns="additional"
  xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:attribute name="bar" type="xs:string"/>

</xs:schema>

<强> default.xsd

<xs:schema 
  targetNamespace="default"
  elementFormDefault="qualified"
  xmlns="default"
  xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:add="additional">

  <xs:import namespace="additional" schemaLocation="additional.xsd"/>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="element" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="foo" type="xs:string"/>
            <xs:attribute ref="add:bar"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

第一个模式仅定义“附加”内容(在示例中只是一个属性),第二个模式导入它并定义其他所有内容,并在需要时引用其他内容。