1

これは正しいロングショットです。

XSDにNAMEとVALUEなどの2つの属性を含む定義済みの要素がある場合、Nameの値に基づいてVALUE列挙を制限することはできますか?

例えば:

<xsd:complexType name="ConfigDef">
    <xsd:attribute name="NAME" type="xsd:string">
        <xsd:annotation>
            <xsd:documentation>The name of this Config setting.</xsd:documentation>
        </xsd:annotation>           
    </xsd:attribute>
    <xsd:attribute name="VALUE" type="xsd:string">
        <xsd:annotation>
            <xsd:documentation>The value of this Config setting.</xsd:documentation>
        </xsd:annotation>
    </xsd:attribute>
</xsd:complexType>

できないと思います。できますか?それを機能させるためのXSDハックはありますか?

4

1 に答える 1

2

組み込みのスキーマトロンでこれを行うことができます

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="ConfigDef">
    <xsd:annotation>
      <xsd:appinfo>
        <sch:pattern name="Test constraints on the ConfigDef element"
          xmlns:sch="http://purl.oclc.org/dsdl/schematron">
          <sch:rule
            context="ConfigDef">
            <sch:assert test="@NAME eq 'foo' and @VALUE = ('bar','baz')">Error message when the assertion condition is broken...</sch:assert>
            <sch:assert test="@NAME eq 'qux' and @VALUE = ('teh','xyz')">Error message when the assertion condition is broken...</sch:assert>
          </sch:rule>
        </sch:pattern>
      </xsd:appinfo>
    </xsd:annotation>
    <xsd:attribute name="NAME" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The name of this Config setting.</xsd:documentation>
      </xsd:annotation>           
    </xsd:attribute>
    <xsd:attribute name="VALUE" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The value of this Config setting.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
</xsd:schema>

または、リラックススキーマでこれを行うことができます

element ConfigDef {
  ((
  attribute NAME {'foo'},
  attribute VALUE {'bar'|'baz'}) |  
  (
  attribute NAME {'qux'},
  attribute VALUE {'teh'|'xyz'}))
}
于 2012-11-09T17:52:17.487 に答える