5

required如果设置了另一个属性,是否可以创建一个属性?

例如,在下面的代码中,必须viewId设置属性,但设置了属性。requiredaction

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"/>
4

2 回答 2

5

单独使用 XSD 1.0 是不可能的。您必须使用另一种 XML 模式语言来补充或代替 XSD,或者迁移到 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>
于 2012-10-05T13:11:38.947 回答
1

您可以为包含@id 定义的元素“节点”(我们称之为abstactNode)创建一个抽象复杂类型。

然后使用@destination 的定义创建一个扩展abstactNode 的复杂类型“nodeWithDestination”。

第二个复杂类型“nodeWithActionAndViewId”也扩展了abstactNode,具有@action 和@viewId 属性定义。

您的 XML 将如下所示:

<node id="id1" destination="http://www.yahoo.com" xsi:type="nodeWithDestination"/>
<node id="id2" action="demo" viewId="demo.asp" xsi:type="nodeWithActionAndViewId"/>

这符合您的需要吗?

于 2012-10-09T15:19:58.647 回答