0

XSD スキーマに一致する xml が必要ですが、一致しません。XSD スキーマで何が問題になる可能性がありますか? xsi:type="..." に問題があります。私は何かを逃すかもしれません。何が悪いのかお気づきになることを願っています。xsd validate online を使用して修正しようとしましたが、うまくいきません。というわけで諦めてここに書くことにしました。あなたの助けに感謝します。ありがとう!

XML は次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<ValidatorList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <FieldValidator xsi:type="RequiredFieldValidator"  PropertyName="BankTransactionNumber">
   <Next xsi:type="AsciiValidator" />
  </FieldValidator>
  <FieldValidator xsi:type="RequiredFieldValidator"  PropertyName="CurrencyIndicator">
   <Next xsi:type="StringLengthValidator" MaxLength="3" MinLength="3">
   <Next xsi:type="AlphaValidator" />
  </Next>
 </FieldValidator>
</ValidatorList>

この XML の XSD スキーマ:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ValidatorList">
<xs:complexType>
  <xs:sequence>
    <xs:element name="FieldValidator" maxOccurs="unbounded" minOccurs="0">
      <xs:complexType mixed="true">
        <xs:sequence>
          <xs:element name="Next" minOccurs="0">
            <xs:complexType mixed="true">
              <xs:sequence>
                <xs:element name="Next" minOccurs="0">
                  <xs:complexType mixed="true">
                    <xs:sequence>
                      <xs:element name="Next" minOccurs="0">
                        <xs:complexType>
                          <xs:simpleContent>
                            <xs:extension base="xs:string">
                              <xs:attribute type="xs:byte" name="DecimalPlaces"/>
                            </xs:extension>
                          </xs:simpleContent>
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                    <xs:attribute type="xs:byte" name="MaxLength" use="optional"/>
                    <xs:attribute type="xs:byte" name="MinLength" use="optional"/>
                    <xs:attribute type="xs:string" name="AllowedValues" use="optional"/>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
              <xs:attribute type="xs:byte" name="MaxLength" use="optional"/>
              <xs:attribute type="xs:byte" name="MinLength" use="optional"/>
              <xs:attribute type="xs:byte" name="DefaultValue" use="optional"/>
            </xs:complexType>
          </xs:element>
          <xs:element type="xs:string" name="RegEx" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute type="xs:string" name="PropertyName" use="optional"/>
        <xs:attribute type="xs:byte" name="DefaultValue" use="optional"/>
        <xs:attribute type="xs:string" name="TypeProperty" use="optional"/>
        <xs:attribute type="xs:string" name="Regex" use="optional"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

次のようなエラー メッセージが表示されました。

Error - Line 4, 39: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 39; cvc-elt.4.2: Cannot resolve 'AsciiValidator' to a type definition for element 'Next'.
Error - Line 6, 87: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 87; cvc-elt.4.2: Cannot resolve 'RequiredFieldValidator' to a type definition for element 'FieldValidator'.
Error - Line 7, 72: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 72; cvc-elt.4.2: Cannot resolve 'StringLengthValidator' to a type definition for element 'Next'.
Error - Line 8, 41: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 41; cvc-elt.4.2: Cannot resolve 'AlphaValidator' to a type definition for element 'Next'.
4

1 に答える 1

2

この属性は、スキーマ内に名前付きの型の階層があり、宣言された型が基本型であるが実際の型が派生型の 1 つである要素があるxsi:type場合に使用することを目的としています。典型的な例は、サブタイプとaddressusAddressukAddress

あなたのスキーマでは、FieldValidatorNext要素は<complexType>、名前付きの型ではなく、匿名のネストされた定義を使用して宣言されているため、これらから派生した他の型を持つことはできないため、 を使用しても意味がありませんxsi:type。トップレベルの名前付き型を使用して、スキーマを別の方法で構造化します。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="FieldValidatorType">
    <xs:sequence>
      <xs:element name="Next" type="FieldValidatorType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="PropertyName" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="RequiredFieldValidator">
    <xs:complexContent>
      <xs:extension base="FieldValidatorType" />
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="AsciiValidator">
    <xs:complexContent>
      <xs:extension base="FieldValidatorType" />
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="StringLengthValidator">
    <xs:complexContent>
      <xs:extension base="FieldValidatorType">
        <xs:attribute type="xs:byte" name="MaxLength" use="optional"/>
        <xs:attribute type="xs:byte" name="MinLength" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- and similar complexType declarations for the other types such as
       AlphaValidator -->

  <xs:element name="ValidatorList">
    <xs:complexType>
      <xs:sequence>
        <!-- define the FieldValidator element by referring to the base
             FieldValidatorType, instance documents can use xsi:type to
             substitute subtypes such as StringLengthValidator -->
        <xs:element name="FieldValidator" maxOccurs="unbounded" minOccurs="0"
                    type="FieldValidatorType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

これには、属性を適切に機能させるだけでなくxsi:type、さまざまなファセットをそれぞれのバリデータ型に関連付けるという利点があり (たとえばMaxLength、 a に対してのみ有効ですStringLengthValidator)、任意の深さのNextネストをサポートすることもできます (型定義が再帰的であるため)。

于 2013-10-07T10:31:59.397 に答える