XML Schema - 按顺序键入

时间:2009-10-10 19:07:29

标签: xml xsd key unique selector

我正在尝试按顺序放置一个按键,然后被错误轰炸。我好像不能这样做。另外,我被告知我的密钥需要一个字段和选择器,我已经能够找到很少的文档。 (事实上​​,在绝望中,我下载了Liquid XML Studio [与记事本]并搜索了它的帮助文件......甚至没有引用“selector”这个词的引用)无论如何 - 我可以使用另一种方法来保证唯一的,序列中的元素不是空值? (有问题的内容是一个字符串)

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

错误

每个cvc-complex-type.1.2.4无效: 元素{http://www.w3.org/2001/XMLSchema}:key不允许在这里(1)in 元素{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}:group, {http://www.w3.org/2001/XMLSchema}:choice, {http://www.w3.org/2001/XMLSchema}:sequence, {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>

2 个答案:

答案 0 :(得分:2)

key元素不应该进入sequence元素。相反,您将其设为定义xs:element的{​​{1}}的子项。 ReferralCollectionselectorfield元素的子元素,用于定义应该唯一的元素。两者都是XPath表达式。 key值设置XPath上下文,selector元素(可以有多个)定义应该是唯一的值组合。因此,在您的情况下,field元素可能如下所示:

key

<xs:key name="URL"> <xs:selector xpath="."/> <xs:field xpath="rd:keyword"/> </xs:key> 此处选择元素本身,即selector。然后,在该上下文中,ReferralCollection元素表示field元素的值,因此它们被约束为唯一的。 XPath中元素的值是其文本内容。

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

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

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元素的内容唯一。

答案 1 :(得分: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>