如何在XML架构中限制选项组中的任何类型的类型?



我想从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(表明当anychoice组合时,一定有特殊的行为,也许是关于命名空间?

(4(看起来给定的元素不是any类型的子集(这不是真的(

(3(的行为也隐含在原始架构中,该架构具有以下choicesequence注释:

<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=1minOccurs=1 maxOccurs=unbounded时,限制也可以。但是,为什么"正好一个"不是对"任何数字"的有效限制呢?不过,当不使用any类型时,我们有(1(。

找到部分答案...

(4(已通过删除我编写的另一个架构文档的import来解决。我想限制多个文件中多个 targetNamespace 的重新定义,并将它们链接在一起。我假设我是如何做到的不是模式文档的合法组合,它导致了某种循环依赖引用(?我独立地重新创建了文档,它的工作方式与我编写的方式相同。

但是,(3(中显示的主要问题仍然存在(见编辑(。

相关内容

  • 没有找到相关文章

最新更新