选择attributeGroup

时间:2015-04-13 14:26:34

标签: xml xsd

问题

我必须选择将一组属性添加到现有的 Value 元素中(参见下文)。该元素不得包含多组属性(见下文)。

注意:单元属性不包含在属性集中。

Value 元素的声明:

<xs:element name="Value">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="unit" use="required" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

声明我的两个 attributeGroup

<xs:attributeGroup name="setOfAttrs1">
    <xs:attribute name= "a" type="xs:int" use="required" />
    <xs:attribute name="b" type="xs:int" use="required" />
    <xs:attribute name="c" type="xs:int" use="required" />
</xs:attributeGroup>
<xs:attributeGroup name="setOfAttrs2">
    <xs:attribute name= "x" type="xs:int" use="required" />
    <xs:attribute name="y" type="xs:int" use="required" />
    <xs:attribute name="z" type="xs:int" use="required" />
</xs:attributeGroup>

更正示例(针对架构)

<Value unit="m3">i'm correct</value>
<Value unit="m3" x="1" y="1" z="0">i'm correct</value>
<Value unit="m3" a="1" b="1" c="0">i'm correct</value>

不正确的示例(针对架构)

第一个错过z属性;第二个包含两组属性。

<Value unit="m3" x="1" y="1">i'm incorrect</value>
<Value unit="m3" x="1" y="1" z="0" a="0" b="1" c="0">i'm incorrect</value>

尝试过的解决方案

<xs:element name="Value">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="PhysicalUnit" use="required" type="xs:string" />
                <xs:choice minOccurs="0" maxOccurs="1">
                    <xs:attributeGroup ref="setOfAttrs1" />
                    <xs:attributeGroup ref="setOfAttrs2" />
                </xs:choice>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

但这不是有效的XSD:

  

错误 - 第93行,第45行:org.xml.sax.SAXParseException; lineNumber:93;   columnNumber:45; s4s-elt-invalid-content.1:内容   '#AnonType_Value'无效。元素'选择'无效,错位,   或经常发生。

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您无法在XSD 1.0中表达此类限制。

在XSD 1.1中,您可以使属性成为可选属性,并通过xs:assert表达复杂的必需性约束。您希望允许三种情况:

  1. 所有a,b和c但没有x,y,z:

    @a and @b and @c and not(@x) and not(@y) and not(@z)

  2. a,b和c都不是,但x,y,z都是

    not(@a) and not(@b) and not(@c) and @x and @y and @z

  3. a,b,c,x,y,z都没有:

    not(@a or @b or @c or @x or @y or @z)

  4. XSD 1.1

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
      vc:minVersion="1.1">
    
      <xs:element name="Value">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="unit" use="required" type="xs:string" />
              <xs:attributeGroup ref="setOfAttrs1" />
              <xs:attributeGroup ref="setOfAttrs2" />
              <xs:assert test="(@a and @b and @c and not(@x) and not(@y) and not(@z)) 
                                or (not(@a) and not(@b) and not(@c) and @x and @y and @z) 
                                or not(@a or @b or @c or @x or @y or @z)"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    
      <xs:attributeGroup name="setOfAttrs1">
        <xs:attribute name="a" type="xs:int"/>
        <xs:attribute name="b" type="xs:int"/>
        <xs:attribute name="c" type="xs:int" />
      </xs:attributeGroup>
    
      <xs:attributeGroup name="setOfAttrs2">
        <xs:attribute name="x" type="xs:int"/>
        <xs:attribute name="y" type="xs:int" />
        <xs:attribute name="z" type="xs:int"/>
      </xs:attributeGroup>
    
    </xs:schema>
    

答案 1 :(得分:2)

在XSD 1.1中执行此操作的另一种方法是使用条件类型赋值。在这里定义两种类型,其中一种具有属性a / b / c,另一种具有属性x / y / z,您可以使用条件测试在这两种类型中进行选择:

<xs:element name="Value" type="ValueType">
  <xs:alternative test="@a" type="ValueTypeWithABC"/> 
  <xs:alternative           type="ValueTypeWithXYZ"/>
</xs:element>