针对模式和彼此验证一组XML文件的标准方法

时间:2017-07-09 16:14:53

标签: xml validation xsd relationship

我正在开发一种数据传输标准,该标准将简单地涉及(简单地)将项目定义(以XML格式)定义到项目定义模式以及提供满足数据供应模式和客户端定义项目的数据的供应商。定义

我知道我可以通过约定/通过定义要遵循的流程来做到这一点,我的问题是“是否有一种可接受的标准方式来执行此类事情?”,也许使用注释/ appinfo? (我已经google了一下,空了)

我正在谈论的一个例子如下(大部分内容都是为了简洁而删除):

简化的客户端项目定义架构

<xs:schema ...>
    <xs:element name="ProjectConfiguration">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Enum" type="EnumType" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>

    <xs:complexType name="EnumType">
        <xs:sequence>
            <xs:element name="Value" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
</xs:schema>

客户项目定义XML

<ProjectConfiguration id="myproj">
    <Enum name="myenum">
        <Value>AllowedValue1</Value>
        <Value>AllowedValue2</Value>
    </Enum>
</ProjectConfiguration>

简化的供应商数据供应模式

<xs:schema ...>
    <xs:element name="Data">
        <xs:complexType>
            <xs:attribute name="value" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>
                        Here, I want the type to be validated against the list supplied
                        in the Client Project Definition XML.  I know (think) that XSD 
                        won't cut this, but am wondering if there is anything
                        that will in a standard manner. 
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>

为避免疑问,我完全控制了我的代码库,没有外部限制。我不希望客户端为每个项目定义模式,因为最终的解决方案将涉及多个层/库存配置(以及通过配置继承和修改这些配置)。

如果还有另一种与我正在尝试的方式完全不同的方式,我全都听见了!

1 个答案:

答案 0 :(得分:1)

您是正确的,无法在单独的XML文件中指定枚举,并将其作为约束应用于XSD中的值。

  

我不希望客户端为每个项目定义架构,如   最终的解决方案将涉及多层/库存配置   (以及通过配置继承和修改这些)。

就需求而言,这有点模糊,但如果你发现XSD 1.0太有限,这里有一些其他验证选项:

  • XSD 1.1有断言,但它们仅限于访问 当前节点及其后代。
  • Schematron的断言基于XPath,可以调用用户定义的 函数(XSLT语法),反过来可以查阅其他XML文档 例如,包含枚举声明。
  • 原始XSLT将提供最大的功能和灵活性,尽管如此 标准化和预定义结构的费用 Schematron的。