首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath-1.0:标记相对节点缺失的节点

XPath-1.0:标记相对节点缺失的节点
EN

Stack Overflow用户
提问于 2013-06-25 11:53:50
回答 1查看 439关注 0票数 1

我试图通过复制xpath规则在sonar (plsql)中编写自定义规则。此规则的任务是标记“回滚到保存点”语句,其中缺少保存点语句。

对于2条保存点和3条回滚语句,AST (抽象语法树)如下所示:

代码语言:javascript
复制
<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> 

我搜索标记最后回滚的XPath查询,因为保存点spX丢失了。但是这个xpath标记最后两个回滚。

代码语言:javascript
复制
//PROCEDURE_DEFINITION//ROLLBACK[
    IDENTIFIER[
        @tokenValue =
            ./ancestor::PROCEDURE_DEFINITION
                //SAVEPOINT/IDENTIFIER[2]/@tokenValue
    ]
]

有什么建议吗?

编辑:

我找到了一个次优的解决方案:

代码语言:javascript
复制
//PROCEDURE_DEFINITION//ROLLBACK
[
  not(
    ./IDENTIFIER[3]/@tokenValue = 
    ancestor::PROCEDURE_DEFINITION//SAVEPOINT/IDENTIFIER[2]/@tokenValue
  )
]

PLSQL不区分大小写。但是,当我添加转换函数时,首先和最后一个回滚节点会被标记出来。我想所有回滚的名字都会和第一个保存点的名字一致?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-27 08:13:54

首先,根据您显示的AST,在我看来,这是您想要在XPath查询上运行的PL/SQL代码:

代码语言:javascript
复制
DECLARE
  PROCEDURE foo AS
  BEGIN
    SAVEPOINT spA;
    SAVEPOINT spB;

    ROLLBACK spB; -- Compliant
    ROLLBACK spA; -- Compliant

    ROLLBACK spX; -- Non-Compliant
  END;
BEGIN
  NULL;
END;
/

当我使用SSLR /SQL运行您的第一个XPath查询时,将选择回滚到'spB‘和'spA’,而不是选择'spX‘。

第二个XPath查询选择所有这些查询。

在我看来,您只想选择一个“spX”,因为没有相应的保存点。

对第一个查询的简单更改允许通过使用not()否定条件来反转所选节点:

代码语言:javascript
复制
//PROCEDURE_DEFINITION//ROLLBACK[
    not(IDENTIFIER[
        @tokenValue =
            ./ancestor::PROCEDURE_DEFINITION
                //SAVEPOINT/IDENTIFIER[2]/@tokenValue
    ])
]

但实际上我建议您删除查询的PROCEDURE_DEFINITION部分,因为保存点和ROLLBACK语句在函数或匿名块中也是有效的:

代码语言:javascript
复制
//ROLLBACK[not(IDENTIFIER[@tokenValue = //SAVEPOINT/IDENTIFIER[2]/@tokenValue])]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17296618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档