不合格的XSD全局属性引用

Cal*_*leb 4 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>
Run Code Online (Sandbox Code Playgroud)

<?xml version="1.0" encoding="utf-8"?>
<sample-element xmlns="http://tempuri.org/XMLSchema.xsd" sample-attribute="test" />
Run Code Online (Sandbox Code Playgroud)

Gra*_*ton 9

是.

将(全局)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>
Run Code Online (Sandbox Code Playgroud)

信息与问题没有直接关系

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

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

<?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"/>
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*dea 5

XML中的命名空间声明"未加前缀的属性名称的命名空间名称始终没有值"; 另一方面,您将属性限制为不是本地的,因此唯一的方法(信用转到@GrahamHannington)是将其包装在属性组中,从而允许在不合格的情况下重用属性定义.