XML通过xsd断言进行更具体的验证

XML通过xsd断言进行更具体的验证,xml,xsd,assert,complextype,Xml,Xsd,Assert,Complextype,这是一个我需要改进的模式,通过断言来验证,如果rule/type的值为a或B,则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 n

这是一个我需要改进的模式,通过断言来验证,如果
rule/type
的值为
a
B
,则
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
,我仍然会得到相同的错误。

请遵循以下示例:

它处理条件测试

<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>

请遵循以下示例:

它处理条件测试

<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>

请遵循以下示例:

它处理条件测试

<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>

请遵循以下示例:

它处理条件测试

<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>

如果我理解清楚,您希望
返回
值,如果
Type
值是
A
B
。如果是,您可以使用以下断言:

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

说明:

  • 只能使用
    @name
    来获取名为
    name
    的属性,如果要选择元素,则不能使用
    @
    如果要选择名为
    name
    的元素,
    name
    是enoug
  • $value
    是仅存在于
    中的变量。对于简单值,它不存在于
  • 在XPath中,如果左边的某个元素出现在右边的序列中,则类似于
    'val2'=('val1','val2','val3')
    的表达式将返回true,尽管您的or方法也是有效的

  • 如果您愿意,您可以阅读XPath规范或XPath教程来更好地了解它。

    如果我理解得很好,您希望
    Type
    值为
    A
    B
    时返回
    值为true。如果是,您可以使用以下断言:

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

  • 只能使用
    @name
    来获取名为
    name
    的属性,如果要选择元素,则不能使用
    @
    如果要选择名为
    name
    的元素,
    name
    是enoug
  • $value
    是仅存在于
    中的变量。对于简单值,它不存在于
  • 在XPath中,如果左边的某个元素出现在右边的序列中,则类似于
    'val2'=('val1','val2','val3')
    的表达式将返回true,尽管您的or方法也是有效的

  • 如果您愿意,您可以阅读XPath规范或XPath教程来更好地了解它。

    如果我理解得很好,您希望
    Type
    值为
    A
    B
    时返回
    值为true。如果是,您可以使用以下断言:

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

  • 只能使用
    @name
    来获取名为
    name
    的属性,如果要选择元素,则不能使用
    @
    如果要选择名为
    name
    的元素,
    name
    是enoug
  • $value
    是仅存在于
    中的变量。对于简单值,它不存在于
  • 在XPath中,如果左边的某个元素出现在右边的序列中,则类似于
    'val2'=('val1','val2','val3')
    的表达式将返回true,尽管您的or方法也是有效的

  • 如果您愿意,您可以阅读XPath规范或XPath教程来更好地了解它。

    如果我理解得很好,您希望
    Type
    值为
    A
    B
    时返回
    值为true。如果是,您可以使用以下断言:

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

  • 只能使用
    @name
    来获取名为
    name
    的属性,如果要选择元素,则不能使用
    @
    如果要选择名为
    name
    的元素,
    name
    是enoug
  • $value
    是仅存在于
    中的变量。对于简单值,它不存在于
  • 在XPath中,如果左边的某个元素出现在右边的序列中,则类似于
    'val2'=('val1','val2','val3')
    的表达式将返回true,尽管您的or方法也是有效的

  • 如果你愿意,您可以阅读XPath规范或XPath教程以更好地了解它。

    实际上,这是我的想法来源的示例,但我需要访问此任务的类型和返回元素,并且似乎可以找到一个合适的示例。实际上,这是我的想法来源的示例,但我需要访问类型和返回元素返回此t的元素