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

XML more specific validation through xsd assert

这是一个我需要改进的模式,通过断言如果 rule/type 的值为 ABReturn = 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>

如果我理解得很好,如果 Type 值为 AB,您希望 Return 值为真。如果是这样,您可以使用此断言:

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

解释:

  1. 您应该只使用 @name 来获取名为 name 的属性,如果您正在 select 创建一个元素,则不得使用 @name 足以 select 一个名为 name.
  2. 的元素
  3. $value 是一个只出现在 <xs:assertion> 中的简单值的变量,它不出现在 <xs:assert>.
  4. 在 XPath 中,如 'val2' = ('val1', 'val2', 'val3') returns 如果左侧的某些元素出现在右侧序列中,则表达式为真。尽管您的 or 方法也有效。

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