2016-04-08 63 views
2

我是從如下一marklogic教程,Xquery從XSD模式獲取屬性名稱和類型?

https://developer.marklogic.com/learn/2007-04-schema

在一個場景中,在那裏我有XSD文件

<!-- tutorial.xsd --> 
<xs:schema targetNamespace="http://marklogic.com/tutorial" 
attributeFormDefault="unqualified" 
elementFormDefault="unqualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="name" type="xs:token" 
    abstract="false" nillable="false"/> 
    <xs:element name="qualification" type="xs:token" 
    abstract="false" nillable="false"/> 
    <xs:element name="born" type="xs:date" 
    abstract="false" nillable="false"/> 
    <xs:element name="dead" type="xs:date" 
    abstract="false" nillable="false"/> 
    <xs:element name="isbn" type="xs:unsignedLong" 
    abstract="false" nillable="false"/> 
    <xs:attribute name="id" type="xs:ID"/> 
    <xs:attribute name="available" type="xs:boolean"/> 
    <xs:attribute name="lang" type="xs:language"/> 
    <xs:element name="title" abstract="false" nillable="false"> 
    <xs:complexType mixed="false"> 
     <xs:simpleContent> 
    <xs:extension base="xs:token"> 
     <xs:attribute ref="lang" use="optional"/> 
    </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="library" abstract="false" nillable="false"> 
    <xs:complexType mixed="false"> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element ref="book" maxOccurs="unbounded" minOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="author" abstract="false" nillable="false"> 
    <xs:complexType mixed="false"> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element ref="name" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="born" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="dead" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute ref="id" use="optional"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="book" abstract="false" nillable="false"> 
    <xs:complexType mixed="false"> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element ref="isbn" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="title" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="author" minOccurs="0" 
    maxOccurs="unbounded"/> 
    <xs:element ref="character" minOccurs="0" 
    maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute ref="id" use="optional"/> 
     <xs:attribute ref="available" use="optional"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="character" abstract="false" nillable="false"> 
    <xs:complexType mixed="false"> 
     <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element ref="name" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="born" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="qualification" minOccurs="1" 
    maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute ref="id" use="optional"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

我想提取此XSD屬性名稱和類型。 以下是我的XQuery:

if (xdmp:database-name(xdmp:database()) ne 'Schemas') 
then error(
    QName('', 'NOT-SCHEMAS'), 'make sure the content-source is Schemas') 
else 
doc('tutorial.xsd') 
    /descendant::xs:element/@name 
(: results :) 

我得到以下幾點:

name 
qualification 
born 
dead 
isbn 
title 
library 
author 
book 
character 

,但我需要的屬性和值一起

name xs:token 
qualification xs:token 
born xs:token 

有人可以幫我改寫的XQuery完成以上輸出?

回答

6

你只需要遍歷元素,然後獲取每個元素的屬性。在下面的返回語句中,可以將它們組合成一個字符串,將它們放入地圖中,或者任何您需要使用的地方。

if (xdmp:database-name(xdmp:database()) ne 'Schemas') then 
    error(
    QName('', 'NOT-SCHEMAS'), 'make sure the content-source is Schemas') 
else 
    for $element in doc('tutorial.xsd')/descendant::xs:element 
    where $element/@name and $element/@type 
    return $element/@name || " is a " || $element/@type 

where子句要求存在名稱和類型屬性。您可以將其更改爲or以獲取其中任何一個,或者只需要$element/@name如果您需要所有名稱,則在類型不存在時執行事件。

+0

非常感謝。你讓我今天一整天都感覺很好。我是Xquery的新手。謝謝你幫我解決這個問題。 – happybayes

+0

經過仔細審查的結果..我看到有一些重複。就像我得到的空名稱和類型一樣,只是「是一個」被打印出來。我想知道如何刪除這些重複項?是否有可以使用或寫入條件來刪除空名稱和屬性的distict函數?感謝您的幫助@Dave Cassel – happybayes

+0

@mani我添加了where子句。您可以在XQuery和XSLT參考指南的[FLWOR表達式](http://docs.marklogic.com/guide/xquery/langoverview#id_11626)部分中查看有關FLWOR語句的更多信息。 –

1

@戴夫CASSE:

謝謝你幫我出去this.It工作。 我也嘗試修改XQuery並取得相同效果。可能你的代碼更好,但感覺分享我的代碼。

if (xdmp:database-name(xdmp:database()) ne 'Schemas') then 
    error(
    QName('', 'NOT-SCHEMAS'), 'make sure the content-source is Schemas') 
else 
    for $element in doc('tutorial.xsd')/descendant::xs:element 
     return if ($element/@name !="") then 
     $element/@name || "|" || $element/@type 
     else() 
(: results :) 

請檢閱。

+0

對我來說很不錯 –