我正在做一个项目(由一个“尖头发的经理”分配给我),我遇到了两件令我困扰的事情。 我在这里和w3schools上读过很多文章 - 仍然很困惑。我想我需要一个实际的例子。
我包括一个显着减少的& XSD的混淆版本,我拼命想要“验证”。
问题#1 必须做(我认为)使用'abstract / substitutionGroup' - 对我来说不是很清楚。我需要的是3个变体组具有相同的节点名称(在本例中为“zzzResult”)。
问题#2 与多态性有关。我需要添加特殊的“标记”来指示某些外部操作的开始/结束(使用XPath和JS)以及基于名为“hash”的主文档属性(或者更确切地说是其枚举值)的特殊数据节点
有人可以提供有效的“更正”版本吗?
<?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>
答案 0 :(得分:1)
由于Unique Particle Attribution限制,无法在维护给定的标记和约束集的同时更正XSD 1.0。
XSD 1.1 - 最新版本的XSD规范 - 提供了以您希望的方式强制执行模型约束所需的所有机制。
如果XSD 1.1不是一个选项,XSD 1.0之上的Schematron标记将允许您放宽当前XSD中的一些约束,这些约束将允许您重新配置内容模型以避免UPA问题,同时保持约束。具体来说,您可以从一个 zzzResult开始,其中md5和sha1都存在且可选;那么你最终只会有两组(根据你当前的方法),_none和其他东西。
本着SO的精神,我会恳请您考虑以上为导致回顾并考虑您的选择尝试新事物;如果你还遇到问题,请带着新的细节回到这里。