Я пытаюсь, чтобы моя XML-схема обрабатывала небольшую функциональность трассируемости, поскольку я собираю требования, пока читаю некоторые функциональные спецификации.(Не идеально для управления требованиями, но, по крайней мере, для начала.)
Я создаю тег <<em> functionsSpec> для каждой функциональной спецификации, которую я сейчас читаю.Я создаю тег <<em> требование> для каждого требования, которое я нахожу.Поскольку я хочу иметь возможность отслеживать, откуда появилось требование, я создаю элемент <<em> trace> с id элемента <<em> functionsSpec> .Вместо того, чтобы позволять себе вводить любой простой старый текст в тег <<em> functionsSpecId> , я хочу, чтобы XSD проверил и убедился, что я ввожу только в id , который существует длясуществующая функциональная спецификация.Моя проблема заключается в том, что документация Рекомендации XML-схемы W3C говорит о том, что то, что я хочу сделать, невозможно.(примерно на 1/2 пути вниз)
{селектор} задает ограниченное выражение XPath ([XPath]) относительно экземпляров объявленного элемента .Это должно идентифицировать набор узлов подчиненных элементов (то есть содержащихся в объявленном элементе), к которым применяется ограничение.
Я использую Oxygen для создания этого, так как я довольно плохо знаком с файлами XSD,и это дает мне следующую ошибку:
E [Xerces] Ошибка ограничения идентичности: ограничение идентификации "KeyRef @ 1045a2" имеет ключевую ссылку, которая ссылается на ключ или уникальную информацию, которая находится вне области действия.
Итак, мой вопрос: знает ли кто-нибудь способ, который позволит мне использовать ту же структуру XML, что и у меня ниже, при использовании XSD?
Ниже приведен файл XML.
<?xml version="1.0" encoding="UTF-8" ?>
<srs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="srs req2.xsd"
xmlns="srs">
<requirements>
<requirement DateCreated="2010-06-11" id="1">
<Text>The system shall...</Text>
<trace>
<functionalSpecId>B010134</functionalSpecId>
</trace>
<revisions>
<revision date="2010-06-11" num="0">
<description>Initial creation.</description>
</revision>
</revisions>
</requirement>
</requirements>
<functionalSpecs>
<functionalSpec id="B010134" model="Model-T">
<trace>
<meeting></meeting>
</trace>
<revisions>
<revision date="2009-07-08" num="0">
<description>Initial creation.</description>
</revision>
<detailer>Me</detailer>
<engineer>Me</engineer>
</revisions>
</functionalSpec>
</functionalSpecs>
</srs>
Ниже приведен XSD-файл.
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="srs"
xmlns="srs"
xmlns:srs="srs"
elementFormDefault="qualified">
<!-- SRS -->
<xs:element name="srs" type="SRSType">
</xs:element>
<xs:complexType name="SRSType">
<xs:sequence>
<xs:element ref="requirements" />
<xs:element ref="functionalSpecs" />
</xs:sequence>
</xs:complexType>
<!-- Requirements -->
<xs:element name="requirements" type="RequirementsType">
<xs:unique name="requirementId">
<xs:selector xpath="srs/requirements/requirement" />
<xs:field xpath="@id" />
</xs:unique>
</xs:element>
<xs:complexType name="RequirementsType">
<xs:choice maxOccurs="unbounded">
<xs:element name="requirement" type="RequirementType" />
</xs:choice>
</xs:complexType>
<xs:complexType name="RequirementType">
<xs:complexContent>
<xs:extension base="RequirementInfo">
<xs:sequence>
<xs:element name="trace" type="TraceType" maxOccurs="unbounded" minOccurs="1" />
<xs:element name="revisions" type="RequirementRevisions" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="RequirementRevisions">
<xs:sequence>
<xs:element name="revision" type="RevisionInfo" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="RequirementInfo">
<xs:sequence>
<xs:element name="Text" type="Description" />
</xs:sequence>
<xs:attribute name="DateCreated" type="xs:date" use="required" />
<xs:attribute name="id" type="xs:integer" use="required" />
</xs:complexType>
<!-- Functional Specs -->
<xs:element name="functionalSpecs" type="FunctionalSpecsType">
<xs:unique name="functionalSpecId">
<xs:selector xpath="srs/functionalSpecs/functionalSpec" />
<xs:field xpath="@id" />
</xs:unique>
</xs:element>
<xs:complexType name="FunctionalSpecsType">
<xs:choice maxOccurs="unbounded">
<xs:element name="functionalSpec" type="FunctionalSpecType" />
</xs:choice>
</xs:complexType>
<xs:complexType name="FunctionalSpecType">
<xs:complexContent>
<xs:extension base="FunctionalSpecInfo">
<xs:sequence>
<xs:element name="trace" type="TraceType" maxOccurs="unbounded" minOccurs="1" />
<xs:element name="revisions" type="FunctionalSpecRevisions" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="FunctionalSpecRevisions">
<xs:sequence>
<xs:element name="revision" type="RevisionInfo" minOccurs="1" maxOccurs="unbounded" />
<xs:element name="detailer" type="xs:string" />
<xs:element name="engineer" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="FunctionalSpecInfo">
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="model" type="xs:string" use="required" />
</xs:complexType>
<!-- Requirements, Functional Specs -->
<xs:complexType name="TraceType">
<xs:choice>
<xs:element name="requirementId">
<xs:keyref refer="requirementId" name="requirementIdRef">
<xs:selector xpath="srs/requirements/requirement" />
<xs:field xpath="@id" />
</xs:keyref>
</xs:element>
<xs:element name="functionalSpecId">
<xs:keyref refer="functionalSpecId" name="functionalSpecIdRef">
<xs:selector xpath="srs/functionalSpecs/functionalSpec" />
<xs:field xpath="@id" />
</xs:keyref>
</xs:element>
<xs:element name="meeting" />
</xs:choice>
</xs:complexType>
<!-- Common -->
<xs:complexType name="RevisionInfo">
<xs:choice>
<xs:element name="description" type="Description" />
</xs:choice>
<xs:attribute name="date" type="xs:date" use="required" />
<xs:attribute name="num" type="xs:integer" use="required" />
</xs:complexType>
<xs:complexType name="Description" mixed="true">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Date" type="xs:date" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>