限值看重其他元素XSD

问题描述:

考虑以下类型:限值看重其他元素XSD

<xsd:complexType name="Options"> 
    <xsd:sequence> 
     <xsd:element name="option" maxOccurs="unbounded"> 
      <xsd:complexType> 
       <xsd:all> 
        <xsd:element name="id" type="xsd:integer" /> 
        <xsd:element name="label" type="xsd:string" /> 
        <xsd:element name="value" type="xsd:string" minOccurs="0" /> 
        <xsd:element name="dependency" type="xsd:integer" minOccurs="0" /> 
       </xsd:all> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

我怎样才能表达一个optiondependency必须存在为不同optionid

我想我应该使用xsd:keyxsd:keyref,但无法理解如何使用它们。

+0

通过“不同的选项”,你的意思是你也想强制你不能拥有自引用的选项? –

+0

@PetruGardea这真的很好,但首先我只是在这个问题的参考部分:) – Svish

XSD 1.0不支持此操作。 XSD 1.1支持Conditional Types and assertions,这可能允许您执行此操作。对于xsd 1.0,您可以使用Schematron来实现此目的。

约束条件只能在元素的上下文中表达。

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="Options"> 
     <xsd:sequence> 
      <xsd:element name="option" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:all> 
         <xsd:element name="id" type="xsd:integer"/> 
         <xsd:element name="label" type="xsd:string"/> 
         <xsd:element name="value" type="xsd:string" minOccurs="0"/> 
         <xsd:element name="dependency" type="xsd:integer" minOccurs="0"/> 
        </xsd:all> 
       </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:element name="Options" type="Options"> 
     <xsd:key name="PK"> 
      <xsd:selector xpath="option"/> 
      <xsd:field xpath="id"/> 
     </xsd:key> 
     <xsd:keyref name="FK" refer="PK"> 
      <xsd:selector xpath="option"/> 
      <xsd:field xpath="dependency"/> 
     </xsd:keyref> 
    </xsd:element> 
</xsd:schema> 

enter image description here

如果你想有这种类型的多个实例引用,与你指定的限制一起,那么你就必须始终定义一个全局元素,然后参考该元素你的具体情况。

我想提一下,理解你在你的问题中使用“不同”这个词是非常重要的。如果你确实是这个意思,那么上面的内容并不能给你。

+0

因此,给定的元素'选项'和'选项'key'和'keyref'必须定义为“选项”,父母,而不是“选项”,孩子? – Svish

+0

@Svish,是的,你必须在选项级别。这是从规范:'{选择器}指定一个有限的XPath([XPath])表达式相对于被声明的元素的实例。这必须标识约束条件适用的从属元素的节点集合(即包含在声明的元素中)。“你基本上试图限制'option'元素,这意味着你必须向上移动一层。 –