这是一个架构,我需要改进以通过断言进行验证,如果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
,我仍然会收到相同的错误。
答案 0 :(得分:1)
如果我完全理解,如果Return
值为Type
或A
,则您希望B
值为true。如果是这样,你可以使用这个断言:
<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>
说明:
@name
获取名为name
的属性,如果您选择元素,则不得使用@
,name
需要选择元素名为name
。$value
是一个仅在<xs:assertion>
中出现的简单值变量,<xs:assert>
中不存在。'val2' = ('val1', 'val2', 'val3')
之类的表达式将返回true。尽管您的方法或方法也有效。您似乎需要阅读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 <= 300 and number > 200
else if (@dept = 'MEN')
then number < 200
else false()"/>
</xs:complexType>