1

我想重新定义/限制 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)的行为也隐含在原始模式中,该模式对choiceand有以下注释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)当设置choiceminOccurs=0 maxOccurs=1或时,限制也可以minOccurs=1 maxOccurs=unbounded。但是为什么“正好一个”不是对“任意数”的有效限制呢?不过,当不使用any类型时,我们有(1)

4

1 回答 1

0

找到部分答案...

(4)通过删除import我编写的另一个模式文档来解决。我想限制多个文件中几个目标命名空间的重新定义并将它们链接在一起。我假设我的做法不是模式文档的合法组合,它导致了某种循环依赖引用(?)。我独立地重新创建了文档,它的工作方式与我编写它的方式一样。

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

于 2020-06-26T08:09:47.243 回答