代码之家  ›  专栏  ›  技术社区  ›  Jamie Love

将元素限制为包含文本或子元素

  •  1
  • Jamie Love  · 技术社区  · 15 年前

    在这种情况下,我们希望将一个元素限制为:

    • 或text()。或

    例如。

    <a>mytext</a>
    

    <a><b>xxx</b></a>
    

    <a>mytext<b>xxx</b></a>
    

    鉴于 xs:simpleContent 机制我可以限制它只有文本,当然我可以定义它可以被允许的元素,但是有人知道我如何结合这两者来允许文本或子元素,而不是两者都允许吗?

    助教 杰米

    1 回复  |  直到 7 年前
        1
  •  3
  •   barkimedes    15 年前

    另一个选择是使用继承。生成的XML没有那么漂亮,但您得到的正是您想要的内容:

    <xsd:element name="field" type="field" abstract="true" />
    <xsd:element name="subfield" type="xsd:string" /> 
    
    <xsd:complexType name="field" abstract="true" />
    
    <xsd:complexType name="subfield">
      <xsd:complexContent>
        <xsd:extension base="field">
          <xsd:sequence>
            <xsd:element ref="subfield" minOccurs="0" maxOccurs="unbounded" />
          </xsd:sequence>
          <xsd:attribute name="name" type="xsd:string" />
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    
    <xsd:complexType name="no-subfield">
      <xsd:complexContent mixed="true">
        <xsd:extension base="field">
          <xsd:attribute name="name" type="xsd:string" />
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    

    然后,生成的XML将包含以下内容(假设 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 在某处声明)

    <field xsi:type="subfield">
      <subfield>your stuff here</subfield>
    </field>
    

    <field xsi:type="no-subfield">your other stuff</field>
    

    <field xsi:type="subfield">
      Text you don't want
      <subfield>your stuff here</subfield>
      More text you don't want
    </field>