xpath: префикс должен преобразовываться в пространство имен - PullRequest
0 голосов
/ 11 сентября 2018

Ниже приведен фрагмент XML пакета служб SSIS; Я пытаюсь написать запрос XPath, чтобы найти все операторы «SELECT *» из пакета служб SSIS.

Я получаю ошибку ниже

ERROR: Caused by: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: SQLTask

XML:

    <DTS:Executable
      DTS:refId="Package\TEST\TEST_COUNT"
      <DTS:ObjectData>
        <SQLTask:SqlTaskData
          SQLTask:Connection="{F7343EC3-A89E-4236-962C-FD2EB8B9491E}"
          SQLTask:SqlStatementSource="select * from dbo.TEST where colname1=? and colname2=?"
          SQLTask:ResultType="ResultSetType_SingleRow" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask">
        </SQLTask:SqlTaskData>
      </DTS:ObjectData>
    </DTS:Executable>

Запрос Xpath:

//SQLTask:SqlTaskData[contains(translate(@SQLTask:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@DTS:refId

Мне удалось успешно оценить выражение xpath из https://www.freeformatter.com/xpath-tester.html. Однако фактические пакеты проверяются с помощью правил XPath, определенных в SonarQube, откуда я получаю эту ошибку.

1 Ответ

0 голосов
/ 12 сентября 2018

Вот ваш XPath-запрос с пространством имен с обходом, как указано в комментариях:

//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@*:refId

Для объяснения прочитайте kjhughes отличный ответ здесь .

Теперь получение всех SqlStatementSource, которые содержат «select *», работает одинаково:

//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/@*:SqlStatementSource

Онлайн-демонстрация

илииспользуйте функцию local-name(), как вы уже узнали:

 //*[local-name()='SqlTaskData'][contains(translate(@*[local-name()='SqlStatementSource'],'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select count(*)")]/@*[local-name()='SqlStatementSource']
...