проблема типа возвращаемого функцией - PullRequest
0 голосов
/ 06 января 2012

Согласно w3c

ElementTest используется для сопоставления узла элемента по его имени и / или аннотации типа.ElementTest может принимать любую из следующих форм.В этих формах ElementName не обязательно должно присутствовать в объявлениях элемента в области, но TypeName должно присутствовать в типах схемы в области [err: XPST0008].Обратите внимание, что группы подстановки не влияют на семантику ElementTest.... element (*, TypeName) совпадает с узлом элемента независимо от его имени, если переменная производного от (AT, TypeName) - true, где AT - аннотация типа узла элемента, а свойство nilled узла - false.

У меня есть эта функция

import schema namespace cdm-base="http://cdm.basic.upc.com" at "file:///Workspace/peal/peal40/trunk/common/schema/cdm-basic.xsd";
declare function local:matchType(

                    $input as element()

                    ) as element(*,cdm-base:ProductComponent..) {

                    <cdm-base:product xsi:type="cdm-base:ProductComponent" />


};

, которая при наборе текста возвращает ошибку:

F [Saxon-EE XQuery 9.3.0.5] Обязательный тип элемента результата функции local: matchType () is element (*, ProductComponent);предоставленное значение имеет элемент типа элемента ({http://cdm.basic.upc.com}product, {http://www.w3.org/2001/XMLSchema}untyped)

Я могу ошибаться, но на самом деле это тип cdm-base: ProductComponent, а не типизированный. Я не понимаю, в чем проблема ...

Я использую кислород 13.0 с Saxon EE 9.3.0.5

1 Ответ

1 голос
/ 06 января 2012

Саксон действительно верен здесь, все непосредственно построенные («встроенные») элементы имеют тип xs:untyped (или xs:anyType, если режим построения установлен на сохранение).

Элемент xsi: type не имеет смысла, пока элемент не будет проверен на соответствие вашим схемам. Самый простой способ сделать это - обернуть элемент в выражение проверки:

import schema namespace cdm-base="http://cdm.basic.upc.com" at "file:///Workspace/peal/peal40/trunk/common/schema/cdm-basic.xsd";

declare function local:matchType(
                   $input as element())
                   as element(*,cdm-base:ProductComponent)
{
    validate { <cdm-base:product xsi:type="cdm-base:ProductComponent" /> }
};

Обратите внимание, что в XQuery 3.0, если вам на самом деле не нужен атрибут xsi:type, вы можете проверить элемент как определенный тип:

import schema namespace cdm-base="http://cdm.basic.upc.com" at "file:///Workspace/peal/peal40/trunk/common/schema/cdm-basic.xsd";

declare function local:matchType(
                   $input as element())
                   as element(*,cdm-base:ProductComponent)
{
    validate type cdm-base:ProductComponent { <cdm-base:product /> }
};
...