view software/eXist/webapp/mpdl/_stuff/futureDev/insert.xql @ 9:1ec29fdd0db8

neue .lex Dateien f?r Normalisierung / externe Objekte update
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 22 Feb 2011 16:03:45 +0100
parents
children
line wrap: on
line source

xquery version "1.0";

module namespace mpdl-text = "http://www.mpiwg-berlin.mpg.de/ns/mpdl/text"; 

declare function mpdl-text:insert($fragment as element(), $externalObjects as element()*) {
  let $firstObject := $externalObjects[1]
  let $xmlNodeId := $firstObject/@xmlNodeId
  let $posNode := $fragment//*[@xmlNodeId = $xmlNodeId]
  let $before := $firstObject/@before
  let $boolBefore := 
    if ($before = "true")
    then true()
    else false()
  let $charPosStr := $firstObject/@charPos
  let $charPos := 
    if($charPosStr != "" and not(empty($charPosStr)))
    then number($charPosStr)
    else -1
  let $newNode := $firstObject/content
  let $size := count($externalObjects)
  let $otherObjects := 
    if ($size > 1) 
    then subsequence($externalObjects, 2, $size)
    else ()
  let $insertedFragment := mpdl-text:insert($fragment, $posNode, $boolBefore, $charPos, $newNode)
  let $result :=
    if ($size >= 1)
    then
      mpdl-text:insert($insertedFragment, $otherObjects)
    else
      $fragment
    return $result
};

declare function mpdl-text:insert($element as element(), $node, $before, $charPos, $newNode) {
  if ($element = $node and $before and $charPos = -1)
  then
  ($newNode,
  element {node-name($node)}
    {$node/@*,
     for $child in $node/node()
        return if ($child instance of element())
          then mpdl-text:insert($child, $node, $before, $charPos, $newNode)
          else $child
    })
  else if ($element = $node and not($before) and $charPos = -1)
  then
  (element {node-name($node)}
    {$node/@*,
     for $child in $node/node()
        return if ($child instance of element())
          then mpdl-text:insert($child, $node, $before, $charPos, $newNode)
          else $child
    }, $newNode)
  else if ($element = $node and $charPos >= 0)
  then
    util:parse(mpdltext:insertAtCharPos(util:serialize($node, ()), util:serialize($newNode, ()), $charPos))
  else
  element {node-name($element)}
    {$element/@*,
     for $child in $element/node()
        return if ($child instance of element())
          then mpdl-text:insert($child, $node, $before, $charPos, $newNode)
          else $child
    }
};