以下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" />
答案 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)是将它包装在一个属性组中,从而允许属性定义为没有合格就重复使用。