2012-10-30 40 views
1

我試圖通過xdmp:document-insert()插入文檔,然後調用我正在通過validate strict { $xml }驗證文檔,並在插入調用中使用該輸出。但是,validate調用的輸出不包含架構中指定的默認值。MarkLogic中的默認模式值

簡化架構:

<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輸出應該具有指定的默認值。

回答

2

默認值實際上是數據模型的一部分,但是當我們輸出數據模型時,它們不一定是序列化的。您可以通過對它們執行路徑表達式來驗證默認屬性是否在數據模型中。

如果你想確保他們得到的輸出序列化,有一個輸出設置,這將迫使他們發出:

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

(或者你可以設置選項上xdmp:quote默認屬性 。或xdmp:save

或者,你可以強制數據模型實例的副本,這將攜帶沿所有的屬性,但忘記了他們拖欠:

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

我不認爲你理解我的問題。在'xs:element'模式中設置的默認屬性應該在調用'validate'之後使'an_author'的值爲'Faulkner'。從XML-Schema規範[這裏](http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints)中可以看出,「模式處理器提供的元素的值等於默認屬性的值」。 – sinemetu1

+1

我想她有可能不理解你的問題,但是讀過這個問題,答案和你的評論,它對我來說更像是你不明白答案。你有沒有嘗試這個建議?你是否有一個例子顯示,即使在聲明選項xdmp:output「default-attributes = yes」;'序列化文檔仍然沒有默認值?你是否用路徑表達式來檢查,看看在調用'validate'之後,默認值是否實際顯示在數據模型中? –