Xsd 将属性绑定到其他现有属性

Xsd 将属性绑定到其他现有属性,xsd,Xsd,我想创建一个XSD。 XSD中的一个可选元素是 XSD的另一个子结构是 <Order Name="NameOfOrder">...</Order> <Order Name="NameOfOrder2">...</Order> ... 可以为使用xs:ID属性类型,为使用xs:IDREF属性类型 示例XSD: 无效XML示例:给出错误IDREF“NameOfOrder_X”没有ID/IDREF绑定。在Xerces <doc xmlns:xsi

我想创建一个XSD。 XSD中的一个可选元素是

XSD的另一个子结构是

<Order Name="NameOfOrder">...</Order>
<Order Name="NameOfOrder2">...</Order>
...

可以为使用xs:ID属性类型,为使用xs:IDREF属性类型

示例XSD:

无效XML示例:给出错误IDREF“NameOfOrder_X”没有ID/IDREF绑定。在Xerces

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="book.xsd">
  <Order Name="NameOfOrder">...</Order>
  <Order Name="NameOfOrder2">...</Order>
  <PrintoutSettings OrderSource="NameOfOrder_X"/>
</doc>
有效XML的示例:


可以为使用xs:ID属性类型,为使用xs:IDREF属性类型

示例XSD:

无效XML示例:给出错误IDREF“NameOfOrder_X”没有ID/IDREF绑定。在Xerces

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="book.xsd">
  <Order Name="NameOfOrder">...</Order>
  <Order Name="NameOfOrder2">...</Order>
  <PrintoutSettings OrderSource="NameOfOrder_X"/>
</doc>
有效XML的示例:


您从@DevNull得到的答案在技术上是正确的+1;然而,它不是那么多的XSD;查看schema入门中的内容,了解ID/IDREF的限制

我将采用DevNull提出的模式并对其进行修改,以向您展示推荐的依赖于key/keyref的XSD方法

更新:我获取了您的模式并进行了更新,以确保它足以用于我的测试:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:complexType name="Order">
        <xs:sequence>
            <xs:element form="qualified" minOccurs="0" name="Documents" type="Documents"/>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="Translator" type="xs:string" use="required"/>
        <xs:attribute name="Proofreader" type="xs:string" use="required"/>
        <xs:attribute name="LockedBy" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Documents"/>
    <xs:complexType name="Orders">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Order" type="Order"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="QQDBData">
        <xs:sequence>
            <xs:element minOccurs="0" name="Orders" type="Orders"/>
            <xs:element minOccurs="0" name="LocalSettings" type="Settings"/>
        </xs:sequence>
        <xs:attribute default="2000-01-01" name="CreationDate" type="xs:date" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Settings">
        <xs:attribute name="OrderSource" use="required" type="xs:string"/>
    </xs:complexType>
    <xs:element name="QQDBData" type="QQDBData">
        <xs:key name="PK-Orders">
            <xs:selector xpath="Orders/Order"/>
            <xs:field xpath="@Name"/>
        </xs:key>
        <xs:keyref name="FK-PrintoutSettings" refer="PK-Orders">
            <xs:selector xpath="LocalSettings"/>
            <xs:field xpath="@OrderSource"/>
        </xs:keyref>
    </xs:element>
</xs:schema> 
我要做的是更新选择器,因为通过引入额外的标记,XPath已经改变了。我总是尝试将约束可视化,以确保所描述的XPath仍然有意义

更新的示例XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<QQDBData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreationDate="2000-01-01">
    <Orders>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
    </Orders>
    <LocalSettings OrderSource="OrderSource1"/>
</QQDBData>
同一无效XML的错误消息可能看起来像我正在使用QTAssistant验证:

加载[],第12行位置3时出错
Keyref中的键序列“OrderSource1”未能引用某个键。

您从@DevNull获得的答案在技术上是正确的+1;然而,它不是那么多的XSD;查看schema入门中的内容,了解ID/IDREF的限制

