xquery, чтобы проверить, является ли значение нулевым, а затем вернуть ноль в виде строки

Я новичок в XQuery. Пожалуйста, помогите мне решить проблему ниже. Я хочу вернуть значение null в виде строки, если приведенное ниже выражение не дает никакого значения.

В настоящее время выходные данные не отображают само поле «имя». Я хочу иметь имя с null. для например-

if (IsNull(expression),null,expression)

$output.dataAccessResponse[1]/*:row/*:name/text()

person gunjan gupta    schedule 05.06.2020    source источник


Ответы (1)


Вы можете использовать функцию fn:exists(), чтобы проверить, действительно ли есть узел text().

exists($output.dataAccessResponse[1]/:row/:name/text())

Вы также можете использовать функцию fn:boolean() для проверки эффективности логическое значение узла.

boolean($output.dataAccessResponse[1]/:row/:name/text())

Если вы хотите проверить, было ли значимое значение, т. е. что-то отличное от пробела, вы можете fn:normalize-space() в предикате, чтобы убедиться, что выбраны только text() узлов с осмысленным текстом, а затем проверить fn:exists().

exists($output.dataAccessResponse[1]/:row/:name/text()[normalize-space()])

В XQuery нет null, поэтому, если вы спрашиваете, что следует вернуть, чтобы указать null, вам следует вернуть пустую последовательность () вместо null.

Итак, вы можете выполнить что-то вроде этого:

let $name := $output.dataAccessResponse[1]/:row/:name/text()
return 
  if (fn:exists($name)) 
  then $name 
  else ()

Но в этот момент это действительно то же самое, что просто попытаться выбрать text() с этим XPath, и он либо вернет узел text(), либо пустую последовательность:

$output.dataAccessResponse[1]/:row/:name/text() 
person Mads Hansen    schedule 05.06.2020
comment
спасибо за быстрый ответ. но я ищу, должен ли код statement.te возвращать исходное значение, если существует пустая последовательность (). Exists вернет true/false. - person gunjan gupta; 05.06.2020
comment
ладно, не совсем понятно, о чем вы спрашивали. Просто обратитесь к узлу text() с помощью XPath, и он либо вернет узел, либо пустую последовательность. Нет необходимости в блоках if/else вообще. - person Mads Hansen; 05.06.2020
comment
Поскольку имя равно null, я получаю ‹MSG›THIS IS TEST MESG‹/MSG› ‹NEW_NUM›N‹/NEW_NUM›. однако я ожидаю вывод в виде ‹name/› ‹MSG›THIS IS TEST MESG‹/MSG› ‹NEW_NUM›N‹/NEW_NUM› - person gunjan gupta; 05.06.2020
comment
я уже указал xpath для текста. $output.dataAccessResponse[1]/:row/:name/text() - person gunjan gupta; 05.06.2020
comment
Если вы хотите скопировать элемент имени, выберите элемент имени. Было бы полезно, если бы вы показали больше кода для контекста и чтобы увидеть, как он оценивается. - person Mads Hansen; 05.06.2020