是否只允许XSD中的其他现有XML值?(xs:key和xs:keyref)

是否只允许XSD中的其他现有XML值?(xs:key和xs:keyref),xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,让我们以以下示例XML为例: <device> <name>NiceDevice</name> <value>123</value> </device> <user> <name>user1</name> <usesDevice>NiceDevice</usesDevice> </user> <user> <name

让我们以以下示例XML为例:

<device>
  <name>NiceDevice</name>
  <value>123</value>
</device>
<user>
  <name>user1</name>
  <usesDevice>NiceDevice</usesDevice>
</user>
<user>
  <name>user2</name>
  <usesDevice>NiceDevice</usesDevice>
</user>

因为
BadDevice
从未被用作
device/name

使用
xs:key
xs:keyref
来约束
使用设备
具有
设备
名称的值:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="r">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="device" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string"/>
              <xs:element name="value" type="xs:integer"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="user" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string"/>
              <xs:element name="usesDevice" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="deviceKey"  >
      <xs:selector xpath="device"/>
      <xs:field xpath="name" />
    </xs:key>
    <xs:keyref name="deviceKeyRef" refer="deviceKey">
      <xs:selector xpath="user" />
      <xs:field xpath="usesDevice" />
    </xs:keyref>
  </xs:element>
</xs:schema>

那么此XML将是有效的:

<device>
  <name>NiceDevice</name>
  <value>123</value>
</device>
<user>
  <name>user1</name>
  <usesDevice>NiceDevice</usesDevice>
</user>
<user>
  <name>user2</name>
  <usesDevice>BadDevice</usesDevice>
</user>
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="try.xsd">
  <device>
    <name>NiceDevice</name>
    <value>123</value>
  </device>
  <user>
    <name>user1</name>
    <usesDevice>NiceDevice</usesDevice>
  </user>
  <user>
    <name>user2</name>
    <usesDevice>NiceDevice</usesDevice>
  </user>
</r>

精密装置
123
用户1
精密装置
用户2
精密装置
但是这个XML

<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="try.xsd">
  <device>
    <name>NiceDevice</name>
    <value>123</value>
  </device>
  <user>
    <name>user1</name>
    <usesDevice>NiceDevice</usesDevice>
  </user>
  <user>
    <name>user2</name>
    <usesDevice>BadDevice</usesDevice>
  </user>
</r>

精密装置
123
用户1
精密装置
用户2
坏设备
不会,

[错误]try.xml:16:5:cvc标识约束。4.3:未为元素“r”的标识约束找到值为“BadDevice”的键“deviceKeyRef”

按要求


请注意,我在XML中添加了一个根元素,这是XML格式良好所必需的。

可以按照我的要求工作!谢谢!
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="try.xsd">
  <device>
    <name>NiceDevice</name>
    <value>123</value>
  </device>
  <user>
    <name>user1</name>
    <usesDevice>NiceDevice</usesDevice>
  </user>
  <user>
    <name>user2</name>
    <usesDevice>BadDevice</usesDevice>
  </user>
</r>