【问题标题】:Use of XSD unique the identity constraint on attributes that are not required对不需要的属性使用 XSD 唯一的身份约束
【发布时间】:2019-11-27 19:06:09
【问题描述】:

我有一个 XSD,其中 xs:float 类型的相同属性(例如 FullStartOrder)用于多个元素,但不是所有元素。 XSD 不需要该属性(例如 FullStartOrder)。有一个编辑要求是确保在提供(例如 FullStartOrder)属性的所有元素中不使用相同的浮点数。

我的理解是不能使用身份约束“key”,因为“key”需要“身份约束Selector”和“身份约束字段”来存在。不符合此用例,因为该属性是可选的。因此,正在使用“唯一身份约束”。 标识约束在根元素上,因为根元素是定义唯一性的范围。但是以下每个“身份约束选择器”都有某种类型的错误。我也理解身份约束中的 XPath 规则支持 1.1 版中的完整 XPath 规范。

测试 1

<xs:unique name="NoDuplicateFullStartOrder">
    <xs:selector xpath="utils:."/>
    <xs:field xpath="@FullStartOrder"/>
</xs:unique>

已尝试 XSD 或示例 XML 中没有错误。

失败 1

但存在重复值时不会出错。

测试 1.1

<xs:unique name="NoDuplicateFullStartOrder">
    <xs:selector xpath="utils:."/>
    <xs:field xpath="utils:@FullStartOrder"/>
</xs:unique>

尝试在 XSD 的验证检查期间产生以下错误。

失败1.1

身份约束定义“utils:NoDuplicateFullStartOrder”的属性“xpath”的值“utils:@FullStartOrder”不是有效的受限 XPath 表达式。

测试 2

<xs:unique name="NoDuplicateFullStartOrder">
    <xs:selector xpath="utils://"/>
    <xs:field xpath="@FullStartOrder"/>
</xs:unique>

尝试在 XSD 的验证检查期间产生以下错误。

失败2

身份约束定义“NoDuplicateFullStartOrder”的属性“//”的值“//”不是有效的受限 XPath 表达式。

测试 3

什么时候

<xs:unique name="NoDuplicateFullStartOrder">
    <xs:selector xpath="utils:."/>
    <xs:field xpath="@FullStartOrder"/>
</xs:unique>

尝试在 XSD 的验证检查期间产生以下错误。

失败 3

身份约束定义“NoDuplicateFullStartOrder”的属性“//”的值“//”不是有效的受限 XPath 表达式。

我什至尝试过添加(未在 XSD sn-p 下面显示。)但随后 id 也不起作用。

xmlns:utils=http://www.mycompany.com/utils
targetNamespace="http://www.mycompany.com/utils" 
elementFormDefault="qualified"

应如何指定以下身份约束以满足要求?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
    <xs:element name="ENTER_NAME_OF_ROOT_ELEMENT_HERE">
.
.
.
        <xs:unique name="NoDuplicateFullStartOrder">
            <xs:selector xpath="."/>
            <xs:field xpath="@FullStartOrder"/>
        </xs:unique>
.
.
.
    </xs:element>
</xs:schema>

示例无效文档。

