xml – 我可以创建一个XSD架构,在所有复杂类型上放置属性吗?

前端之家收集整理的这篇文章主要介绍了xml – 我可以创建一个XSD架构,在所有复杂类型上放置属性吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想创建一个XSD,它定义一个属性,该属性可以放在来自其他模式的元素或不在任何模式中的元素上.例如,架构看起来像这样:
<xs:schema id="MySchema"
    targetNamespace="http://tempuri.org/MySchema"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/MySchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:attribute name="myAttribute" />
</xs:schema>

文档可能看起来像这样:

<someElement xmlns="http://tempuri.org/OtherSchema" xmlns:m="http://tempuri.org/MySchema">
  <someOtherElement someAttribute="value" m:myAttribute="value2" />
</someElement>

此示例的“OtherSchema”如下所示:

<xs:schema id="OtherSchema"
    targetNamespace="http://tempuri.org/OtherSchema"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/OtherSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="someElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="someOtherElement">
          <xs:complexType>
            <xs:attribute name="someAttribute" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

一个完整的示例,包括执行验证的C#控制台应用程序,可以从http://dl.getdropbox.com/u/407740/SchemaTest.zip下载.我的目标是进行此验证而无需修改“OtherSchema”.这可能吗?

我必须添加一个包装器,将两个不同的模式导入一个(因为xmllint只接受一个xml模式):
<xs:schema id="Wrapper" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="MySchema.xsd" namespace="http://tempuri.org/MySchema"/>
  <xs:import schemaLocation="OtherSchema.xsd" namespace="http://tempuri.org/OtherSchema"/>
</xs:schema>

我可以获得类似问题的唯一方法是编辑OtherSchema,xsd(问题不允许),所以附加一个属性通配符(在现有的之后):

<xs:attribute name="someAttribute" />
 <xs:anyAttribute namespace="##other"/>

我不足以成为XML Schema的专家,说“这是不可能的”,但对我来说似乎不可能.

提案的一个问题是您没有指定新属性显示位置.通常,如果声明属性(或complexElement,modelgroup等),则可以自由引用它.如果您没有明确引用它,它就没有效果.因此,我认为您的提案将被视为已声明但未提及的属性.

您真正想要的是一种说“将此属性添加到每个现有complexType”的方法 – 但您不会这样说.并且,不幸的是,似乎没有办法说出这一点. (甚至没有办法说“将此属性添加到此特定的现有complexType” – 您必须将其包含在原始定义中或根本不包含.)

部分做到的一种方法是<重新定义>另一个模式中的类型 – 我将在第二个答案中添加它.

猜你在找的XML相关文章