2010-10-11 72 views
6

我要找选择一个属性的元素的变体,可以直接设置或引用。选择在XML实例属性(S)直接定义的属性或引用

这就是我的想法:

<root>  
<element> 
    <attribute ref="shortname" /> 
</element> 
<element> 
    <attribute name="shortname" isEditable="true" anotherattrib="0815" /> 
</element> 
</root> 

由于这也不是没有的XML解决方案的问题,这个属性的定义是,如果需要元素属性的属性“名”挺难的。

方案可能看起来像这样

<xs:element name="attribute"> 
<xs:complexType> 
<xs:attribute name="ref" use="required" /> 
<xs:attribute name="name" use="required" /> 
</xs:complexType> 
</xs:element> 

是否有可能作出选择(类似于XS:为元素选择)属性之间?就像如果从名为ref的元素属性中有一个属性一样,则不允许其他属性。如果不是,属性“名称”必须设置...

这个问题听起来很纯虚和学术,但我会很高兴,如果有可能是一个解决方案,或者如果我完全错了与我有什么记: )

预先感谢您的帮助!

戴夫

回答

1

在我看来,这是不可能像你想定义的XML Schema。您应该定义两个不同的元素名称类似<attribute><attributeRef>具有不同的必需属性集,或者您应该既不将"ref"也不将"name"属性定义为"required"

XML Schema是不是验证数据的唯一方法,你不能对于XML模式定义的属性值之间的一些角色。因此,如果您确实需要在XML文档中验证更复杂的关系,则可以使用XPath和XSLT来执行此操作(请参阅Schematron,XML Schema Language Comparison,Beyond W3C XML Schema,Improving XML Document Validation with Schematron,Advanced XML validationUsing XSL as a Validation Language)。

+0

我认为,只有这样,才能表达这一点,将是:全内容声明一个复杂类型,对于限制声明两个派生类型,声明父内容使用的选择时。 – 2010-10-12 20:46:48

+0

@Alejandro:你可以声明两种类型。这不是问题,但是如何定义一个具有**相同名称**“”和不同类型的元素的选择?我不确定这是可能的。在我看来,你会收到错误,元素“”的定义是模糊的。 – Oleg 2010-10-12 21:07:29

+0

@Oleg:选择是两个元件(每一个与不同的派生类型),但相同的名称,**在父声明**之间,如例如:复杂类型名为'Base';从'Base'派生的complexType,名为'BaseA',有限制;对于名为'BaseB'的complexType也是一样的;元素名称“Parent”,可以在名为'Child'的元素与'BaseA'类型或名为'Child'的元素与'BaseB'类型之间进行选择。 – 2010-10-12 22:14:45

0

这可以通过XML模式断言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和一个被使用。