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