-----Ursprüngliche Nachricht----- Von: basex-talk-bounces@mailman.uni-konstanz.de [mailto:basex-talk-bounces@mailman.uni-konstanz.de] Im Auftrag von basex-talk-request@mailman.uni-konstanz.de Gesendet: Dienstag, 12. Juli 2011 12:27 An: basex-talk@mailman.uni-konstanz.de Betreff: BaseX-Talk Digest, Vol 19, Issue 14
Send BaseX-Talk mailing list submissions to basex-talk@mailman.uni-konstanz.de
To subscribe or unsubscribe via the World Wide Web, visit https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk or, via email, send a message with subject or body 'help' to basex-talk-request@mailman.uni-konstanz.de
You can reach the person managing the list at basex-talk-owner@mailman.uni-konstanz.de
When replying, please edit your Subject line so it is more specific than "Re: Contents of BaseX-Talk digest..."
Today's Topics:
1. XQST0054 ? (Burkert, Michael)
----------------------------------------------------------------------
Message: 1 Date: Tue, 12 Jul 2011 10:28:15 +0000 From: "Burkert, Michael" Michael.Burkert@gigatronik.com To: "basex-talk@mailman.uni-konstanz.de" basex-talk@mailman.uni-konstanz.de Subject: [basex-talk] XQST0054 ? Message-ID: A037E4EDAB128E42A44F20AF7E898C69017BD3@S-MEX2.GT.local Content-Type: text/plain; charset="iso-8859-1"
Hallo !
Der Fehler XQST0054 soll aussagen: A global variable depends on itself. This may be triggered by a circular variable definition.
Nun verwende ich gar keine globale Variable.
Die Aufgabe ist einfach: Ein XML-Schema (xsd) soll geparst werden und die Abh?ngigkeit der Elemente (xsd:element) in eine gew?nschte Darstellung gebracht werden. Etwa so:
<XSDBaum> <elem name="ElNameX1" min="" max=""> <elem name=" ElNameX2" min="0" max="1"/> <elem name=" ElNameX3" min="0" max="1">
Der Fehler tritt erst auf, wenn die Stelle im xml-File bearbeitet wird. Blendet man diese aus, gibt es keine Fehler-Meldung von BaseX.
Fehlermeldung mit:
if ( name($node) = "xsd:element") then erg:element($root, $node)
Keine Fehlermeldung mit:
if ( name($node) = "xsd:elementAUSBLENDEN") then erg:element($root, $node)
Die problemeatische Stelle im xml-File sieht in etwa folgenderma?en aus:
<xsd:complexType name="CTName1"> xsd:sequence <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="eLName1" type="ns:ELName1" minOccurs="1" maxOccurs="1" /> <xsd:element name="eLName2" type="ns:ELName2" minOccurs="1" maxOccurs="1" /> </xsd:choice> <xsd:choice minOccurs="0" maxOccurs="1"> <xsd:element name="eLName5" type="ns:ELName5" minOccurs="1" maxOccurs="1" /> <xsd:element name="eLName6" type="ns:ELName6" minOccurs="1" maxOccurs="1" /> </xsd:choice> </xsd:sequence> </xsd:complexType>
Die Bearbeitung stockt demzufolge nach xsd:choice, auf die Ebene xsd:element.
Die Abfrage:
declare namespace xsd="http://www.w3.org/2001/XMLSchema"; declare namespace erg="http://www.MB.org/OTXErg";
declare function erg:next( $root , $CC) { for $node in $CC return <ende>{$node}</ende> };
declare function erg:all( $root , $CC) { for $node in $CC/* return
if ( name($node) = "xsd:element") then erg:element( $root , $node)
else <endeAll>{$node}</endeAll> };
declare function erg:getCTName( $n) { let $CTNAME := substring($n/@type,5,string-length($n/@type)) return $CTNAME };
declare function erg:choice( $root , $CC) {
<choice min="{$CC/@minOccurs}" max="{$CC/@maxOccurs}">
{
for $node in $CC/* return
if ( name($node) = "xsd:element") then erg:element($root, $node)
else <endeCC nodeName="{name($node)}"></endeCC>
} </choice>
};
declare function erg:sequence( $root , $CC) { for $node in $CC/* return
if ( name($node) = "xsd:element") then erg:element( $root , $node)
else if ( name($node) = "xsd:choice") then erg:choice( $root , $node)
else if ( name($node) = "xsd:any") then ()
else <endeSEQ>{$node}</endeSEQ>
};
declare function erg:extension( $root , $CC) { for $node in $CC/* return if ( name($node) = "xsd:sequence") then erg:sequence($root, $node) else if ( name($node) = "xsd:attribute") then () else <endeEXT>{$node}</endeEXT> };
declare function erg:complexContent( $root , $CC) { for $node in $CC/* return if ( name($node) = "xsd:extension") then erg:extension($root, $node) else <endeCC>{$node}</endeCC> };
declare function erg:complexType( $root , $CTName) { for $node in $root/xsd:complexType[ @name=$CTName]/* return
if ( name($node) = "xsd:complexContent") then erg:complexContent($root, $node) else if ( name($node) = "xsd:sequence") then erg:sequence($root, $node) else if ( name($node) = "xsd:choice") then erg:choice($root, $node) else if ( name($node) = "xsd:anyAttribute") then () else if ( name($node) = "xsd:attribute") then () else if ( name($node) = "xsd:attributeGroup") then ()
else if ( name($node) = "xsd:all") then erg:all($root, $node) else <endeCT>{$node}</endeCT> };
declare function erg:element( $root , $elem ) { let $CTName := erg:getCTName($elem) return <elem name="{$elem/@name}" min="{$elem/@minOccurs}" max="{$elem/@maxOccurs}" >{erg:complexType( $root, $CTName)}</elem> };
<XSDBaum> {
let $elem := //xsd:element[@name='otx'] return erg:element( /* , $elem)
} </XSDBaum>
Mit freundlichen Gr??en Michael