仅在设置了其他属性时才需要创建属性

时间:2012-10-05 12:14:06

标签: xsd

如果设置了另一个属性,是否可以创建属性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"/>

2 个答案:

答案 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"/>

这符合您的需求吗?