如何在xs:all-(xsd:schema)中创建xs:choice



我想验证以下数组中的数据:

input_array = array(
  "boy"=> array("boy_id"=>1),
   "first_name=>"First Name",
   "last_name"=>"Last Name"
);

在input_array内部,第一个索引可以替换为女孩数组作为

 "girl"=>array("girl_id"=>2)

我想创建xsd来验证以下信息:

 <xs:element name="xml">
    <xs:complexType>
      <xs:all>
        <xs:element ref="boy" minOccurs="0"/>
        <xs:element ref="girl" minOccurs="0"/>
        <xs:element ref="first_name"/>
        <xs:element ref="last_name"/>
      </xs:all>
    </xs:complexType>
  </xs:element>

问题-我想确保男孩或女孩的信息都在那里,first_namelast_name永远在那里,我怎么能把它们(女孩、男孩)作为选择或选项。我更喜欢使用xs:all,这样元素顺序就不会成为问题。

我引用了这个链接来使用,以便尝试在xs:all中使用choice,但无法使其工作。如果有任何回应,我将不胜感激。非常感谢。

在您引用的文章中(http://www.w3.org/wiki/Needs_choice_inside_all)它们提供了一个替换群的例子。那么,为什么不使用一个呢?

以下是它的外观:

<xs:element name="xml">
  <xs:complexType>
    <xs:all>
      <xs:element ref="gender" minOccurs="1"/>
      <xs:element ref="first_name"/>
      <xs:element ref="last_name"/>
    </xs:all>
  </xs:complexType>
</xs:element>
<xs:element name="gender" abstract="true"/>
<xs:element name="boy" substitutionGroup="gender"> ... </xs:element>
<xs:element name="girl" substitutionGroup="gender"> ... </xs:element>

具体来说,我尝试了这个完整的模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="xml">
    <xs:complexType>
      <xs:all>
        <xs:element ref="gender" minOccurs="1"/>
        <xs:element ref="first_name"/>
        <xs:element ref="last_name"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:element name="gender" abstract="true"/>
  <xs:element name="boy" substitutionGroup="gender"/>
  <xs:element name="girl" substitutionGroup="gender"/>
  <xs:element name="first_name" type="xs:string"/>
  <xs:element name="last_name" type="xs:string"/>
</xs:schema>

要验证此XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <girl/>
  <first_name>Lara</first_name>
  <last_name>Croft</last_name>
</xml>

成功了!此时,如果我指定<boy/>代替<girl/>,它也通过了,但当不存在CCD_ 7、CCD_。

你能试试这个代码吗?

<xsd:complexType name="column"> 
  <xsd:all>
    <xsd:element ref="gender" minOccurs="1"/>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xsd:all>
</xsd:complexType>

<xsd:element name="gender">
  <xsd:complexType>
   <xsd:choice>
     <xs:element name="boy" type="xs:integer" default="1"/>
     <xs:element name="girl" type="xs:integer" default="0"/>
   </xsd:choice>
  </xsd:complexType>
 </xsd:element>

最简单的方法可能是将boy_id和girl_id重命名为gender(具有适当的属性值),正如@herry所建议的那样。如果你不想这样做(为什么不呢?),那么你剩下的选择包括:

  • 声明一个抽象元素gender_id,将其放入all组,并声明boy_id和girl_id在其替换组中
  • 将封闭元素从"xml"重命名为"girl"或"boy",以携带与女孩还是男孩打交道的信息

毫无疑问,还有其他一些,其中一些对Java程序员来说是惯用的,而另一些对XML用户来说则是惯用的。

最新更新