restricciones - Especifique XSD de modo que un elemento XML debe tener el valor de otro elemento XML
xml schema restricciones (3)
Parece una enumeración y tu ejemplo es muy similar al ejemplo de w3schools .
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="drives" type="carType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Si no, probablemente quieras que Pangeas responda.
No estoy seguro si esto es posible con XML / XSD, y no he tenido mucha suerte en buscarlo.
¿Puede especificar un XSD para que cuando escriba su XML, pueda tener un elemento que haga referencia a uno de los valores contenidos en otro elemento XML?
Por ejemplo, si tuviera este XML:
<car>Audi</car>
<car>Ford</car>
<car>Honda</car>
<person>
<drives>Audi</drives>
</person>
¿Cómo se especifica el XSD para las unidades para que sea uno de los valores ingresados para el automóvil?
XSD 1.0 funcionaría. Idealmente, debería usar una combinación del mismo tipo de esquema e integridad referencial.
Un XSD:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="sample">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="car" type="car"/>
<xsd:element name="person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="drives" type="car"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKCars">
<xsd:selector xpath="car"/>
<xsd:field xpath="."/>
</xsd:key>
<xsd:keyref name="FKPersonCar" refer="PKCars">
<xsd:selector xpath="person/drives"/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
<xsd:simpleType name="car">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Audi"/>
<xsd:enumeration value="Ford"/>
<xsd:enumeration value="Honda"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Diagrama:
XML no válido:
<sample>
<car>Audi</car>
<car>Ford</car>
<car>Honda</car>
<person>
<drives>Aud</drives>
</person>
</sample>
Error:
Error occurred while loading [], line 7 position 16
The ''drives'' element is invalid - The value ''Aud'' is invalid according to its datatype ''car'' - The Enumeration constraint failed.
specify-xsd-such-that-an-xml-element-must-have-the-value-of-another-xml-element.xml is invalid.
Este error te dice que usar un valor enumerado hace que la clave / keyref sea superflua: no podrás activarla.
Sin embargo, si no puede tener una lista de valores enumerados en su XSD, debe al menos exigir una longitud mínima para el tipo, para evitar valores vacíos que crean estragos. Por supuesto, aunque se recomienda compartir el tipo, no es necesario.
XSD modificado:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="sample">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="car" type="car"/>
<xsd:element name="person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="drives" type="car"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKCars">
<xsd:selector xpath="car"/>
<xsd:field xpath="."/>
</xsd:key>
<xsd:keyref name="FKPersonCar" refer="PKCars">
<xsd:selector xpath="person/drives"/>
<xsd:field xpath="."/>
</xsd:keyref>
</xsd:element>
<xsd:simpleType name="car">
<xsd:restriction base="xsd:normalizedString">
<xsd:minLength value="1"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Mensaje de error:
Error occurred while loading [], line 9 position 4
The key sequence ''Aud'' in Keyref fails to refer to some key.
specify-xsd-such-that-an-xml-element-must-have-the-value-of-another-xml-element.xml is invalid.
Con XSD 1.1 puedes usar aserciones .
Los componentes de aserción limitan la existencia y los valores de los elementos y atributos relacionados.
Puede usar expresiones XPath 2.0 para realizar la validación / prueba en la aserción.
Este esquema de ejemplo tiene una aserción para el elemento /doc
que asegura que el valor /doc/person/drives
sea igual a uno de sus elementos /doc/car
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1" elementFormDefault="qualified">
<xs:element name="car" type="xs:string" />
<xs:element name="drives" type="xs:string" />
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element ref="drives"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="doc">
<xs:complexType>
<xs:sequence>
<xs:element ref="car" maxOccurs="unbounded"/>
<xs:element ref="person"/>
</xs:sequence>
<xs:assert test="person/drives = car"/>
</xs:complexType>
</xs:element>
</xs:schema>