1

私はプロジェクト ( 「とんがったマネージャー」によって割り当てられた) に取り組んでおり、私を困惑させている 2 つのことに遭遇しました。ここと w3schools の両方で多くの記事を読みましたが、まだ混乱しています。実用的な例が必要だと思います。

私は必死に「検証」しようとしている XSD の大幅に簡素化され難読化されたバージョンを含めています。

問題#1は、「abstract/substitutionGroup」の使用に関係していると思います-私にはあまり明確ではありません。必要なのは、3 つのバリアント グループが同じノード名 (この例では "zzzResult") を持つことです。

問題 2はポリモーフィズムに関係しています。外部操作 (XPath と JS を使用) の開始/終了を示す特別な「マーカー」と、「ハッシュ」という名前のメイン ドキュメント属性 (またはその列挙型の値) に基づくデータの特別なノードを追加する必要があります。

誰かが機能する「修正済み」バージョンを提供できますか?


<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- payload containers -->

  <xsd:element name="thePayload" type="xsd:string"/>

  <xsd:element name="md5">
    <xsd:simpleType>
      <xsd:restriction base="xsd:hexBinary">
        <xsd:pattern value="[0-9A-Fa-f]{32}"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

  <xsd:element name="sha1">
    <xsd:simpleType>
      <xsd:restriction base="xsd:hexBinary">
        <xsd:pattern value="[0-9A-Fa-f]{40}"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>

<!-- markers -->

  <xsd:element name="zzzBegin"><xsd:complexType/></xsd:element>
  <xsd:element name="zzzEnd"><xsd:complexType/></xsd:element>

<!-- constructs -->

  <xsd:element name="theHeading">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="thePayload" maxOccurs="8"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="theDetails">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="thePayload" maxOccurs="64"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

<!-- groups -->

  <xsd:group name="_none">
    <xsd:sequence>
      <xsd:element ref="theHeading"/>
      <xsd:element ref="theDetails"/>
    </xsd:sequence>
  </xsd:group>

  <xsd:group name="_md5">
    <xsd:sequence>
      <xsd:element ref="zzzBegin"/>
      <xsd:element ref="theHeading"/>
      <xsd:element ref="theDetails"/>
      <xsd:element ref="zzzEnd"/>
    <!-- problem #1) [abstract?] ambiguous name -->
      <xsd:element name="zzzResult">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="md5"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:group>

  <xsd:group name="_sha1">
    <xsd:sequence>
      <xsd:element ref="zzzBegin"/>
      <xsd:element ref="theHeading"/>
      <xsd:element ref="theDetails"/>
      <xsd:element ref="zzzEnd"/>
    <!-- problem #1) [abstract?] ambiguous name -->
      <xsd:element name="zzzResult">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="sha1"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:group>

  <xsd:group name="_both">
    <xsd:sequence>
      <xsd:element ref="zzzBegin"/>
      <xsd:element ref="theHeading"/>
      <xsd:element ref="theDetails"/>
      <xsd:element ref="zzzEnd"/>
    <!-- problem #1) [abstract?] ambiguous name -->
      <xsd:element name="zzzResult">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="md5"/>
            <xsd:element ref="sha1"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:group>

<!-- XML DOCUMENT -->

  <xsd:element name="theDocument">
    <xsd:complexType>

 <!-- problem #2) [polymorphic?] choose based on enum-value of attrib "hash" -->
      <xsd:choice>
        <xsd:group ref="_none"/>
        <xsd:group ref="_md5"/>
        <xsd:group ref="_sha1"/>
        <xsd:group ref="_both"/>
      </xsd:choice>

      <xsd:attribute name="hash" default="none">
        <xsd:simpleType>
          <xsd:restriction base="xsd:NMTOKEN">
            <xsd:enumeration value="none"/>
            <xsd:enumeration value="md5"/>
            <xsd:enumeration value="sha1"/>
            <xsd:enumeration value="both"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>

    </xsd:complexType>
  </xsd:element>

バリアント フォームを次のように表示する必要があります。


<theDocument hash="none">
  <theHeading>
    <thePayload>some data here (occurs 1:8)</thePayload>
  </theHeading>
  <theDetails>
    <thePayload>more data here (occurs 1:64)</thePayload>
  </theDetails>
</theDocument>

<theDocument hash="md5">
 <zzzBegin/>
  <theHeading>
    <thePayload>some data here (occurs 1:8)</thePayload>
  </theHeading>
  <theDetails>
    <thePayload>more data here (occurs 1:64)</thePayload>
  </theDetails>
 <zzzEnd/>
  <zzzResult>
    <md5>0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a</md5>
  </zzzResult>
</theDocument>

<theDocument hash="sha1">
 <zzzBegin/>
  <theHeading>
    <thePayload>some data here (occurs 1:8)</thePayload>
  </theHeading>
  <theDetails>
    <thePayload>more data here (occurs 1:64)</thePayload>
  </theDetails>
 <zzzEnd/>
  <zzzResult>
    <sha1>3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e</sha1>
  </zzzResult>
</theDocument>

<theDocument hash="both">
 <zzzBegin/>
  <theHeading>
    <thePayload>some data here (occurs 1:8)</thePayload>
  </theHeading>
  <theDetails>
    <thePayload>more data here (occurs 1:64)</thePayload>
  </theDetails>
 <zzzEnd/>
  <zzzResult>
    <md5>0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a</md5>
    <sha1>3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e</sha1>
  </zzzResult>
</theDocument>
4

1 に答える 1

1

一意の粒子属性の制限があるため、指定されたタグと制約のセットを維持しながらXSD1.0を修正する方法はありません。

XSD 1.1(XSD仕様の最新バージョン)は、モデルの制約を希望どおりに適用するために必要なすべてのメカニズムを提供します。

XSD 1.1がオプションでない場合、XSD 1.0に加えてSchematronマークアップを使用すると、現在のXSDの制約の一部を緩和できます。これにより、コンテンツモデルを再構成して、UPAの問題を回避しながら制約を維持できます。具体的には、md5とsha1の両方が存在しオプションである1つの zzzResultを使用することから始めることができます。そうすると、(現在のアプローチに従って)_noneと他の2つのグループだけになります。

SOの精神で、私はあなたに上記を戻ってあなたの選択肢を考慮して新しいことを試みるための手がかりとして考えていただきたいと思います。それでも問題が発生する場合は、ここに戻って新しい詳細を確認してください。

于 2013-03-15T13:11:16.180 に答える