いくつかの機能仕様を読みながら要件を収集しているので、XML スキーマで少しのトレーサビリティ機能を処理できるようにしようとしています。(要件管理には理想的ではありませんが、少なくとも開始点です。)
私がやっていることは、現在読んでいる機能仕様ごとに < functionalSpec>タグを作成することです。見つけた要件ごとに< requirement>タグを作成します。要件がどこから来たのかを追跡できるようにしたいので、< functionalSpec>要素のIDを持つ < trace>要素を作成します。< functionalSpecId>タグにプレーン テキストを入力する代わりに、XSD を検証して、既存の機能仕様に存在するIDのみを入力するようにします。私の問題は、 XML Schema W3C Recommendationsのように見えるところに来ています。ドキュメントには、私がやりたいことは不可能であると書かれています。(約 1/2 ダウン)
{selector} は、宣言されている要素のインスタンスに関連する制限された XPath ([XPath]) 式を指定します。これは、制約が適用される従属要素 (つまり、宣言された要素内に含まれる) のノード セットを識別する必要があります。
私は XSD ファイルにかなり慣れていないので、これを作成するために Oxygen を使用しています。次のエラーが表示されます。
E [Xerces] ID 制約エラー: ID 制約 "KeyRef@1045a2" には、範囲外のキーまたは一意を参照するキー参照があります。
私の質問は、XSD を使用して以下と同じ XML 構造を使用できるようにする方法を知っている人はいますか?
以下は 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>