XML 通过 xsd 断言进行更具体的验证
XML more specific validation through xsd assert
这是一个我需要改进的模式,通过断言如果 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 <= 300 and number > 200
else if (@dept = 'MEN')
then number < 200
else false()"/>
</xs:complexType>
如果我理解得很好,如果 Type
值为 A
或 B
,您希望 Return
值为真。如果是这样,您可以使用此断言:
<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>
解释:
- 您应该只使用
@name
来获取名为 name
的属性,如果您正在 select 创建一个元素,则不得使用 @
,name
足以 select 一个名为 name
. 的元素
$value
是一个只出现在 <xs:assertion>
中的简单值的变量,它不出现在 <xs:assert>
. 中
- 在 XPath 中,如
'val2' = ('val1', 'val2', 'val3')
returns 如果左侧的某些元素出现在右侧序列中,则表达式为真。尽管您的 or 方法也有效。
如果您愿意,可以阅读 XPath 规范或 XPath 教程以更好地了解它。
这是一个我需要改进的模式,通过断言如果 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 <= 300 and number > 200
else if (@dept = 'MEN')
then number < 200
else false()"/>
</xs:complexType>
如果我理解得很好,如果 Type
值为 A
或 B
,您希望 Return
值为真。如果是这样,您可以使用此断言:
<xsd:assert test="if (Type = ('A', 'B')) then Return = true() else true()"/>
解释:
- 您应该只使用
@name
来获取名为name
的属性,如果您正在 select 创建一个元素,则不得使用@
,name
足以 select 一个名为name
. 的元素
$value
是一个只出现在<xs:assertion>
中的简单值的变量,它不出现在<xs:assert>
. 中
- 在 XPath 中,如
'val2' = ('val1', 'val2', 'val3')
returns 如果左侧的某些元素出现在右侧序列中,则表达式为真。尽管您的 or 方法也有效。
如果您愿意,可以阅读 XPath 规范或 XPath 教程以更好地了解它。