2011-09-06 62 views
2

如何将属性添加到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> 

你如何添加作为任何一个属性,这样下面的XML可以针对架构验证没有错误:

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

回答

0

的xsd:任何不能包含任何属性声明,因为它实质上允许在名称空间“http://xxx.yyy.com”中定义的任何元素在序列中声明。如果你不使用一个单独的XSD,以验证该命名空间,那么你可以简单地使用下面的地方为xsd:任何:

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

否则,你将要声明一个命名空间前缀为“HTTP:// xxx.yyy.com“放在XSD的顶部,并引用该架构中的元素而不是xsd:any。所以,如果“http://xxx.yyy.com”的模式包括以下声明:如果你

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

其实,我创建一个心跳WSDL操作将包含数为终点的所有操作。心跳操作将用于所有Web服务,并且需要通用,因此不必每次都进行调整。 – Ketch

+0

在该示例中,操作将最终成为1个或多个Web服务操作。所以,似乎我不应该指定一个名称空间作为任何部分,因为它会使用该元素的定义,而这不是我想要完成的。而且,如果没有办法给任何元素添加属性,那么我猜这个属性需要是任何子元素。 – Ketch

+0

不幸的是,对于count使用子元素也不起作用,因为您不能嵌套xsd:any元素。您可以放置​​在xsd:any下的唯一子元素是xsd:annotation –

0

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

然后,你可以在你的XSD引用此类型说你只要有一个count属性就允许任何元素作为一个子元素,那么你就不能在XSD 1.0中这样做。你可以用一个断言做它在XSD 1.1(目前在撒克逊和Xerces支持):

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