2016-04-08 24 views
2

Ben bu xsd gelen özellik adını ve türünü çıkarmak istedikBir XSD şemasından özellik adı ve türü almak için Xquery?

<!-- 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 dosyası var bir senaryoda

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

, marklogic bir öğretici takip ediyordu.

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 :) 

aşağıdaki alıyorum: Aşağıdaki benim XQuery olan

name 
qualification 
born 
dead 
isbn 
title 
library 
author 
book 
character 

ama niteliği ve birlikte değerine ihtiyacımız

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

biri bana xquery için yeniden yardım edebilir Bu çıktının üstünde mi?

cevap

6

Sadece elemanlardan geçmeli, ardından her biri için özniteliklere sahip olmalısınız. Aşağıdaki iade beyanında, bunları bir dizgeye birleştirebilir, bir haritaya yerleştirebilir veya onlarla ne yapmanız gerekir. where fıkra adını ve türünü hem gerektirir

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 

mevcut olması bağlıyor. Bunlardan herhangi birini almak için bir or olarak değiştirebilir ya da türlerin bulunmadığı durumlarda tüm isimleri, olayı istiyorsanız sadece $element/@name'a ihtiyacınız vardır.

+0

Çok teşekkürler. Benim günümü yaptın. Xquery için yeniyim. Bu konuda bana yardımcı olduğunuz için teşekkür ederim. – happybayes

+0

sonucu dikkatli bir şekilde gözden geçirdikten sonra bkz. Bazı kopyalar vardır. Boş isimler ve tipler gibi sadece "bir" yazılıdır. Bu kopyaları nasıl çıkaracağımı merak ediyordum? Boş isimleri ve nitelikleri kaldırmak için bir koşulu kullanabileceğim veya yazabileceğim bir işlev var mı? Yardımınız için teşekkür ederiz @Dave Cassel – happybayes

+0

@mani Bir where cümlesi ekledim. FLHOR ifadeleri hakkında daha fazla bilgiyi XQuery ve XSLT Referans Kılavuzu'nun [FLWOR İfadeleri] (http://docs.marklogic.com/guide/xquery/langoverview#id_11626) bölümünde görebilirsiniz. –

1

@Dave Casse:

this.It çalıştı üzerine bana yardım için teşekkür ederiz. Ayrıca XQuery'yi değiştirmeyi denedim ve aynı şeyi başardım. Muhtemelen kodunuz daha iyi ama kodumu paylaştığımı hissettim.

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 :) 

Lütfen gözden geçirin.

+0

bana iyi görünüyor –

İlgili konular