我一直在使用一种 XML 格式,它混合了不同的现有格式和一些自定义元素和属性,我认为我应该为这些自定义位编写一个模式。
我要做的一件事是在现有格式的元素上使用自定义属性,如下所示:
<ns1:something attA="b" attB="a" ns2:extraAtt="c"/>
我知道这样做是允许的,但我想不出如何在 XML Schema 或者更糟糕的是在 DTD 中声明我的“extraAtt”。
我一直在使用一种 XML 格式,它混合了不同的现有格式和一些自定义元素和属性,我认为我应该为这些自定义位编写一个模式。
我要做的一件事是在现有格式的元素上使用自定义属性,如下所示:
<ns1:something attA="b" attB="a" ns2:extraAtt="c"/>
我知道这样做是允许的,但我想不出如何在 XML Schema 或者更糟糕的是在 DTD 中声明我的“extraAtt”。
每个架构文档为一个命名空间定义组件(架构的片段)。因此,要定义您的属性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 的一些成员并不认为像你这样的人存在(“除了实施者之外,没有人会阅读规范,只要他们不抱怨它的可读性就足够了”——至少,这就是他们在一些实施者大声而痛苦地抱怨之前说;然后他们只是改变了话题)。
要仅声明属性,您可以使用此 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
是一个简单的字符串 - 您可以使用任何类型,或限制现有类型等)