xpathルールをコピーして、ソナー(plsql)にカスタムルールを書き込もうとしています。このルールのタスクは、savepoint ステートメントが欠落している 'rollback to savepoint' ステートメントをマークすることです。
2 つのセーブポイントと 3 つのロールバック ステートメントの場合、AST (抽象構文ツリー) は次のようになります。
<PROCEDURE_DEFINITION>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spX" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
</PROCEDURE_DEFINITION>
セーブポイント spX がないため、最後のロールバックをマークする XPath クエリを検索します。しかし、この xpath は最後の両方のロールバックをマークします
//PROCEDURE_DEFINITION//ROLLBACK[
IDENTIFIER[
@tokenValue =
./ancestor::PROCEDURE_DEFINITION
//SAVEPOINT/IDENTIFIER[2]/@tokenValue
]
]
助言がありますか?
編集:
私はこの次善の解決策を見つけました:
//PROCEDURE_DEFINITION//ROLLBACK
[
not(
./IDENTIFIER[3]/@tokenValue =
ancestor::PROCEDURE_DEFINITION//SAVEPOINT/IDENTIFIER[2]/@tokenValue
)
]
PLSQL は大文字と小文字を区別しません。しかし、翻訳機能を追加すると、最初と最後の ROLLBACK ノードがマークされます。すべてのロールバックの名前は、最初のセーブポイントの名前と一致すると思いますか?