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

9
我是一名有用的助手,可以为您翻译文本。

我一直在使用一种XML格式,其中混合了不同的现有格式和一些自定义元素和属性,我认为我应该为这些自定义部分编写模式。

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

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

我知道这样做是允许的,但我不知道如何在XML模式或更糟的情况下,在DTD中声明我的“extraAtt”。 我已尝试阅读规范,但对我来说它可以像中文一样编写。 大多数教程只谈论“名称”,“类型”和“使用”,例如这个那个
2个回答

9
每个模式文档都为一个命名空间定义了组件(模式的一部分)。因此,要定义您的属性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:something的声明需要以某种方式允许这个属性存在,可以使用属性引用(<xs:attribute ref="ns2:extraAtt"/>)或者属性通配符(<xs:anyAttribute namespace="http://example.com/my-ns2"/>或类似的方式)来实现。很抱歉规范的可读性不佳,这是一个漫长的故事,但基本上WG的一些成员认为像您这样的人不存在(“除了实现者,没有人会阅读规范,只要他们不抱怨它足够可读”——至少在一些实现者抱怨之前是这样说的,后来他们就转移了话题)。

谢谢您的回答!但我有点失望,因为如果ns1的模式作者没有预见到允许扩展,那么我的XML文档就无法有效。;-) 如果ns1的格式仅在DTD中定义,而据我所知,它没有等效于xs:anyAttribute,那么这是否使我的文档有效或无效?(我希望我表达清楚了。) - scozy
1
术语的定义者可以决定其含义。元素ns1:something的定义者可以决定将什么内容视为有效实例。术语“有效”是描述文档与给定模式之间关系的技术术语;DTD有效性是以DTD符号写成的模式为基础定义的,XSD有效性是以XSD模式为基础定义的;两者都不支持混合模式语言验证。这是否对您有影响取决于您希望文档具备有效性的原因。 - C. M. Sperberg-McQueen
1
如何将 ns2:extraAtt 属性限制为仅在 ns1:something 元素中使用? - Nashev

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是一个简单的字符串——您可以使用任何类型,或限制现有类型等。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接