如果设置了另一个属性,是否可以创建属性required
?
E.g。在以下代码中,viewId
属性必须设为required
,iff action
属性已设置。
XML:
<node id="id1" destination="http://www.yahoo.com" />
<node id="id2" action="demo" viewId="demo.asp"/>
如果有可能,请告诉我这是怎么做的。截至目前,我在所有情况下viewId
设置了required
,因此第一个node
元素未通过验证。
<xsd:attribute name="focusViewId" type="xsd:anyURI" use="required"/>
答案 0 :(得分:3)
单独使用XSD 1.0是不可能的。除了XSD之外或者代替XSD,您必须使用另一种XML模式语言,或者转移到XSD 1.1。
另一种选择可能是重构您的架构。如果@destination与{@action,@ viewId}互斥,也许您可以使用元素,这样就可以使用xsd:choice
。
更新:对于XSD 1.1
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="node">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:ID" use="required"/>
<xsd:attribute name="destination" type="xsd:string"/>
<xsd:attribute name="action" type="xsd:string"/>
<xsd:attribute name="viewId" type="xsd:string"/>
<xsd:assert test="(@viewId) or not(@action)" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
答案 1 :(得分:1)
您可以为元素“node”(让我们称之为abstactNode)创建一个抽象复杂类型,其中包含@id的定义。
然后创建一个复杂类型“nodeWithDestination”,它扩展了abstactNode,并定义了@destination。
第二个复杂类型“nodeWithActionAndViewId”,它也使用@action和@viewId属性定义扩展了abstactNode。
你的XML看起来像这样:
<node id="id1" destination="http://www.yahoo.com" xsi:type="nodeWithDestination"/>
<node id="id2" action="demo" viewId="demo.asp" xsi:type="nodeWithActionAndViewId"/>
这符合您的需求吗?