为什么 XML 模式验证没有检测到这种唯一性约束违规?

问题描述 投票:0回答:1

我正在尝试调试为什么使用 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>
xml xsd xsd-validation
1个回答
0
投票

我发现我在以下链接中犯了一个“常见错误”:

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>
© www.soinside.com 2019 - 2024. All rights reserved.