【问题标题】:XSD 1.1 structure to enforce unique IDs (if necessary)?XSD 1.1 结构强制执行唯一 ID(如有必要)?
【发布时间】:2017-08-25 11:35:20
【问题描述】:

我是否需要 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 断言需要在密切相关的元素/属性上。

可能相关:

【问题讨论】:

  • 我很想在这里得到一些 cmet 来了解我如何才能失去反对票!

标签: xml validation uniqueidentifier xsd-1.1


【解决方案1】:

是的,这需要 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)"

但这可能效率要低得多。

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

【讨论】:

  • 谢谢迈克尔,这太棒了。即使没有诊断,它也非常有用。
  • 所以在上面的例子中,断言应该在&lt;record&gt;的定义中,因为它包含id属性?
  • 您可以在路径中的谓词中指定排除项,例如路径可能是.//record[not(@status='excluded')/@id
  • 它必须在包含所有 id 的元素上定义,即在您的情况下为 &lt;file&gt;
  • 类似,但它缺乏从唯一性检查中排除某些元素的关键方面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2010-09-10
相关资源
最近更新 更多