首页 文章

XML Schema - 按顺序键入

提问于
浏览
0

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

请注意,如果没有key元素,架构将验证 .

错误

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

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

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

    selector 在这里选择元素本身,即 ReferralCollection . 然后,在该上下文中, field 元素表示 keyword 元素的值,因此它们被约束为唯一的 . XPath中元素的值是其文本内容 .

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

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

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

  • 2

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

    EDIT :几年前我 Build 了架构;请看,它适合你的问题:

    <?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>
    

相关问题