diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/software/eXist/webapp/mpdl/_stuff/futureDev/insert.xql	Tue Feb 22 16:03:45 2011 +0100
@@ -0,0 +1,67 @@
+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
+    }
+};
+