我将采用DevNull提出的模式并对其进行修改,以向您展示推荐的依赖于key/keyref的XSD方法

更新:我获取了您的模式并进行了更新,以确保它足以用于我的测试:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:complexType name="Order">
        <xs:sequence>
            <xs:element form="qualified" minOccurs="0" name="Documents" type="Documents"/>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="Translator" type="xs:string" use="required"/>
        <xs:attribute name="Proofreader" type="xs:string" use="required"/>
        <xs:attribute name="LockedBy" type="xs:string" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Documents"/>
    <xs:complexType name="Orders">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Order" type="Order"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="QQDBData">
        <xs:sequence>
            <xs:element minOccurs="0" name="Orders" type="Orders"/>
            <xs:element minOccurs="0" name="LocalSettings" type="Settings"/>
        </xs:sequence>
        <xs:attribute default="2000-01-01" name="CreationDate" type="xs:date" use="optional"/>
    </xs:complexType>
    <xs:complexType name="Settings">
        <xs:attribute name="OrderSource" use="required" type="xs:string"/>
    </xs:complexType>
    <xs:element name="QQDBData" type="QQDBData">
        <xs:key name="PK-Orders">
            <xs:selector xpath="Orders/Order"/>
            <xs:field xpath="@Name"/>
        </xs:key>
        <xs:keyref name="FK-PrintoutSettings" refer="PK-Orders">
            <xs:selector xpath="LocalSettings"/>
            <xs:field xpath="@OrderSource"/>
        </xs:keyref>
    </xs:element>
</xs:schema> 
我要做的是更新选择器,因为通过引入额外的标记,XPath已经改变了。我总是尝试将约束可视化,以确保所描述的XPath仍然有意义

更新的示例XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<QQDBData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreationDate="2000-01-01">
    <Orders>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
        <Order Name="Name1" Translator="Translator1" Proofreader="Proofreader1" LockedBy="LockedBy1">
            <Documents/>
        </Order>
    </Orders>
    <LocalSettings OrderSource="OrderSource1"/>
</QQDBData>
同一无效XML的错误消息可能看起来像我正在使用QTAssistant验证:

加载[],第12行位置3时出错
Keyref中的键序列“OrderSource1”未能引用某个键。

订单和打印输出设置之间的多重性关系是什么?我敢打赌,许多订单使用一个打印输出@DevNull使用ID/IDREF的方法是正确的,但根据两种复杂类型之间的关系,可能需要颠倒使用方法。订单和打印输出设置之间的多重关系是什么?我敢打赌,许多订单使用一个打印输出@DevNull使用ID/IDREF是正确的,但是根据两个ComplexTypes之间的关系,可能需要反向使用。干得好。我写了一篇关于多重性的澄清评论。干得好。我写了一篇关于多重性的澄清评论。我有一个问题。Order元素是一个复杂类型,其子元素是复杂类型,因此我在Order的xs:NMToken类型中遇到了一个错误。什么是正确的解决方案?@shounbough,顺序不需要是文本simpleContent;也可能是复杂类型,它不会改变解决方案中的任何内容。因此,我在问题中添加了一些XSD代码。问题是,我在验证XML文档后没有收到任何错误。也许我忘了什么?@shounbough,请看更新后的帖子;我必须修复选择器中使用的XPath;看一看图表,并与您的XSD进行比较,应该很容易看出区别。我有一个问题。Order元素是一个复杂类型,其子元素是复杂类型,因此我在Order的xs:NMToken类型中遇到了一个错误。什么是正确的解决方案?@shounbough,顺序不需要是文本simpleContent;也可能是复杂类型,它不会改变解决方案中的任何内容。因此,我在问题中添加了一些XSD代码。问题是,我在验证XML文档后没有收到任何错误。也许我忘了什么?@shounbough,请看更新后的帖子;我必须修复选择器中使用的XPath;看一看图表,并与您的XSD进行比较,应该很容易看出区别。