函数返回类型问题

时间:2012-01-06 09:44:14

标签: xquery

根据w3c

  

ElementTest用于通过名称和/或类型注释匹配元素节点。 ElementTest可以采用以下任何一种形式。在这些表单中,ElementName不需要出现在范围内元素声明中,但TypeName必须存在于范围内模式类型[错误:XPST0008]中。请注意,替换组不会影响ElementTest的语义。   ...   如果derives-from(AT,TypeName)为true,则element(*,TypeName)匹配元素节点,无论其名称如何,其中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()是element(*,ProductComponent);提供的值具有项类型元素({http://cdm.basic.upc.com}产品,{http://www.w3.org/2001/XMLSchema}无类型)

我可能会弄错,但类型实际上是cdm-base:ProductComponent而不是无类型。 我不知道问题在哪里......

我正在使用氧气13.0与Saxon EE 9.3.0.5

1 个答案:

答案 0 :(得分:1)

Saxon在这里确实是正确的,所有直接构造的(“内联”)元素都具有类型xs:untyped(如果构造模式设置为保留,则为xs:anyType

在根据您的模式验证元素之前,xsi:type元素是没有意义的。最简单的方法是将元素包装在validate表达式中:

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 /> }
};