不合格的XSD全局属性引用

时间:2012-01-18 00:44:40

标签: xml xsd xml-namespaces

以下XML架构无法使用以下XML实例文档进行验证。有没有办法重写模式,以便实例文档在给定的约束内验证?

约束

  • 该元素不能是元素的本地属性
  • 实例文档必须保持不变

(无效)架构

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:attribute name="sample-attribute" type="xs:string" />

    <xs:element name="sample-element">
        <xs:complexType>
            <xs:attribute ref="sample-attribute" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>

实例

<?xml version="1.0" encoding="utf-8"?>
<sample-element xmlns="http://tempuri.org/XMLSchema.xsd" sample-attribute="test" />

2 个答案:

答案 0 :(得分:9)

将{global} xs:attribute元素包装在xs:attributeGroup元素中。

xs:element元素中,请参阅xs:attributeGroup元素。

name元素的xs:attributeGroup属性可以与name元素的xs:attribute属性具有相同的值。

模式

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:attributeGroup name="sample-attribute">
      <xs:attribute name="sample-attribute" type="xs:string" use="required"/>
    </xs:attributeGroup>

    <xs:element name="sample-element">
      <xs:complexType>
        <xs:attributeGroup ref="sample-attribute" />
      </xs:complexType>
    </xs:element>
</xs:schema>

与问题

无直接关系的信息

这不是上述答案的扩展,也不是替代答案,只是您可能会发现有用的相关信息(不在您的问题的限制范围内)。

您可以保持原始模式不变,并在文档实例中明确限定(添加名称空间前缀)属性名称,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<t:sample-element
    xmlns:t="http://tempuri.org/XMLSchema.xsd"
    t:sample-attribute="test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://tempuri.org/XMLSchema.xsd sample.xsd"/>

(注意根元素名称和属性名称上的t:名称空间前缀。)

答案 1 :(得分:5)

Namespaces in XML表示“未加前缀的属性名称的名称空间名称始终没有值”;另一方面,你将属性限制为不是本地的,所以唯一的方法(信用转到@GrahamHannington)是将它包装在一个属性组中,从而允许属性定义为没有合格就重复使用。