1

我是否需要 XSD 1.1 在具有如下文件/记录结构的单个 XML 文件中强制执行 ID 唯一性:

<?xml version="1.1" encoding="UTF-8"?>

<file>

<record id="1" status="ok">
    <info1></info1>
    <info2></info2>
    <!-- etc... -->
</record>

<record id="2" status="ok">
    <info1></info1>
    <info2></info2>
    <!-- etc... -->
</record>

<record id="1" status="duplicate_deprecated">
    <info1></info1>
    <info2></info2>
    <!-- etc... -->
</record>

我还想允许某些重复的 ID,条件是它们与例如一个属性相结合,意思是“删除/停止使用这个版本的记录,用具有相同 ID 的其他记录替换这个(现在)弃用的重复”(在示例中,记录 1)。

这对于 XML 模式 1.0 是否可行,还是需要 XSD 1.1 断言(等等)?

需要什么样的通用 XML 实例结构才能使这个断言起作用?我知道 XSD 1.1 断言需要在密切相关的元素/属性上。

可能相关:

4

1 回答 1

2

是的,这需要 XSD 1.1。不幸的是,您可以在 xs:unique / xs:key 上使用的 XPath 表达式不包括谓词(即使在 XSD 1.1 中),因此只能通过断言来完成。

断言唯一性的典型方式是

test="count(PATH) = count(distinct-values(PATH))"

不幸的是,这并没有给出任何关于有问题的重复项是什么的诊断。某些处理器可能会为您提供更好的诊断

test="every $M in PATH, $N in PATH satisfies ($M is $N or $M ne $N)"

但这可能效率要低得多。

断言应该在包含所有要测试唯一性的值的最里面的元素上指定。

于 2017-03-31T09:59:12.227 回答