1

我试图达到与此处相反的效果。我有一个抽象类,但我不希望输出抽象类的类型和标签。所以我需要一个输出,基本上看起来像

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <text>This is a test</text>
    </marke>
</dokument>

而不是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <inhalt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text">
            <text>This is a test</text>
        </inhalt>
    </marke>
</dokument>

Text继承自抽象类Inhalt

我当前的(生成的)架构如下所示。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="dokument" type="dokument"/>

  <xs:complexType name="dokument">
    <xs:sequence>
      <xs:element name="marke" type="marke" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="vorlage" type="xs:string" use="required"/>
    <xs:attribute name="ausgabe" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="marke">
    <xs:sequence>
      <xs:element name="inhalt" type="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
  </xs:complexType>

  <xs:complexType name="inhalt" abstract="true">
    <xs:sequence/>
    <xs:attribute name="style" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="text">
    <xs:complexContent>
      <xs:extension base="inhalt">
        <xs:sequence>
          <xs:element name="text" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:simpleType name="markenTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text"/>
      <xs:enumeration value="tabelle"/>
      <xs:enumeration value="liste"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
4

1 回答 1

1

根据您提供的模式,我想说以下几点:请记住,XML 模式中复杂类型的继承与您在 Java 中所期望的并不完全相同。

在您的模式/对象模型中,您有一个类型inhalt和一个text从它继承的类型。inhalt是抽象的。到现在为止还挺好。不同之处在于类型的使用。您将类型分配给名为inhalt元素inhalt。这意味着只有元素inhalt可以出现在那里,而不是text,并且 xsi:type 覆盖对于指示正在使用的子类型是必要的(解析器无法猜测它)。

如果您在子类型之外使用替换组,则可以实现您想要实现的目标,这将允许元素text出现。重构模式如下:

  1. 创建一个名为“inhalt”的全局元素,然后键入“inhalt”(如果您认为这会造成混淆,请将类型名称设为大写)
  2. 创建一个名为“text”的全局元素并输入“text”。将“text”的替换组属性设置为“inhalt”。
  3. 将“marke”中的局部元素引用替换为对全局元素的引用。

作为参考,这里是新的模型marke

<xs:element name="inhalt" type="inhalt"/>
<xs:element name="text" type="text" substitutionGroup="inhalt"/>
<xs:complexType name="marke">
    <xs:sequence>
        <xs:element ref="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
</xs:complexType>

在这之后,text就会出现在里面marke

于 2010-09-02T12:34:46.180 回答