2013-03-06 60 views
1

对于我正在使用的XSD,验证的标记是有效的HTML。我试图应用的规则应该能够应用于任何HTML元素。换句话说,我的规则是元素不可知的。我主要关心限制属性。元素不可知约束?

<xs:element name="div"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any> 
        <xs:attribute name="containerColor"> 
         <xs:simpleType> 
          <xs:restriction base="xs:string"> 
           <xs:enumeration value="green"/> 
           <xs:enumeration value="red"/> 
           <xs:enumeration value="blue"/> 
           <xs:enumeration value="yellow"/> 
           <xs:enumeration value="grey"/> 
           <xs:enumeration value="black"/> 
          </xs:restriction> 
         </xs:simpleType> 
        </xs:attribute> 
        <xs:unique name="id" > 
         <xs:selector xpath="*"></xs:selector> 
         <xs:field xpath="*"></xs:field> 
        </xs:unique> 
       </xs:any> 
      </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我是新来的XSD。我相信我有一些根本性的误解。

  • 在上面的例子我想说任何可以(但不要求有)一个“containerColor”属性。如果使用该属性,则必须是枚举颜色之一。

  • 此外,任何元素都可以有一个ID,它应该是唯一的。

在上面的尝试,我得到投诉的任何元素不是属性/唯一一个有效的上下文。

从选择器的角度来看,我关心的是将规则应用于所有元素的集合而不是特定的元素。有没有一种方法可以用XSD实现这一点?

回答

1

您是否可以编写XSD架构来执行您想要的操作取决于您要约束的文档的多少以及您是否有任何相关元素命名的自由。

在通常情况下,由于属性很少适用于所有元素,所以属性被声明为与特定的复杂类型相关联(因此与特定元素间接相关)。 (例如:当它出现在HTML头和meta元素上时,是否有一个名为containerColor的属性有意义?那么它是什么意思?)

但是XSD支持顶层属性的声明。以下XSD架构声明名称为idcontainerColor的属性不在任何名称空间中。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:attribute name="containerColor"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
     <xs:enumeration value="green"/> 
     <xs:enumeration value="red"/> 
     <xs:enumeration value="blue"/> 
     <xs:enumeration value="yellow"/> 
     <xs:enumeration value="grey"/> 
     <xs:enumeration value="black"/> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:attribute> 

    <xs:attribute name="id" type="xs:ID"/> 

</xs:schema> 

它们是顶级属性,不绑定到特定元素。所以原则上你可以把这个模式交给一个XSD验证器,请求它扫描文档,接受没有XSD声明的所有内容并验证它有声明的所有内容。 (XSD规范将此称为“宽松验证”。)唯一的声明是你的两个属性,所以它会验证它们并且通过其他所有的东西。其效果是您所声明的属性在所有元素上都是允许的,并在出现的任何地方进行验证。

这里的主要问题是XSD不会试图规范甚至定义验证器与外部世界之间的接口,也不能保证声明符合规范的给定验证器将允许您使用此类规范调用它一个要求。 (另一方面,对于许多XSD验证程序,从文档元素开始的松散验证是默认操作模式,有时是唯一可以获得的操作模式,所以这可能适用于您正在使用的任何验证程序。)

另一种方法是为XHTML制作XSD架构文档的本地副本,并将您的属性添加到应该能够承载它们的所有元素。 XSD 1.1有一些应该使这个任务更容易的构造。

1

不,你想要的东西不能用XSD通配符来表达。 This link提供了一个视图,您可以使用XSD 1.0中的xsd:any particle和XSD 1.1中的this one做什么。基本上,你可以嵌套的唯一东西是一个注释。

如果您确实需要,您必须使用其他模式语言。放松NG是模式语言(我知道的)中唯一可以通过使用通用名称类< anyName>为<元素>很容易地做到的事情。然而,它不(我相信)处理唯一性 - 你必须依靠xsd:ID数据类型。

至于唯一性和Schematron,have a look at this,也在SO上。如果XSD 1.1是一个选项,那么您至少可以替换Schematron部件。