MarkLogic中的默认架构值

时间:2012-10-30 16:30:23

标签: xml xsd xquery marklogic

我正在尝试通过xdmp:document-insert()插入文档,然后再调用该文档我正在通过validate strict { $xml }验证文档的相应模式,并在插入调用中使用该输出。但是,validate调用的输出不包括架构中指定的默认值。

简化架构:

<xs:schema>
  <xs:complexType name="fields-type" abstract="false" mixed="false">
    <xs:sequence minOccurs="1" maxOccurs="1">
      <xs:element default="Faulkner" maxOccurs="1" minOccurs="0" name="an_author" nillable="false" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="document-type" abstract="false" mixed="false">
    <xs:sequence minOccurs="1" maxOccurs="1">
      <xs:element name="fields" type="fields-type" minOccurs="1" maxOccurs="1" nillable="false"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="document" type="document-type" abstract="false" nillable="false"/>
</xs:schema>

文件:

 <document>
     <fields>
       <an_author/>
     </fields>
 </document>

调用validate strict { $xml }后,输出文档与上面相同,没有向<an_author>元素添加默认值。注意:我还尝试在架构中使用fixed属性代替default,我得到了相同的结果。 xdmp:validate($xml, "strict")也没有返回任何错误。

编辑:根据XQuery验证规范here,输出应该具有指定的默认值。

1 个答案:

答案 0 :(得分:2)

默认值实际上是数据模型的一部分,但在输出数据模型时,它们不一定是序列化的。您可以通过对它们执行路径表达来验证默认属性是否在数据模型中。

如果你想确保它们在输出上被序列化,有一个输出设置会强制它们被发出:

declare option xdmp:output "default-attributes=yes";

(或者您可以在xdmp:quotexdmp:save上设置选项默认属性。)

或者,您可以强制复制数据模型实例,该实例将包含所有属性,但会忘记它们是默认的:

let $d := validate strict { $node }
return document { $d }