通过xsd assert

时间:2015-07-17 19:13:28

标签: xml xsd assert complextype

这是一个架构,我需要改进以通过断言进行验证,如果rule/type的值为AB,那么Return = true 在类似的事情:

<xsd:assert test="if (@type$value = A or @type$value= B) then @return$value = true" />

这是我一直在工作的XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="Rule">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="A"/>
        <xsd:enumeration value="B"/>
        <xsd:enumeration value="C"/>
        <xsd:enumeration value="D"/>
        <xsd:enumeration value="E"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="cType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="C-val1"/>
        <xsd:enumeration value="C-val2"/>
        <xsd:enumeration value="C-val3"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="DType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="D-val1"/>
        <xsd:enumeration value="D-val2"/>
        <xsd:enumeration value="D-val3"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:element name="Rule">
    <xsd:complexType>
        <xsd:complexContent>
            <xsd:restriction base="xsd:anyType">
                <xsd:sequence>
                    <xsd:element name="Type" type="Rule"/>
                    <xsd:element name="Return" type="xsd:boolean"/>
                    <xsd:choice>
                        <xsd:element name="BConfig"/>
                        <xsd:element name="AConfig"/>
                        <xsd:element name="CConfig" type="CRule"/>
                        <xsd:element name="DConfig" type="DRule"/>
                        <xsd:element name="EElement" type="xsd:integer"/>
                    </xsd:choice>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:element>
<xsd:complexType name="CRule">
    <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
            <xsd:sequence>
                <xsd:element name="C" type="CType" maxOccurs="3" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DRule">
    <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
            <xsd:sequence>
                <xsd:element name="D" type="DType" maxOccurs="3" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

但不知道如何正确使用资产

更新1:

在sergiofc之后,这是更新的架构

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="Rule">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="A"/>
        <xsd:enumeration value="B"/>
        <xsd:enumeration value="C"/>
        <xsd:enumeration value="D"/>
        <xsd:enumeration value="E"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="cType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="C-val1"/>
        <xsd:enumeration value="C-val2"/>
        <xsd:enumeration value="C-val3"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="DType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="D-val1"/>
        <xsd:enumeration value="D-val2"/>
        <xsd:enumeration value="D-val3"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:element name="Rule">
    <xsd:complexType>
        <xsd:complexContent>
            <xsd:restriction base="xsd:anyType">
                <xsd:sequence>
                    <xsd:element name="Type" type="Rule"/>
                    <xsd:element name="Return" type="xsd:boolean"/>
                    <xsd:choice>
                        <xsd:element name="BConfig"/>
                        <xsd:element name="AConfig"/>
                        <xsd:element name="CConfig" type="CRule"/>
                        <xsd:element name="DConfig" type="DRule"/>
                        <xsd:element name="EElement" type="xsd:integer"/>
                    </xsd:choice>
                </xsd:sequence>
                <xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:element>
<xsd:complexType name="CRule">
    <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
            <xsd:sequence>
                <xsd:element name="C" type="CType" maxOccurs="3" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DRule">
    <xsd:complexContent>
        <xsd:restriction base="xsd:anyType">
            <xsd:sequence>
                <xsd:element name="D" type="DType" maxOccurs="3" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

但我仍然不知道在哪里找到xsd:assert,我仍然会收到相同的错误。

2 个答案:

答案 0 :(得分:1)

如果我完全理解,如果Return值为TypeA,则您希望B值为true。如果是这样,你可以使用这个断言:

<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>

说明:

  1. 您应该只使用@name获取名为name的属性,如果您选择元素,则不得使用@name需要选择元素名为name
  2. $value是一个仅在<xs:assertion>中出现的简单值变量,<xs:assert>中不存在。
  3. 在XPath中,如果左侧的某些元素出现在右侧序列中,则'val2' = ('val1', 'val2', 'val3')之类的表达式将返回true。尽管您的方法或方法也有效。
  4. 您似乎需要阅读XPath规范或至少是XPath教程。

答案 1 :(得分:0)

请遵循以下示例:

它涉及条件测试。

<xs:complexType name="ProductType">
  <xs:sequence>
    <xs:element name="number" type="xs:integer"/>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="size" type="xs:integer"/>
  </xs:sequence>
  <xs:attribute name="dept" type="xs:string"/>
  <xs:assert test="if (@dept = 'ACC')
                   then number > 500
                   else if (@dept = 'WMN')
                   then number &lt;= 300 and number > 200
                   else if (@dept = 'MEN')
                   then number &lt; 200
                   else false()"/>
</xs:complexType>