XSD架构仅定义属性

时间:2011-08-23 11:58:48

标签: xml xsd

在我编写应用程序的框架中,有许多xml文件,其中节点名称并不重要。所有有价值的信息都放在属性中。节点类型通过属性之一定义。

我想为这些文件编写简单的架构。我认为它应该满足两个主要条件:

  • 每个元素都可以包含定义列表中的属性(例如名称,值,类型[会有更多!])
  • 每个元素都可以包含精确定义的元素序列

如果有可能使属性列表依赖于某些给定(例如类型)参数,那么它将非常有用。

XSD文件可以处理这些xml文件吗?是否可以编写这样的模式?如何定义任何节点的属性列表。

2 个答案:

答案 0 :(得分:0)

您需要为要在xml实例中支持的每个元素和属性组合定义XSD类型。例如

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:all>
        <!-- declarations of any of the types you can use -->
        <xs:element name="MyType1" type="MyType1Type" />
        <!-- etc.. -->
      </xs:all>
    </xs:complexType>
  </xs:element>
  <!-- Type definitions -->
  <xs:complexType name="MyType1>
    <xs:sequence>
      <xs:element name="MyElement1" type="xs:string" />
      <xs:element name="MyElement2" type="xs:date" />
      <!-- etc.. -->
    </xs:sequence>
    <xs:attribute name="MyAttribute1" type="xs:string" />
    <!-- etc.. -->
  </xs:complexType>
  <xs:complexType name="MyType2>
    <xs:sequence>
      <xs:element name="MyElement3" type="xs:string" />
      <xs:element name="MyElement4" type="xs:date" />
      <!-- etc.. -->
    </xs:sequence>
    <xs:attribute name="MyAttribute3" type="xs:string" />
    <!-- etc.. -->
  </xs:complexType>
  <!-- etc.. -->
</xs:schema>

一旦定义了所有可能的类型,就可以支持任何xml文件。

希望这有帮助

编辑或使用xs:anyType类型。

答案 1 :(得分:0)

您可以拥有一个只定义complexType的模式,其中包含所有属性。然后,您面临的挑战是找到一个模式处理器,其API允许您根据该命名类型请求验证给定的输入元素。一种方法是使用模式感知的XSLT处理器:

<xsl:template match="*">
  <xsl:copy-of select="." type="my-complex-type"/>
  <xsl:apply-templates/>
</xsl:template>

将根据您的类型声明验证文档中的每个元素(并生成大量输出,您可以将其丢弃。)