0

最初の要素 ( register) に 2 番目の要素 ( ) がいくつか含まれている可能性がある 2 つの要素があるとしscaleます。要素の@unit属性scaleは a ですxs:key(したがって、最初の要素内で一意です)。要素の「defaultScale」属性で名前を付けることができます。このような:xs:keyrefregister

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

少なくとも 1つの子@defaultScaleが存在する場合、属性を強制的に存在させて有効にするにはどうすればよいですか?scale

私の最初の試みは、やのようにxs:keyの基本要素に別のものを追加することでした。どちらもコンパイルされません...registertry1try2

<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:selectorandxs:field要素でのみ使用できます。現時点での私の最善の推測:それは不可能ですか?

4

1 に答える 1