不明确的 XML 架构

发布于 2024-07-10 12:43:00 字数 1943 浏览 11 评论 0原文

我正在尝试为类似于以下内容的 XML 生成一个非常简单的 XML 模式:

<messages>
  <item>
    <important_tag></important_tag>
  </item>
  <item>
    <important_tag></important_tag>
    <tag2></tag2>
  </item>
  <item>
    <tag2></tag2>
    <tag3></tag3>
  </item>
</messages>

这个想法是 将有一个特定的定义,并且它可能会或可能不会出现在 下<项目>。 它也可能出现多次。 此外,在 之前或之后可能还有其他我无法提前命名的标签。

我想给一个具体的定义。 例如,定义它必须包含的属性。 我的意思是 if important_tag 存在,它必须符合我的定义。 任何其他标签不必符合任何定义。

我尝试使用以下方案:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="messages">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="important_tag" minOccurs="0"/>
        <xs:any minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="important_tag">
    <xs:complexType>
      <xs:simpleContent>
        ... specific definitions for important_tag ...
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

这会导致错误,指出该架构不明确。

确切的错误消息是:

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.

我正在使用 Altova 的 XML Spy。

我该如何解决这个问题?

谢谢, 达纳

I'm trying to produce a pretty simple XML schema for an XML similar to the following:

<messages>
  <item>
    <important_tag></important_tag>
  </item>
  <item>
    <important_tag></important_tag>
    <tag2></tag2>
  </item>
  <item>
    <tag2></tag2>
    <tag3></tag3>
  </item>
</messages>

The idea is that <important_tag> will have a specific definition AND it may or may not appear under <item>. It may also appear more than once.
Additionally, there may be other tags before or after <important_tag> that I can not name in advance.

I would like to give a specific definition for <important_tag>. For example, define attributes that it must contain.
What I mean is that if important_tag is present it must conform to my definition. Any other tag doesn't have to conform to any definition.

I tried using the following scheme:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="messages">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="important_tag" minOccurs="0"/>
        <xs:any minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="important_tag">
    <xs:complexType>
      <xs:simpleContent>
        ... specific definitions for important_tag ...
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

This results in an error saying that the schema is ambiguous.

The exact error message is:

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.

I'm using Altova's XML Spy.

How do I solve this?

Thanks,
Dana

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

成熟的代价 2024-07-17 12:43:00

MSDN 上有一篇很棒的文章讨论了设计可扩展架构,您可以在此处找到该文章,我建议您仔细阅读所有内容,但具体到您的观点,它解释了为什么您在“使用 XML 架构设计可版本化的 XML 格式”下的第 2 点中收到此错误(您可以搜索“非-确定性”并直接到达那里。

基本上,一旦您有了 xs:any 元素,验证器就无法假设有关其他同级元素的任何信息,因此 - 您很可能有一个不需要这些强制属性的 important_tag 定义,因此这些元素无法验证

There is a great article on MSDN that talks about desigining extensible schemas, which you can find here, I suggest you go through it all, but specifically to your point it explains why you're getting this error in point 2. under "Using XML Schema to Design a Versionable XML Format" (you can search for "non-deterministic" and get straight there.

Basically, once you have an xs:any element the validator cannot assume anything about the other sibling elements, so - you might well have a definition for important_tag that does not require those mandatory attributes and so those elements cannot be validated

旧竹 2024-07-17 12:43:00

关于错误:该错误消息提到的一行不在您包含的 xsd 中,但其中的这两行不明确:

<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>

显示歧义的最简单示例是如果只有一个

  <important_tag></important_tag>

问题是它可以被解释为一个“important_tag”和零个“any”标签(这就是您想要的),但它也可以被解释为零个“important_tag”和一个“any”标签。 这是因为“any”标签可以匹配任何标签,包括“important_tag”。

我读到,下一版本的 XML Schema 使您能够说出您的意思:除了 important_tag 之外的任何标记。

以两种不同方式匹配 XML 类似于以两种不同方式匹配“a”的正则表达式“a*a*”(第一个“a”;或第二个“a”)。 这种歧义过去在 DTD 的 XML 规范中被称为“非确定性”,但 XML 模式规范将其称为“唯一粒子属性规则”(UPA),这意味着您应该能够辨别模式的哪个部分获得每个部分XML 文档的。

Regarding the error: that error message mentions a line that's not in the xsd you included, but these two lines in it are ambiguous:

<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>

The simplest example to show the ambiguity is if there was just one <important_tag>:

  <important_tag></important_tag>

The problem is that it could be interpreted as one "important_tag" and zero "any" tags (which is what you wanted), but it can also be interpreted as zero "important_tag" and one "any" tags. This is because the "any" tag can match any tag, including "important_tag".

I've read that the next version of XML Schema enables you to say what you meant: any tag except important_tag.

Matching the XML in two different ways is similar to the regular expression "a*a*" matching "a" in two different ways (one first "a"; or one second "a"). This ambiguity used to be called "non-deterministic" in the XML spec for DTDs, but the XML Schema spec calls it the Unique Particle Attribution rule (UPA), meaning that you should be able to tell which part of the schema gets each part of the XML document.

夏有森光若流苏 2024-07-17 12:43:00

根据您的要求(例如“任何其他标签不必符合任何定义。”), Schematron基于规则(“这必须是真的”,“那必须是假”)的 可能是比 W3C Schema 更好的解决方案,W3C Schema 更“一切都必须是这样的”。

With your requirments (things like "Any other tag doesn't have to conform to any definition."), Schematron, which is based on rules ("this must be true", "that must be false") is may be a better solution than W3C Schema, which is more "everything must be like that".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文