私はプロジェクト ( 「とんがったマネージャー」によって割り当てられた) に取り組んでおり、私を困惑させている 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>