为直接定义的属性或引用选择XML实例上的属性

时间:2010-10-11 15:13:56

标签: xml xsd

我正在寻找一种为元素选择属性的变体,可以直接设置或引用。

这就是我的想法:

<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”...

这个问题听起来纯粹是虚拟的和学术性的,但如果可能有解决方案,或者我对自己的想法完全出错,我会很高兴。)

提前感谢您的帮助!

戴夫

2 个答案:

答案 0 :(得分:1)

在我看来,不可能像你想要的那样定义XML Schema。您应该使用不同的强制属性集定义两个不同的元素名称,例如<attribute><attributeRef>,或者您既不应定义"ref"也不应定义"name"属性为"required"

XML Schema不是验证数据的唯一方法,您无法在XML Schema方面定义属性值之间的某些角色。因此,如果确实需要在XML文档中验证更复杂的关系,可以使用XPath和XSLT执行此操作(请参阅SchematronXML Schema Language ComparisonBeyond W3C XML SchemaImproving 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元素确保仅使用refname中的一个。