コンテンツにスキップ

BREX(ビジネスルール交換)

BREX(Business Rules Exchange)は、プロジェクトや組織が S1000D の使い方について合意した決まり(ビジネスルール)のうち、XML の構造に関わるものを機械で読める形で書いたデータモジュールです。すべてのデータモジュールは、自分が従う BREX を 1 つ参照します。

BREX は「設定ファイル」ではなくデータモジュール

Section titled “BREX は「設定ファイル」ではなくデータモジュール”

BREX は情報コード 022 のデータモジュールで、他のデータモジュールと同じく識別・状態部を持ち、CSDB で版管理されます。内容部 <brex> には 4 つのブロックが入ります。

flowchart TB
  B["brex"] --> CI["commonInfo<br/>背景・適用の説明"]
  B --> SNS["snsRules<br/>システム番号(SNS)の体系"]
  B --> CR["contextRules(繰り返し可)<br/>rulesContext = 対象スキーマ"]
  B --> NC["nonContextRules<br/>文章で書かれた取り決め"]
  CR --> SR["structureObjectRuleGroup › structureObjectRule<br/>objectPath / objectUse / objectValue"]
  CR --> NR["notationRuleList › notationRule<br/>使ってよい図・マルチメディアの形式"]
ブロック 書かれているもの 機械で検査できるか
snsRules システム・サブシステム・サブサブシステム・組立のコードと名称の階層 参照用(SNS の意味を引く)
contextRules › structureObjectRule XPath(objectPath)で指した要素・属性について、使ってよいか(allowedObjectFlag)、説明(objectUse)、許可する値とその意味(objectValue) できる
contextRules › notationRuleList 使ってよい図・マルチメディアの形式(NOTATION) できる
nonContextRules スキーマや要素に結び付けられないプロジェクト固有の規則 できない(人が判断する)

contextRules は対象のスキーマごとに繰り返せます。rulesContext 属性にスキーマの URL を書くとその種類のデータモジュールだけに適用され、省略するとすべてに適用されます。スキーマ固有のルールは共通ルールを上書きし、かつ共通ルールの範囲を狭める方向でなければなりません。

<structureObjectRule>
<brDecisionRef brDecisionIdentNumber="KB-00003"/>
<objectPath allowedObjectFlag="2">//dmIdent/dmCode/@infoCode</objectPath>
<objectUse>使ってよい情報コード</objectUse>
<objectValue valueForm="single" valueAllowed="040">説明</objectValue>
<objectValue valueForm="range" valueAllowed="500~599">手順</objectValue>
<objectValue valueForm="pattern" valueAllowed="[0-9]{2}[A-Z]">プロジェクト拡張</objectValue>
</structureObjectRule>
部分 意味
brDecisionIdentNumber ルール ID。ビジネスルール決定への参照で、既定 BREX では BREX-S1-NNNNN(版が変わっても番号は変わらない)
objectPath ルールの対象を XPath で指す。not(…) のように真偽値を返す式も書かれる
allowedObjectFlag 0 = 使ってはならない、1 = 必ず含める、2 = 任意(使うなら値は objectValue のどれかに合わせる)
objectUse 人が読む説明。照合結果に添える
objectValue 許可する値。valueForm が single(一致)、range(500~599 や brsl51~brsl99 のような範囲)、pattern(正規表現の全体一致)。本文がその値の意味
brSeverityLevel(省略可) 重大度 brsl01〜brsl99。意味はプロジェクトが決める

この例は、このプロジェクトのテストデータ(券売機プロジェクトの BREX)から取ったものです。

BREX は重ねて使います。プロジェクトの BREX は組織の BREX を、組織の BREX は S1000D が配布する既定 BREX を、それぞれ識別・状態部の brexDmRef で参照します。既定 BREX は自分自身を参照し、連鎖の終端になります。

flowchart LR
  DM["データモジュール"] -->|brexDmRef| P["プロジェクトの BREX"]
  P -->|brexDmRef| O["組織の BREX(任意)"]
  O -->|brexDmRef| D["S1000D 既定 BREX<br/>(自分自身を参照)"]
  • 下位の BREX は上位の BREX を制限することしかできません。上位が A〜M を許すなら、下位は A〜H に絞れますが N を許せません。
  • 下位は上位のルールを繰り返しません。完全なルール集合を得るには、連鎖全体を読む必要があります。
  • 照合は各層に個別に行い、どの層にも違反が無いときだけ合格です。層を統合して矛盾を解決するのは検査側の責務ではありません(Issue 7 Chap 7.9)。

既定 BREX(Issue 7)には 274 の構造ルールと 1,445 の許可値が入っています。設定可能属性の既定の値集合、許可する情報コード、学習コード、スキーマで表せない規則の集まりです。

照合の処理は共有ライブラリ s1000d-core にあり、s1000d-brex-mcp と s1000d-verify-mcp がそれを呼びます。次の規則で照合します。

項目 扱い
allowedObjectFlag="0" objectPath の結果が空でなければ違反(forbidden)
allowedObjectFlag="1" 結果が空なら違反(missing)
allowedObjectFlag="2" 結果の各節点の値を objectValue と照合し、どれにも合わなければ違反(value)。valueAllowed を持つ objectValue が無ければ照合しない
真偽値を返す objectPath true を「対象あり」、false を「対象なし」として同じ規則で判定
rulesContext 対象データモジュールの xsi:noNamespaceSchemaLocation とスキーマのファイル名が一致するブロックと、共通ブロックを適用
notationRuleList DOCTYPE の ENTITY … NDATA で使われている NOTATION が、許可された集合(基本セット+スキーマ固有の追加・除外)に無ければ違反(notation)
nonContextRules 判定せず、手動確認の項目として返す
階層 連鎖を既定 BREX までたどり、各層に個別に照合。どの層にも違反が無く、見つからなかった BREX も無いときだけ合格

公式サンプルも既定 BREX に違反する

Section titled “公式サンプルも既定 BREX に違反する”

配布物の Bike Samples(自転車の例。106 のデータモジュールのうち、自転車 BREX 自身を除いた 105)を「自転車 BREX → 既定 BREX」の 2 層に照合すると、既定 BREX への違反が合計 55 件見つかります。公式サンプルでも既定 BREX をすべて満たしてはいません。既定 BREX 側の厳しさなのか、サンプル側の不備なのかは調べきれていませんが、「既定 BREX の違反が出ること」と「データモジュールが使えないこと」は別だ、という感覚を持っておくと結果を読みやすくなります。