我想重新定义/限制 Oasis XML DSig 模式中的复杂类型。
xmldsig-core-schema.xsd
<complexType name="TransformType" mixed="true">
<choice minOccurs="0" maxOccurs="unbounded">
<any namespace="##other" processContents="lax"/>
<!-- (1,1) elements from (0,unbounded) namespaces -->
<element name="XPath" type="string"/>
</choice>
<attribute name="Algorithm" type="anyURI" use="required"/>
</complexType>
我只想允许##other
命名空间中的一种显式元素类型。
xmldsig-restricted.xsd
(1)这确实有效:
<xs:redefine schemaLocation="xmldsig-core-schema.xsd">
<xs:complexType name="TransformType">
<xs:complexContent>
<xs:restriction base="ds:TransformType">
<xs:choice minOccurs="1" maxOccurs="1"> <!--diff-->
<xs:element name="XPath" type="xs:string"/>
<!--<xs:any namespace="##other" processContents="lax"/>-->
</xs:choice>
<xs:attribute name="Algorithm" type="xs:anyURI" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
(2)这也有效:
<xs:redefine schemaLocation="xmldsig-core-schema.xsd">
<xs:complexType name="TransformType">
<xs:complexContent>
<xs:restriction base="ds:TransformType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<!--<xs:element name="XPath" type="xs:string"/>-->
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
<xs:attribute name="Algorithm" type="xs:anyURI" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
(3)这不起作用:
<xs:redefine schemaLocation="xmldsig-core-schema.xsd">
<xs:complexType name="TransformType">
<xs:complexContent>
<xs:restriction base="ds:TransformType">
<xs:choice minOccurs="1" maxOccurs="1"> <!--diff-->
<!--<xs:element name="XPath" type="xs:string"/>-->
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
<xs:attribute name="Algorithm" type="xs:anyURI" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
错误:
cos-particle-restrict.2: Forbidden particle restriction: 'choice:all,sequence,elt'.
(4)这(所需的定义)也不起作用:
<xs:redefine schemaLocation="xmldsig-core-schema.xsd">
<xs:complexType name="TransformType">
<xs:complexContent>
<xs:restriction base="ds:TransformType">
<xs:choice minOccurs="1" maxOccurs="1"> <!--diff-->
<!--<xs:element name="XPath" type="xs:string"/>-->
<!--<xs:any namespace="##other" processContents="lax"/>-->
<xs:element name="InclusiveNamespaces" type="ec:InclusiveNamespaces"/> <!--diff-->
</xs:choice>
<xs:attribute name="Algorithm" type="xs:anyURI" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
错误:
rcase-RecurseLax.2: There is not a complete functional mapping between the particles.
(1)表明 的限制choice
是可以的
(2)表明只有any
类型的使用是可以的
(3)表明当any
和choice
组合时必须有一种特殊的行为,也许是关于命名空间?
(4)看起来给定的元素不是any
类型的子集(这是不正确的)
(3)的行为也隐含在原始模式中,该模式对choice
and有以下注释sequence
:
<choice minOccurs="0" maxOccurs="unbounded">
<any namespace="##other" processContents="lax"/>
<!-- (1,1) elements from (0,unbounded) namespaces -->
</choice>
<sequence>
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
<!-- (0,unbounded) elements from (1,1) external namespace -->
</sequence>
那么这意味着什么以及如何定义限制?
编辑
(2)/(3)当设置choice
为minOccurs=0 maxOccurs=1
或时,限制也可以minOccurs=1 maxOccurs=unbounded
。但是为什么“正好一个”不是对“任意数”的有效限制呢?不过,当不使用any
类型时,我们有(1)。