我想检查一个属性是否存在于另一个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>
答案 0 :(得分:2)
XSD验证设计为无上下文,因此可以单独验证任何元素(从其祖先和兄弟姐妹以及其他文档中隔离)。所以,不,XSD无法实现您想到的那种跨文档验证。
您可以使用Schematron(基本上允许您编写任意XPath表达式以约束您的文档),使用服务建模语言(旨在实现各种跨文档验证)或任何方式执行您所描述的内容图灵完整的编程语言。或者,当然,您可以使用设计流程来检查外部XML文档并从中构建适当的XSD类型(特别是列出相关属性的合法值),并使用生成的XSD来验证您的初始XML文档