XQST0054 ?

Tuesday, 12 July 2011 · 1 message
BM
Burkert, Michael12 Jul 2011 12:28 #
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

⚡Generated with XQuery