如何验证跨文档引用?

时间:2013-08-18 09:53:27

标签: xml xsd schematron

我想检查一个属性是否存在于另一个xml中的另一个xml中 举个例子,我有这个xsd

<xs:schema version="1.0"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       elementFormDefault="qualified">
<xs:element name="models">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="model" maxOccurs="unbounded" minOccurs="1">
                <xs:complexType>   
                    <xs:attribute name="name" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueModelName">
        <xs:selector xpath="./model"/>
        <xs:field xpath="@name"/>
    </xs:unique>
</xs:element>  

我有另一个xsd

<xs:element name="language">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="word" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="value" maxOccurs="unbounded" minOccurs="1">
                            <xs:complexType>
                                <xs:attribute name="lange" type="xs:string" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="key" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我希望确保第一个xsd中名为name的元素名为model的属性存在于元素key的名为value的属性中第二个xsd
换句话说,如果在第二个xsd中第一个xsd中存在名为name的属性值,则必须发生错误。
xml示例:
第一个xsd的xml:

<model name="A"/>
<model name="B"/>

xml for second xsd:

<word key="A">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>

它必须告诉有错误,因为第二个xml中没有标记word,其属性为B 这可能发生在xsd :)?
虽然这是正确的

<word key="A">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>
<word key="B">
    <value lange="english">Add</value>
    <value lange="frensh">ajouter</value>
</word>

1 个答案:

答案 0 :(得分:2)

XSD验证设计为无上下文,因此可以单独验证任何元素(从其祖先和兄弟姐妹以及其他文档中隔离)。所以,不,XSD无法实现您想到的那种跨文档验证。

您可以使用Schematron(基本上允许您编写任意XPath表达式以约束您的文档),使用服务建模语言(旨在实现各种跨文档验证)或任何方式执行您所描述的内容图灵完整的编程语言。或者,当然,您可以使用设计流程来检查外部XML文档并从中构建适当的XSD类型(特别是列出相关属性的合法值),并使用生成的XSD来验证您的初始XML文档