1

我想从我为另一个 xml 制作的 xsd 检查另一个 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 属性存在于第二个 xsd中key元素的命名属性中 ,换句话说,如果第一个 xsd 中命名的属性值不存在于第二个xsd,一定会出错。 xml 示例: 第一个 xsd 的 xml:value
name

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

第二个xsd的xml:

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

它必须告诉存在错误,因为word第二个 xml 中没有具有属性的标记,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>
4

1 回答 1

2

XSD 验证被设计为与上下文无关,因此任何元素都可以单独验证(与其祖先和兄弟以及其他文档隔离)。所以,不,您想到的那种跨文档验证对于 XSD 是不可能的。

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

于 2013-08-18T17:57:00.583 回答