如何使用XSD允许任意数量的任何属性?

时间:2013-11-28 19:03:30

标签: xml xsd

如何实现与XSD匹配的简单<table>标记?

以下不起作用:

<xs:element name="table">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="tr" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="td" 
                        minOccurs="0" 
                        maxOccurs="unbounded" 
                        type="MixedTemplateContentContainer"/>  
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:element>

如果我在表格标签中使用任何属性,则会失败:

<table ccc="table" bgcolor="#ffffff">
<tr align="center"><td>

  

属性'ccc'不允许出现在元素'table'中。

3 个答案:

答案 0 :(得分:4)

我使用Saxon架构处理器运行它,并收到错误消息

test.xml第1行的验证错误:   XSD99999:匹配属性@ccc的<xs:anyAttribute>需要严格验证,   但没有可用的属性声明

基本上,<xs:anyAttribute>具有processContents属性,默认值为strict,这意味着如果模式中存在匹配的属性声明,则允许您使用任何属性。你可能想要processContents =“lax”或“skip”。值lax表示如果模式包含一个属性,则根据匹配的属性声明验证该属性,如果不是,则接受该属性。值skip表示接受任何属性而不进行验证。

答案 1 :(得分:0)

你的问题是什么?是吗

  

如何使用XSD允许任意数量的任何属性?

  

如何使用XSD实现简单的标记匹配?

因为他们看起来完全不同。

第一个答案是使用xs:anyAttribute

答案 2 :(得分:0)

<xs:anyAttribute> 元素的 processContents 属性设置为 skip

<xs:anyAttribute processContents="skip" />
                 ^^^^^^^^^^^^^^^^^^^^^^

制作完整的 XSD:

<xs:element name="table">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="tr" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="td" 
                        minOccurs="0" 
                        maxOccurs="unbounded" 
                        type="MixedTemplateContentContainer"/>  
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:anyAttribute processContents="skip"/>
  </xs:complexType>
</xs:element>