在XML Schema中声明不同命名空间的属性

时间:2013-09-03 17:54:38

标签: xsd xml-namespaces

我一直在使用XML格式,它混合了不同的现有格式和一些自定义元素和属性,我想我应该为这些自定义位编写一个架构。

我做的一件事是在现有格式的元素上使用自定义属性,如下所示:

<ns1:something attA="b" attB="a" ns2:extraAtt="c"/>

我知道这样做是允许的,但我不能想到如何在XML Schema中声明我的“extraAtt”,或者更糟糕的是,在DTD中。

我试过阅读specification,但就我而言,它也可以用中文写成。大多数教程仅讨论“名称”,“类型”和“使用”,例如this onethat one

2 个答案:

答案 0 :(得分:6)

每个模式文档定义一个名称空间的组件(模式的各个部分)。因此,要定义属性ns2:extraAtt,您需要一个类似于此的模式文档:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://example.com/my-ns2">
  <xs:attribute name="extraAtt" type="xs:anySimpleType"/>
</xs:schema>

元素ns1的声明:某些东西需要以某种方式允许该属性,或者使用属性引用(<xs:attribute ref="ns2:extraAtt"/>)或者使用属性通配符(<xs:anyAttribute namespace="http://example.com/my-ns2"/>或类似)。


对于规范的易读性感到抱歉;这是一个很长的故事,但基本上WG的一些成员并不认为像你这样的人存在(“没有人除了实现者阅读规范,只要他们不抱怨它足够可读” - 至少,这就是他们说,在一些实施者做了大声和痛苦的抱怨之前;然后他们只是改变了主题)。

答案 1 :(得分:1)

要声明您可以使用此XSD的属性:

<xs:schema 
  targetNamespace="theNamespaceUri"
  elementFormDefault="qualified"
  attributeFormDefault="qualified"
  xmlns="theNamespaceUri"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

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

</xs:schema>

(假设extraAtt是一个简单的字符串 - 您可以使用任何类型,或限制现有类型等。)