I tried it, but it doesn't help in my scenario for some odd reason.

 

  _____  

From: [email protected]
[mailto:[email protected]] On Behalf Of Mark
Helmstetter
Sent: Tuesday, March 31, 2009 10:53 AM
To: General Mark Logic Developer Discussion
Cc: Paul Rooney; Crewdson, Andrew
Subject: RE: [MarkLogic Dev General] Problem preserving whitespace
inanXML-to-XML xquery transform

 

Assuming that you're using XQuery 1.0 add:

declare boundary-space preserve;

 

if you're using 0.9, add:

declare xmlspace = preserve

 

 

Cheers,

Mark

 

  _____  

From: [email protected]
[mailto:[email protected]] On Behalf Of Tim Meagher
Sent: Tuesday, March 31, 2009 2:26 PM
To: 'General Mark Logic Developer Discussion'
Cc: 'Crewdson, Andrew'; Paul Rooney
Subject: [MarkLogic Dev General] Problem preserving whitespace in
anXML-to-XML xquery transform
Importance: High

 

Hi Folks,
 
I have written an xquery transform whose purpose is to convert mixed content
that marked up in Schema A into the same mixed content but marked up using
Schema B.  It's not just a simple matter of renaming elements - so I have
implemented a recursive node-by-node approach using an algorithm similar to
the following:
 
declare function cxtn:format-source-by-node($node as node) as node()*













 
{













 
    (













 
     typeswitch ($node)













 
        case text()













 
            return (













 
                $node,













 
                if (exists($node/following-sibling::node()[1])) then













 
 
cxtn:format-source-by-node($node/following-sibling::node()[1]) 













 
                else text {""}













 
            )













 
        case element (t) (: Title :)













 
            return (













 
                element title {string($node)},













 
                if (exists($node/following-sibling::node()[1])) then













 
 
cxtn:format-source-by-node($node/following-sibling::node()[1]) 













 
                else text {""}













 
            )













 
        case element (v) (: Volume :)













 
            return (













 
                element volume {string($node)},













 
                if (exists($node/following-sibling::node()[1])) then













 
 
cxtn:format-source-by-node($node/following-sibling::node()[1])













 
                else text {""}













 
            )













 
        case element ()













 
            (: Unexpected element - tag it as text and process the next node
in the list :)













 
            return (













 
                text {string($node)},













 
                if (exists($node/following-sibling::node()[1])) then













 
 
cxtn:format-source-by-node($node/following-sibling::node()[1]}













 
                else text {""}













 
            )













 
        (: No other node types need to be processed here, so if encountered
just return a text node :)













 
        default return text {""}













 
    )













 
};













 














 
 
What I'm left with is a node list that is attached to another nodelist and
eventually wrapped in a parent element, e.g.,
 
               element node-list { cxtn:format-source-by-node(
$some-starting-node) }
               
The results work as expected, except that when a text node is encountered
that contains only a space character, it is stripped away.
 
This is not boundary space, it is space between elements, so the input:
 
               <t>Title</t> <v>Volume</v>
 
is converted to:
 
               <title>Title</title><volume>Volume</volume>
 
where the space between the 2 elements has been removed.
 
Can someone tell me how to preserve this space?
 
Thank you!
 
Tim
 
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to