所有 FullStartOrder 属性都有相同的值,1.0

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2020 (x64) (http://www.altova.com)-->
<utils:Utils xmlns:utils="http://www.bcbst.com/utils" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bcbst.com/utils utils_properties_1_1_1.xsd">
.
.
.
    <utils:Hosts>
        <utils:Host utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
            <utils:Host_FQDN>anwas42.bcbst.com</utils:Host_FQDN>
.
.
.
        </utils:Host>
        <utils:Host utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Host>
        <utils:Host utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Host>
    </utils:Hosts>
    <utils:Deployment_Managers>
        <utils:Deployment_Manager utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
        <utils:Deployment_Manager utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
        <utils:Deployment_Manager utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
    </utils:Deployment_Managers>
    <utils:Node_Agents>
        <utils:Node_Agent utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
        <utils:Node_Agent utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
        <utils:Node_Agent utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
    </utils:Node_Agents>
    <utils:Clusters>
        <utils:Cluster utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
            </utils:Cluster_Member>
.
.
.
        </utils:Cluster>
    </utils:Clusters>
.
.
.
</utils:Utils>

有效文件示例

所有 FullStartOrder 属性都有不同的值

FullStopOrder、CellStartOrder 和 CellStopOrder 没有任何约束,但是一旦 FullStartOrder 约束起作用

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2020 (x64) (http://www.altova.com)-->
<utils:Utils xmlns:utils="http://www.bcbst.com/utils" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bcbst.com/utils utils_properties_1_1_1.xsd">
.
.
.
    <utils:Hosts>
        <utils:Host utils:FullStartOrder="1.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
            <utils:Host_FQDN>anwas42.bcbst.com</utils:Host_FQDN>
.
.
.
        </utils:Host>
        <utils:Host utils:FullStartOrder="2.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Host>
        <utils:Host utils:FullStartOrder="3.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Host>
    </utils:Hosts>
    <utils:Deployment_Managers>
        <utils:Deployment_Manager utils:FullStartOrder="4.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
        <utils:Deployment_Manager utils:FullStartOrder="5.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
        <utils:Deployment_Manager utils:FullStartOrder="6.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Deployment_Manager>
    </utils:Deployment_Managers>
    <utils:Node_Agents>
        <utils:Node_Agent utils:FullStartOrder="7.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
        <utils:Node_Agent utils:FullStartOrder="8.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
        <utils:Node_Agent utils:FullStartOrder="9.0" utils:FullStopOrder="1.0" utils:InvokeType="asynchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
        </utils:Node_Agent>
    </utils:Node_Agents>
    <utils:Clusters>
        <utils:Cluster utils:FullStartOrder="10.0" utils:FullStopOrder="1.0" utils:InvokeType="synchronous" utils:CellStartOrder="1.0" utils:CellStopOrder="1.0">
.
.
.
            </utils:Cluster_Member>
.
.
.
        </utils:Cluster>
    </utils:Clusters>
.
.
.
</utils:Utils>

XSD

【问题讨论】:

    标签: xml xpath xsd-1.1


    【解决方案1】:

    我对身份约束的理解使我把身份 对根元素的约束。

    它应该放在限定唯一性的元素上。如果 Y 中的每个 X 都必须具有唯一的 Z 值,那么约束应该在 Y 元素上;选择器应选择相对于 Y 的 X,字段应选择相对于 X 的 Z。

    But each of the following “identity constraint Selectors” has some type of error.

    具体一点:告诉我们您做了什么,并告诉我们它是如何失败的。

    这也是我对身份约束中的XPath规则的理解 支持 1.1 版中的完整 XPath 规范。

    不,这是不正确的。身份约束仍然使用受限的 XPath 子集。您可以在断言和条件类型分配中使用完整的 XPath,但不能在标识约束中使用。见https://www.w3.org/TR/xmlschema11-1/#coss-identity-constraint

    【讨论】:

    • 在这种情况下,“限定唯一性的元素”是根元素。我已经更新了问题以反映这一点。 “具体一点:告诉我们你做了什么,并告诉我们它是如何失败的。”我已经更新了问题,以使尝试过的每件事都更加清晰。
    • 至少显示一个有效和无效文档的示例会很有用。
    • 添加到原始帖子的有效和无效 XML 示例。还添加了 XSD 图。
    • @Michael Kay:时间允许您按照您的要求查看问题的最新更新吗?请。
    • 首先,您的属性utils:FullStartOrder 在命名空间中,而您的XPath 表达式正在寻找无命名空间的属性FullStartOrder
    猜你喜欢
    • 2019-01-10
    • 2013-01-18
    • 2012-05-08
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多