我正在尝试调试为什么使用 XSD 验证 XML 没有检测到唯一性约束违规。给定下面的 XML 数据以及其后的 XSD 架构,UniqueParameterNameConstraint 唯一性规则将不会检测到具有相同名称 CREAM_AMOUNT 的两个参数的违规情况。
如果我从 XML 和 XSD 中删除对“MySchema”的引用,则约束将起作用并检测到唯一性违规。
我是 XML 模式的新手,无法解释为什么命名空间声明会影响行为。
<RecipeElement xmlns="urn:MySchema">
<Parameter>
<Name>CREAM_AMOUNT</Name>
</Parameter>
<Parameter>
<Name>CREAM_AMOUNT</Name>
</Parameter>
<Parameter>
<Name>FLAVOR_AMOUNT</Name>
</Parameter>
<Parameter>
<Name>MILK_AMOUNT</Name>
</Parameter>
<Parameter>
<Name>SUGAR_AMOUNT</Name>
</Parameter>
</RecipeElement>
<xs:schema targetNamespace="urn:MySchema" xmlns="urn:MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="ParameterType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RecipeElementType">
<xs:sequence>
<xs:element name="Parameter" type="ParameterType" minOccurs="0" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="RecipeElement" type="RecipeElementType">
<xs:unique name="UniqueParameterNameConstraint">
<xs:selector xpath="Parameter"/>
<xs:field xpath="Name"/>
</xs:unique>
</xs:element>
</xs:schema>
我发现我在以下链接中犯了一个“常见错误”:
https://support.liquid-technologies.com/kb/a79/creating-a-unique-constraint-with-an-xsd.aspx
根据链接,“如果架构声明了目标命名空间,则 XPath 表达式必须是完全限定的。”。
我更新的 XSD 如下所示:
<xs:schema targetNamespace="urn:MySchema" xmlns:ms="urn:MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="ParameterType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RecipeElementType">
<xs:sequence>
<xs:element name="Parameter" type="ms:ParameterType" minOccurs="0" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="RecipeElement" type="ms:RecipeElementType">
<xs:unique name="UniqueParameterNameConstraint">
<xs:selector xpath="ms:Parameter"/>
<xs:field xpath="ms:Name"/>
</xs:unique>
</xs:element>
</xs:schema>