我想从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
和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(。
找到部分答案...
(4(已通过删除我编写的另一个架构文档的import
来解决。我想限制多个文件中多个 targetNamespace 的重新定义,并将它们链接在一起。我假设我是如何做到的不是模式文档的合法组合,它导致了某种循环依赖引用(?我独立地重新创建了文档,它的工作方式与我编写的方式相同。
但是,(3(中显示的主要问题仍然存在(见编辑(。