我可以通过XSD强制元素(complexType和mixed)的文本,并且基于枚举强制一个属性

时间:2011-03-17 02:55:28

标签: xml xsd xsd-validation

我有这个XML

<button onclick="alert('submit')" replace="append" forid="loginbutton" id="btnLogin" >Click Me</button>

我有这个XSD

  <xs:element name="button" >
    <xs:complexType mixed="true">
                <xs:attribute name="forid" use="required" type="xs:string" />
                <xs:attribute name="onclick" use="required" />
                <xs:attribute name="id" use="optional" />
                <xs:attribute name="replace" use="required">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="modify" />
                            <xs:enumeration value="append" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
    </xs:complexType>
  </xs:element>

我想要两件事

  1. 按钮内容文本在所有情况下都必须是
  2. 如果replace属性的值为'追加',那么属性id将是强制性的

2 个答案:

答案 0 :(得分:3)

如果您将其设置为带有简单内容的复杂类型,则可以使用xs:enumeration约束文本的允许值。如果你把它变成一个带有混合内容的复杂类型,那么你就无法限制文本中的内容。在我看来,你想要简单的内容,而不是混合内容(没有子元素)。

您无法使用XSD 1.0定义共同约束(一件事物的值取决于另一件事物的值) - 因为您需要XSD 1.1。目前只有Saxon和Xerces才支持XSD 1.1。

答案 1 :(得分:1)

我设法以某种方式完成它。我完全不明白,基本上我只是做了反复试验。如果有人能解释这意味着什么,我将感激不尽。

<xs:element name="button">
    <xs:complexType>
        <xs:simpleContent>
            <xs:restriction base="xs:anyType">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1" />

                    </xs:restriction>
                </xs:simpleType>
                <xs:attribute name="forid" use="required" type="xs:string" />
                <xs:attribute name="onclick" />
                <xs:attribute name="id" use="optional" />
                <xs:attribute name="type" use="required" />
                <xs:attribute name="replace" use="required">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="modify" />
                            <xs:enumeration value="append" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>

            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>