如何将属性添加到xsd:any元素

时间:2011-09-06 14:01:58

标签: xml xsd any

如何向xsd:any元素添加属性?例如,给出以下内容:

<xsd:element name="requests">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:any namespace="http://xxx.yyy.com" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

如何将any作为属性添加到任何属性中,以便可以针对架构验证以下xml而不会出现错误:

<requests>
    <operation count="1">
<requests>

2 个答案:

答案 0 :(得分:0)

xsd:any不能包含任何属性声明,因为它实质上允许在命名空间“http://xxx.yyy.com”中定义的任何元素在序列中声明。如果您没有使用单独的XSD来验证该命名空间,那么您只需使用以下代替xsd:any:

<xsd:element name="operation">
   <xsd:complexType>
      <xsd:attribute name="count" type="nonNegativeInteger" use="required"/>
   </xsd:complexType>
</xsd:element>

否则,您将需要在XSD顶部为“http://xxx.yyy.com”声明名称空间前缀,并引用该模式中的元素而不是xsd:any。因此,如果“http://xxx.yyy.com”的架构包含以下声明:

<xsd:complexType name="operationType">
   <xsd:attribute name="count" type="nonNegativeInteger" use="required"/>
</xsd:complexType>

然后您可以在XSD中引用此类型:

<xsd:element name="requests">           
   <xsd:complexType>           
      <xsd:sequence>           
         <xsd:element type="optype:operationType"/>           
      </xsd:sequence>           
   </xsd:complexType>           
</xsd:element>  

答案 1 :(得分:0)

如果你想要允许任何元素作为孩子,只要它有一个count属性,那么你就不能在XSD 1.0中这样做。你可以在XSD 1.1(目前在Saxon和Xerces中支持)中使用断言:

<xs:assert test="every $x in * satisfies (exists($x/@count) and $x/@count castable to xs:integer)"/>