marklogi c xdmp: проблема с параметрами http-post - PullRequest
0 голосов
/ 20 февраля 2020

Попытка построить параметр параметров из другого конфига XML для передачи в функцию xdmp:http-post.

let $db-config :=
  <config>
      <user-name>admin</user-name>
      <password>admin</password>
  </config>
let $options :=
        <options xmlns="xdmp:http">
            <authentication method="digest">
                <username>{$db-config/user-name/text()}</username>
                <password>{$db-config/password/text()}</password>
            </authentication>
        </options>
return $options

Вывод приведенного выше кода:

<options xmlns="xdmp:http">
  <authentication method="digest">
    <username>
    </username>
    <password>
    </password>
 </authentication>
</options>

Невозможно чтобы понять, почему xpath возвращается пустым. При удалении пространства имен xmlns="xdmp:http" получается правильный вывод.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Правильно. Это очень тонкий побочный эффект от использования литеральных элементов в пространстве имен по умолчанию внутри вашего XQuery. Простейшим является использование *: префикса с подстановочными знаками:

let $db-config :=
  <config>
      <user-name>admin</user-name>
      <password>admin</password>
  </config>
let $options :=
        <options xmlns="xdmp:http">
            <authentication method="digest">
                <username>{$db-config/*:user-name/text()}</username>
                <password>{$db-config/*:password/text()}</password>
            </authentication>
        </options>
return $options

Вы также можете предварительно определить c значения перед литеральными элементами:

let $db-config :=
  <config>
      <user-name>admin</user-name>
      <password>admin</password>
  </config>
let $user as xs:string := $db-config/user-name
let $pass as xs:string := $db-config/password
let $options :=
        <options xmlns="xdmp:http">
            <authentication method="digest">
                <username>{$user}</username>
                <password>{$pass}</password>
            </authentication>
        </options>
return $options

Или использовать конструкторы элементов:

let $db-config :=
  <config>
      <user-name>admin</user-name>
      <password>admin</password>
  </config>
let $options :=
        element {fn:QName("xdmp:http", "options")} {
            element {fn:QName("xdmp:http", "authentication")} {
                attribute method { "digest" },

                element {fn:QName("xdmp:http", "username")} {
                    $db-config/user-name/text()
                },
                element {fn:QName("xdmp:http", "password")} {
                    $db-config/password/text()
                }
            }
        }
return $options

HTH!

1 голос
/ 20 февраля 2020

Это потому, что вы пытаетесь получить значения из xml без пространства имен и поместить его в xml с пространством имен. Вы можете изменить свой код следующим образом -

xquery version "1.0-ml";
let $db-config :=
  <config>
      <user-name>admin</user-name>
      <password>admin</password>
  </config>
let $options :=
        <options xmlns="xdmp:http">
            <authentication method="digest">
                <username>{$db-config/*:user-name/text()}</username>
                <password>{$db-config/*:password/text()}</password>
            </authentication>
        </options>
return $options

Для более полного понимания того, как работает пространство имен go - https://docs.marklogic.com/guide/xquery/namespaces#chapter

...