根据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
答案 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 /> }
};