如何使用工具检查xsd架构是否有效?

时间:2017-12-13 10:44:02

标签: xml validation xsd

我如何构建一些参考证明告诉架构有效与否。我和承包商有争执。他们使用一种工具,我正在使用其他工具。他们说架构有效,而我不同意。谷歌搜索几乎没有任何东西,因为每个人都在寻找xml验证。我需要验证架构本身。

例如,考虑这个片段(s0是默认命名空间):

<s:complexType name="PairOfIDCols">
    <s:complexContent>
        <s:extension base="s0:Cols">
            <s:attribute name="ID" type="s:string" use="required"/>
        </s:extension>
    </s:complexContent>
</s:complexType>
<s:complexType name="Cols">
    <s:sequence>
        <s:element name="Row" type="s0:PairOfNRows" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </s:sequence>
    <s:attribute name="ID" type="s:string"/>
    <s:attribute name="Name" type="s:string"/>
    <s:attribute name="Visible" type="s:boolean"/>
</s:complexType>

它是架构的有效部分吗?如果不是 - 它违反了哪个w3c模式定义?

1 个答案:

答案 0 :(得分:3)

没有明确的W3C批准的工具可以为您解答这个问题。您基本上需要查看特定工具报告的错误并将其与规范进行比较 - 这并不容易,因为XSD规范非常难以阅读。当然,即使您同意一个工具是错误的,您也必须决定如何处理它:放弃使用该工具并不总是一个实用的选择。不幸的是,对于XSD,工具之间存在相当多的偏差(部分原因是规范难以理解......对于那些相信正式规范的人,我个人认为可读规范更为重要。)

这里的特殊问题是,通过扩展从另一个类型B派生的类型R是否包含已在B中定义的属性的定义?

知道模式必须满足三组规则才有效是有用的:

(a)schema-for-schema-documents定义了模式文档中元素和属性的基本语法结构

(b)对模式的XML表示的约束定义了无法在S4SD中方便地表达的XML表示的附加规则

(c)对模式组件模型的约束定义了适用于从XML构造的模式组件的规则。

本例中的其中一条规则在§3.4.6模式组件约束中:复杂类型定义属性正确;规则4说“{attributes uses}中的两个不同的属性声明不能具有相同的{name}和{target namespace}。”

要确定是否违反了此规则,我们需要了解如何计算{attribute uses}属性。这在§3.4.2中给出:

{attribute uses}:   A union of sets of attribute uses as follows:
1 The set of attribute uses corresponding to the <attribute> [children], if any....

3 The {attribute uses} of the type definition ·resolved· to by the ·actual value· of the base [attribute]

这个集合显然包含两个具有相同名称的属性,这违反了约束条件;除非您将术语“联合”解释为形成一个已经消除了重复项的集合。如果成员相同,则联合操作会删除成员。然后,这将引导您进入一个臭名昭着的空白,规范本身在§3.4.6中承认:“......组件标识的概念,只是本规范的此版本未完全定义......”

但是在这种情况下,两个属性的使用不能相同。属性使用的一个属性是相应的属性声明(像这样的本地<xs:attribute>生成属性声明和属性使用)。属性声明的一个属性是它的{scope},它本质上是包含复杂类型。这两个属性声明具有不同的{scope},因此它们是不同的,因此两个属性使用具有不同的{attribute declaration}属性,因此属性使用是不同的,因此union包含两者,因此架构无效。