【问题标题】:xsd: force attribute in element iff child-element is presentxsd:如果存在子元素,则元素中的强制属性
【发布时间】:2015-01-09 08:38:08
【问题描述】:

假设我有两个元素,其中第一个 (register) 可能包含多个第二个 (scale)。 scale 元素的 @unit 属性是 xs:key(因此在第一个元素中是唯一的)。它可以register 元素的“defaultScale”属性中命名为xs:keyref。像这样:

<xs:element name="register">
  <xs:key name="scaleKey">
    <xs:selector xpath="scale" />
    <xs:field xpath="@unit" />
  </xs:key>
  <xs:keyref name="chooseDefaultScale" refer="scaleKey">
    <xs:selector xpath="."/>
    <xs:field xpath="@defaultScale"/>
  </xs:keyref>
  <xs:complexType>
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="scale"/>
      </xs:choice>
    <xs:attribute name="defaultScale" type="xs:string" />
  </xs:complexType>
</xs:element>

<xs:element name="scale">
  <xs:complexType>
    <xs:attribute name="scale" type="xs:float" use="required"/>
    <xs:attribute name="unit" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

如何强制@defaultScale 属性存在且有效iff至少存在一个scale 子对象?

我的第一次尝试是将另一个xs:key 添加到register 的基本元素中,例如try1try2。两者都不编译...

<xs:element name="body">
  <xs:key name="try1">
    <xs:selector xpath=".//register/defaultScale" />
    <xs:field xpath="../@defaultScale" />             <!-- not allowed -->
  </xs:key>
  <xs:key name="try2">
    <xs:selector xpath=".//register[defaultScale]" /> <!-- not allowed -->
    <xs:field xpath="@defaultScale" /> 
  </xs:key>
  <xs:sequence>
    <xs:element ref="register"/>
  <xs:sequence>
</xs:element>

我只能在xs:selectorxs:field 元素中使用子轴。所以我目前最好的猜测:这不可能?

【问题讨论】:

    标签: xml xsd keyref


    【解决方案1】:

    回答我自己的问题:不可能开箱即用,必须使用 XSD 1.1。例如,请参阅here

    请注意,这对于使用 foss 软件的 debian shell 来说并非易事...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多