我正在寻找一种为元素选择属性的变体,可以直接设置或引用。
这就是我的想法:
<root>
<element>
<attribute ref="shortname" />
</element>
<element>
<attribute name="shortname" isEditable="true" anotherattrib="0815" />
</element>
</root>
由于没有xml方案这不会有问题,如果需要element属性的“name”属性,则该属性的定义非常困难。
该计划可能看起来像这样
<xs:element name="attribute">
<xs:complexType>
<xs:attribute name="ref" use="required" />
<xs:attribute name="name" use="required" />
</xs:complexType>
</xs:element>
是否有可能在属性之间做出选择(类似于xs:元素的选择)?就像从名为ref的元素属性中存在属性一样,不允许其他属性。如果不是,则必须设置属性“name”...
这个问题听起来纯粹是虚拟的和学术性的,但如果可能有解决方案,或者我对自己的想法完全出错,我会很高兴。)
提前感谢您的帮助!
戴夫
答案 0 :(得分:1)
在我看来,不可能像你想要的那样定义XML Schema。您应该使用不同的强制属性集定义两个不同的元素名称,例如<attribute>
和<attributeRef>
,或者您既不应定义"ref"
也不应定义"name"
属性为"required"
。
XML Schema不是验证数据的唯一方法,您无法在XML Schema方面定义属性值之间的某些角色。因此,如果确实需要在XML文档中验证更复杂的关系,可以使用XPath和XSLT执行此操作(请参阅Schematron,XML Schema Language Comparison,Beyond W3C XML Schema,Improving XML Document Validation with Schematron,{{ 3}}和Advanced XML validation)。
答案 1 :(得分:0)
这可以通过XML Schema 1.1断言来实现:
<xsd:complexType name="AttributeType">
<xsd:sequence />
<xsd:attribute name="ref" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:assert test="count(@ref | @name) = 1" />
</xsd:complexType>
assert
元素确保仅使用ref
和name
中的一个。