或xmlschema中复杂类型的语句

时间:2014-03-06 13:44:34

标签: xml xsd complextype

如何在XMLSchema中定义这种元素模式?
<port num="80"/>
<port min="80" max="443"\>
因为 port 必须由属性 num 范围定义。

2 个答案:

答案 0 :(得分:2)

helderdarocha已经指向XSD 1.1。另一种方法是重新考虑您的设计。它目前对两种不同的结构使用相同的名称;给他们不同的名字会使问题变得微不足道。

<portnum num="80"/>
<portrange min="80" max="443"/>

<port><num>80</num></port>
<port><range min="80" max="443"/></port>

答案 1 :(得分:1)

如果您的解析器支持W3C XSD 1.1,则可以实现这一点:

<xs:element name="port" type="portType" />
<xs:complexType name="portType">
    <xs:attribute name="min" type="xs:integer" use="optional"/>
    <xs:attribute name="max" type="xs:integer" use="optional"/>
    <xs:attribute name="num" type="xs:integer" use="optional"/>
    <xs:assert test="@num or (@max and @min)" />
</xs:complexType>

如果您的解析器不支持XSD 1.1,您可以使用XSD 1.0 + Schematron,将断言放在xs:annotation/xs:appinfo中,并使用XSLT或一些外部工具来验证它们。在您的情况下,在XSD验证后检查运行解析器的语言中的断言可能更简单。