Странное поведение при применении fn: data к инфо-узлу - PullRequest
0 голосов
/ 02 января 2019

Когда я запускаю следующий xquery в MarkLogic ":

xquery version "1.0-ml";

let $envelope := <envelope xmlns="http://marklogic.com/entity-services"> 
                                <info>hello</info>
                             </envelope>

return fn:data($envelope/es:info)

Я получаю эту ошибку:

[1.0-ml] XDMP-NONMIXEDCOMPLEXCONT: fn: data (hello) -Узел имеет сложный тип с несмешанным сложным содержимым

Странно, когда я переименовываю инфо-узел, например, в info1, код работает, как и ожидалось:

xquery version "1.0-ml";

let $envelope := <envelope xmlns="http://marklogic.com/entity-services">
                         <info1>hello</info1>
                     </envelope>

return fn:data($envelope/es:info1)

результат: hello (asожидается)

Может кто-нибудь объяснить мне эту черную магию?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Поскольку fn: data () потенциально взаимодействует со схемами, рассмотрите возможность использования fn: string () для получения текста элемента в виде строки.

0 голосов
/ 07 января 2019

MarkLogic пытается извлечь введенное значение из ваших данных при использовании fn:data().MarkLogic будет искать подходящую схему для этой цели.Поскольку вы используете пространство имен Entity-Services, оно будет искать схему Entity-Services.Эта схема имеет определенное определение элемента info (как правильно упомянул Майкл), которое не соответствует тому, как вы его используете.

Использование fn:string() вместо fn:data() обычно более надежно, поскольку он будет проходить проверку типа данных.Использование имени элемента, которое не определено в схеме Entity-Services, дает вам быстрое решение, которое будет работать сейчас, но может быть сложно гарантировать, что оно будет работать и в будущем.

Лично яd совет использовать пространство имен сущностей-услуг по назначению.Если вам нужно добавить дополнительные элементы, поместите их в другое пространство имен с сопровождающей схемой или без нее.Или просто отбросьте пространство имен полностью.

HTH!

0 голосов
/ 02 января 2019

Полагаю, это потому, что схема entity-type.xsd определяет элементы как несмешанные:

<xs:complexType name="InfoType">
    <xs:sequence>
      <xs:element ref="es:title"/>
      <xs:element ref="es:version"/>
      <xs:element ref="es:base-uri" minOccurs="0"/>
      <xs:element ref="es:description" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="info" type="es:InfoType"/>

Элемент может иметь смешанное содержимое, если он имеет атрибут mixed="true".Поскольку вы не можете изменить схему в этом случае, я бы попытался использовать string().

declare namespace es = "http://marklogic.com/entity-services";

let $envelope := <envelope xmlns="http://marklogic.com/entity-services"> 
                    <info>
                      <title>hello</title>
                      <version>1.0</version>
                    </info>
                 </envelope>

return $envelope/es:info/string()

. В результате вы получите hello1.0, если это то, что вы хотели.

Ваш пример с info1 работает, потому что этот элемент не определен в схеме (и, следовательно, не будет действительным xml).

...