1

我正在尝试按顺序放置一个键,并且被错误轰炸。看来我不能这样做。此外,有人告诉我,我的密钥需要一个字段和选择器,但我几乎找不到相关文档。(事实上​​,在绝望中,我下载了 Liquid XML Studio [vs. Notepad] 并搜索了它的帮助文件......发现甚至没有提到“选择器”这个词)不管 - 我可以用什么方法来保证唯一,不是一个元素的空值,在一个序列中?(有问题的内容是一个字符串)

请注意,如果没有 key 元素,架构会验证。

错误

每个 cvc-complex-type.1.2.4 无效:元素 {http://www.w3.org/2001/XMLSchema}:key not allowed here (1) in element {http://www.w3.org/2001 /XMLSchema}:sequence, 期待 [{http://www.w3.org/2001/XMLSchema}:annotation, $, {http://www.w3.org/2001/XMLSchema}:element, {http:// /www.w3.org/2001/XMLSchema}:组,{http://www.w3.org/2001/XMLSchema}:选择,{http://www.w3.org/2001/XMLSchema}:序列, {http://www.w3.org/2001/XMLSchema}:any]:

架构

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="READOO" elementFormDefault="qualified">

  <xs:element name="ReferralCollection">
    <xs:complexType>
      <xs:sequence>
    <xs:key name="URL" type="string" />
        <xs:element maxOccurs="unbounded" name="keyword">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="occurrences" type="xs:int" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
4

2 回答 2

2

key元素不应该进入元素内部sequence。相反,您将其作为xs:element定义的子项ReferralCollectionselectorfield是元素的子元素,key定义什么是唯一的。两者都是 XPath 表达式。该selector值设置 XPath 上下文,field元素(可以有多个)定义应该是唯一的值的组合。所以在你的情况下,key元素可能看起来像这样:

<xs:key name="URL">
  <xs:selector xpath="."/>
  <xs:field xpath="rd:keyword"/>
</xs:key>

这里selector选择元素本身,即ReferralCollection. 然后,在这种情况下,field元素表示元素的值,keyword因此它们被限制为唯一的。XPath 中元素的值是它的文本内容。

我对元素(或一般的 XML Schema)做的不多key,所以上面的一些细节可能不正确,但基本思想就是我解释的,所以应该很容易修复我犯的任何错误。哦,还要注意我rd为你的命名空间使用了前缀READOO;根据我的经验,在处理 XPath 时使用显式前缀始终是最好的,因此您需要xmlns:rd在架构中使用适当的属性才能使其工作。

编辑:所以看来你想要这样的东西:

<xs:element name="ReferralCollection">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="URL" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="stem" type="xsd:string"/>
            <xs:element name="keyword" maxOccurs="unbounded">
            ...
            </xs:element>
          ...
  </xs:complexType>

  <xs:key name="URL">
    <xs:selector xpath="./URL"/>
    <xs:field xpath="stem"/>
  </xs:key>
</xs:element>

这更接近你的意思吗?它有URL一个或多个元素,每个元素包含一个stem元素,后跟一个或多个keyword元素。key约束应该使元素的内容唯一stem

于 2009-10-10T19:31:06.487 回答
0

请查看此链接是否可以帮助您:

编辑:几年前我在下面建立了架构;请看它是否适合您的问题:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:asp4d"
    xmlns:asp4d="urn:asp4d">
  <xs:element name="ASP4Developers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Links" minOccurs="1" maxOccurs="1">
          <xs:keyref name="kUserId" refer="asp4d:UserId">
            <xs:selector xpath="Link"/>
            <xs:field xpath="@UserId"/>
          </xs:keyref>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <xs:key name="UserId">
      <xs:selector xpath="Users/User"/>
      <xs:field xpath="@UserId"/>
    </xs:key>

  </xs:element>

</xs:schema>
于 2009-10-10T19:25:26.467 回答