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